Commit a2f5a782 by Ian Lance Taylor

compiler: don't export function descriptors for unexported names

    
    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
parent 4155fafc
7998e29eec43ede1cee925d87eef0b09da67d90b 5d5ea2fd05dbf369ccc53c93d4846623cdea0c47
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.
...@@ -1330,9 +1330,24 @@ Func_descriptor_expression::do_get_backend(Translate_context* context) ...@@ -1330,9 +1330,24 @@ Func_descriptor_expression::do_get_backend(Translate_context* context)
else else
{ {
Location bloc = Linemap::predeclared_location(); 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() bool is_hidden = ((no->is_function()
&& no->func_value()->enclosing() != NULL) && no->func_value()->enclosing() != NULL)
|| (Gogo::is_hidden_name(no->name())
&& !is_exported_runtime)
|| Gogo::is_thunk(no)); || Gogo::is_thunk(no));
bvar = context->backend()->immutable_struct(var_name, asm_name, bvar = context->backend()->immutable_struct(var_name, asm_name,
is_hidden, false, is_hidden, false,
btype, bloc); btype, bloc);
......
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