+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
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 \
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) $<
--- /dev/null
+/* 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
merge done from the gofrontend repository.
#include "go-system.h"
-#include "sha1.h"
-
+#include "go-sha1.h"
#include "go-c.h"
#include "gogo.h"
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.
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()
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);
}
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.
#include "string-dump.h"
-struct sha1_ctx;
+class Go_sha1_helper;
class Gogo;
class Import_init;
class Bindings;
void
write_and_sum_bytes(const char*, size_t);
- // The checksum.
- sha1_ctx* checksum_;
+ // The checksum helper.
+ Go_sha1_helper* sha1_helper_;
};
Export(Stream*);
--- /dev/null
+// 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)