compiler: add abstraction layer for sha1 checksums.

Add new interface for the front end code to use when computing SHA1
    checksums; the intent is to allow the different implementation in
    different back ends.
    
    No change in functionality for gccgo; this is an enabling change to
    permit the front end to be used with other back ends (e.g. LLVM).
    
    Reviewed-on: https://go-review.googlesource.com/28833

	* go-sha1.cc: New file.
	* Make-lang.in (GO_OBJS): Add go/go-sha1.o.
	(CFLAGS-go/go-sha1.o): New variable.

From-SVN: r240053
This commit is contained in:
Than McIntosh 2016-09-09 18:27:42 +00:00 committed by Ian Lance Taylor
parent e81e83d047
commit 34144b6ec0
7 changed files with 124 additions and 18 deletions

View File

@ -1,3 +1,9 @@
2016-09-09 Than McIntosh <thanm@google.com>
* go-sha1.cc: New file.
* Make-lang.in (GO_OBJS): Add go/go-sha1.o.
(CFLAGS-go/go-sha1.o): New variable.
2016-09-01 Martin Sebor <msebor@redhat.com>
* gofrontend/expressions.cc: Increase buffer size to guarantee

View File

@ -59,6 +59,7 @@ GO_OBJS = \
go/go-lang.o \
go/go-linemap.o \
go/go-optimize.o \
go/go-sha1.o \
go/go.o \
go/gogo.o \
go/import.o \
@ -225,6 +226,7 @@ GOINCLUDES = -I $(srcdir)/go -I $(srcdir)/go/gofrontend
CFLAGS-go/go-gcc.o += $(GOINCLUDES)
CFLAGS-go/go-linemap.o += $(GOINCLUDES)
CFLAGS-go/go-sha1.o += $(GOINCLUDES)
go/%.o: go/gofrontend/%.cc
$(COMPILE) $(GOINCLUDES) $<

71
gcc/go/go-sha1.cc Normal file
View File

@ -0,0 +1,71 @@
/* go-sha1.cc -- Go frontend interface to gcc backend.
Copyright (C) 2016 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
#include "go-sha1.h"
#include "sha1.h"
class Gcc_sha1_helper : public Go_sha1_helper
{
public:
Gcc_sha1_helper() : ctx_(new sha1_ctx) { sha1_init_ctx(this->ctx_); }
~Gcc_sha1_helper();
// Incorporate 'len' bytes from 'buffer' into checksum.
void
process_bytes(const void* buffer, size_t len);
// Finalize checksum and return in the form of a string.
std::string
finish();
private:
sha1_ctx *ctx_;
};
Gcc_sha1_helper::~Gcc_sha1_helper()
{
delete ctx_;
}
void
Gcc_sha1_helper::process_bytes(const void* buffer, size_t len)
{
sha1_process_bytes(buffer, len, this->ctx_);
}
std::string
Gcc_sha1_helper::finish()
{
// Use a union to provide the required alignment.
union
{
char checksum[checksum_len];
long align;
} u;
sha1_finish_ctx(this->ctx_, u.checksum);
return std::string(u.checksum, checksum_len);
}
Go_sha1_helper*
go_create_sha1_helper()
{
return new Gcc_sha1_helper();
}

View File

@ -1,4 +1,4 @@
4de301275dfed034a1dd9dff3d1af8643ee5cb4b
2022ddc85f812b6990b72c7e95b8207e07ac8984
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.

View File

@ -6,8 +6,7 @@
#include "go-system.h"
#include "sha1.h"
#include "go-sha1.h"
#include "go-c.h"
#include "gogo.h"
@ -40,6 +39,7 @@ const int Export::checksum_len;
Export::Export(Stream* stream)
: stream_(stream), type_refs_(), type_index_(1), packages_()
{
go_assert(Export::checksum_len == Go_sha1_helper::checksum_len);
}
// A functor to sort Named_object pointers by name.
@ -686,9 +686,8 @@ Export::register_builtin_type(Gogo* gogo, const char* name, Builtin_code code)
Export::Stream::Stream()
{
this->checksum_ = new sha1_ctx;
memset(this->checksum_, 0, sizeof(sha1_ctx));
sha1_init_ctx(this->checksum_);
this->sha1_helper_ = go_create_sha1_helper();
go_assert(this->sha1_helper_ != NULL);
}
Export::Stream::~Stream()
@ -701,7 +700,7 @@ Export::Stream::~Stream()
void
Export::Stream::write_and_sum_bytes(const char* bytes, size_t length)
{
sha1_process_bytes(bytes, length, this->checksum_);
this->sha1_helper_->process_bytes(bytes, length);
this->do_write(bytes, length);
}
@ -710,14 +709,9 @@ Export::Stream::write_and_sum_bytes(const char* bytes, size_t length)
std::string
Export::Stream::checksum()
{
// Use a union to provide the required alignment.
union
{
char checksum[Export::checksum_len];
long align;
} u;
sha1_finish_ctx(this->checksum_, u.checksum);
return std::string(u.checksum, Export::checksum_len);
std::string rval = this->sha1_helper_->finish();
delete this->sha1_helper_;
return rval;
}
// Write the checksum string to the export data.

View File

@ -9,7 +9,7 @@
#include "string-dump.h"
struct sha1_ctx;
class Go_sha1_helper;
class Gogo;
class Import_init;
class Bindings;
@ -109,8 +109,8 @@ class Export : public String_dump
void
write_and_sum_bytes(const char*, size_t);
// The checksum.
sha1_ctx* checksum_;
// The checksum helper.
Go_sha1_helper* sha1_helper_;
};
Export(Stream*);

View File

@ -0,0 +1,33 @@
// go-sha1.h -- GCC specific sha1 checksum utilities. -*- C++ -*-
// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
#ifndef GO_SHA1_H
#define GO_SHA1_H
#include "go-system.h"
//
// Interface class for computation of SHA1 checksums. Front end requests
// one of these objects from the back end to use for computing
// checksums (each back end tends to have a different SHA1 implementation).
// Back ends are expected to create a new class that derives from this
// one containing an implementation.
//
class Go_sha1_helper
{
public:
virtual ~Go_sha1_helper() { }
virtual void process_bytes(const void* buffer, size_t len) = 0;
virtual std::string finish() = 0;
static const int checksum_len = 20;
};
// Call to create and return a new sha1 helper (this routine defined
// by the backend). Caller is responsible for deletion.
extern Go_sha1_helper* go_create_sha1_helper();
#endif // !defined(GO_SHA1_H)