Skip to content

Commit

Permalink
compiler: don't export function descriptors for unexported names
Browse files Browse the repository at this point in the history
    
    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


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@257637 138bc75d-0d04-0410-961f-82ee72b054a4
  • Loading branch information
ian committed Feb 13, 2018
1 parent f88cc9d commit 80efb81
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 1 deletion.
2 changes: 1 addition & 1 deletion gcc/go/gofrontend/MERGE
Original file line number Diff line number Diff line change
@@ -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.
15 changes: 15 additions & 0 deletions gcc/go/gofrontend/expressions.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 80efb81

Please sign in to comment.