Commit 34144b6e by Than McIntosh Committed by Ian Lance Taylor

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
parent e81e83d0
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> 2016-09-01 Martin Sebor <msebor@redhat.com>
* gofrontend/expressions.cc: Increase buffer size to guarantee * gofrontend/expressions.cc: Increase buffer size to guarantee
......
...@@ -59,6 +59,7 @@ GO_OBJS = \ ...@@ -59,6 +59,7 @@ GO_OBJS = \
go/go-lang.o \ go/go-lang.o \
go/go-linemap.o \ go/go-linemap.o \
go/go-optimize.o \ go/go-optimize.o \
go/go-sha1.o \
go/go.o \ go/go.o \
go/gogo.o \ go/gogo.o \
go/import.o \ go/import.o \
...@@ -225,6 +226,7 @@ GOINCLUDES = -I $(srcdir)/go -I $(srcdir)/go/gofrontend ...@@ -225,6 +226,7 @@ GOINCLUDES = -I $(srcdir)/go -I $(srcdir)/go/gofrontend
CFLAGS-go/go-gcc.o += $(GOINCLUDES) CFLAGS-go/go-gcc.o += $(GOINCLUDES)
CFLAGS-go/go-linemap.o += $(GOINCLUDES) CFLAGS-go/go-linemap.o += $(GOINCLUDES)
CFLAGS-go/go-sha1.o += $(GOINCLUDES)
go/%.o: go/gofrontend/%.cc go/%.o: go/gofrontend/%.cc
$(COMPILE) $(GOINCLUDES) $< $(COMPILE) $(GOINCLUDES) $<
......
/* 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();
}
4de301275dfed034a1dd9dff3d1af8643ee5cb4b 2022ddc85f812b6990b72c7e95b8207e07ac8984
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -6,8 +6,7 @@ ...@@ -6,8 +6,7 @@
#include "go-system.h" #include "go-system.h"
#include "sha1.h" #include "go-sha1.h"
#include "go-c.h" #include "go-c.h"
#include "gogo.h" #include "gogo.h"
...@@ -40,6 +39,7 @@ const int Export::checksum_len; ...@@ -40,6 +39,7 @@ const int Export::checksum_len;
Export::Export(Stream* stream) Export::Export(Stream* stream)
: stream_(stream), type_refs_(), type_index_(1), packages_() : 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. // 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) ...@@ -686,9 +686,8 @@ Export::register_builtin_type(Gogo* gogo, const char* name, Builtin_code code)
Export::Stream::Stream() Export::Stream::Stream()
{ {
this->checksum_ = new sha1_ctx; this->sha1_helper_ = go_create_sha1_helper();
memset(this->checksum_, 0, sizeof(sha1_ctx)); go_assert(this->sha1_helper_ != NULL);
sha1_init_ctx(this->checksum_);
} }
Export::Stream::~Stream() Export::Stream::~Stream()
...@@ -701,7 +700,7 @@ Export::Stream::~Stream() ...@@ -701,7 +700,7 @@ Export::Stream::~Stream()
void void
Export::Stream::write_and_sum_bytes(const char* bytes, size_t length) 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); this->do_write(bytes, length);
} }
...@@ -710,14 +709,9 @@ Export::Stream::write_and_sum_bytes(const char* bytes, size_t length) ...@@ -710,14 +709,9 @@ Export::Stream::write_and_sum_bytes(const char* bytes, size_t length)
std::string std::string
Export::Stream::checksum() Export::Stream::checksum()
{ {
// Use a union to provide the required alignment. std::string rval = this->sha1_helper_->finish();
union delete this->sha1_helper_;
{ return rval;
char checksum[Export::checksum_len];
long align;
} u;
sha1_finish_ctx(this->checksum_, u.checksum);
return std::string(u.checksum, Export::checksum_len);
} }
// Write the checksum string to the export data. // Write the checksum string to the export data.
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
#include "string-dump.h" #include "string-dump.h"
struct sha1_ctx; class Go_sha1_helper;
class Gogo; class Gogo;
class Import_init; class Import_init;
class Bindings; class Bindings;
...@@ -109,8 +109,8 @@ class Export : public String_dump ...@@ -109,8 +109,8 @@ class Export : public String_dump
void void
write_and_sum_bytes(const char*, size_t); write_and_sum_bytes(const char*, size_t);
// The checksum. // The checksum helper.
sha1_ctx* checksum_; Go_sha1_helper* sha1_helper_;
}; };
Export(Stream*); Export(Stream*);
......
// 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)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment