This patch by Than McIntosh adds an abstraction layer for the SHA1 checksum code in the Go frontend. This breaks a dependency of the gofrontend on libiberty, and thus adds another separation between the gofrontend code and GCC proper. Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu. Committed to mainline.
Ian 2016-09-09 Than McIntosh <th...@google.com> * go-sha1.cc: New file. * Make-lang.in (GO_OBJS): Add go/go-sha1.o. (CFLAGS-go/go-sha1.o): New variable.
Index: gcc/go/Make-lang.in =================================================================== --- gcc/go/Make-lang.in (revision 238653) +++ gcc/go/Make-lang.in (working copy) @@ -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 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) $< Index: gcc/go/go-sha1.cc =================================================================== --- gcc/go/go-sha1.cc (revision 0) +++ gcc/go/go-sha1.cc (working copy) @@ -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(); +} Index: gcc/go/gofrontend/MERGE =================================================================== --- gcc/go/gofrontend/MERGE (revision 240049) +++ gcc/go/gofrontend/MERGE (working copy) @@ -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. Index: gcc/go/gofrontend/export.cc =================================================================== --- gcc/go/gofrontend/export.cc (revision 239708) +++ gcc/go/gofrontend/export.cc (working copy) @@ -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 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(cons 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. Index: gcc/go/gofrontend/export.h =================================================================== --- gcc/go/gofrontend/export.h (revision 239708) +++ gcc/go/gofrontend/export.h (working copy) @@ -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*); Index: gcc/go/gofrontend/go-sha1.h =================================================================== --- gcc/go/gofrontend/go-sha1.h (revision 0) +++ gcc/go/gofrontend/go-sha1.h (working copy) @@ -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)