compiler: don't export function descriptors for unexported names
authorIan Lance Taylor <ian@gcc.gnu.org>
Tue, 13 Feb 2018 21:15:41 +0000 (21:15 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 13 Feb 2018 21:15:41 +0000 (21:15 +0000)
    They aren't needed, and could potentially cause unlikely symbol name
    collisions.  Also, the runtime package's reference to main could cause
    the runtime package to define main.main..f, which could also be
    defined in the main package if it does something like fmt.Print(main).
    That will normally work but will fail with a multiple symbol
    definition error when using -static-libgo.

    Reviewed-on: https://go-review.googlesource.com/93656

From-SVN: r257637

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/expressions.cc

index ea7ae4bf16e10d1b0e118f679f743840eb7e2955..baf77e31e70cd3772ed1fd1e0ed9d49844e3fa89 100644 (file)
@@ -1,4 +1,4 @@
-7998e29eec43ede1cee925d87eef0b09da67d90b
+5d5ea2fd05dbf369ccc53c93d4846623cdea0c47
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index f50de0a500448e4d95d2d22013193179cb010521..9792faaa0e4f91af0b87bc0085ca9553a32ad97a 100644 (file)
@@ -1330,9 +1330,24 @@ Func_descriptor_expression::do_get_backend(Translate_context* context)
   else
     {
       Location bloc = Linemap::predeclared_location();
+
+      // The runtime package has hash/equality functions that are
+      // referenced by type descriptors outside of the runtime, so the
+      // function descriptors must be visible even though they are not
+      // exported.
+      bool is_exported_runtime = false;
+      if (gogo->compiling_runtime()
+         && gogo->package_name() == "runtime"
+         && (no->name().find("hash") != std::string::npos
+             || no->name().find("equal") != std::string::npos))
+       is_exported_runtime = true;
+
       bool is_hidden = ((no->is_function()
                         && no->func_value()->enclosing() != NULL)
+                       || (Gogo::is_hidden_name(no->name())
+                           && !is_exported_runtime)
                        || Gogo::is_thunk(no));
+
       bvar = context->backend()->immutable_struct(var_name, asm_name,
                                                   is_hidden, false,
                                                  btype, bloc);