This patch to the Go frontend puts nointerface methods in unique sections. A method marked nointerface may not be needed in the final link, and putting it in a unique section makes it possible for the linker to discard it if possible. Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu. Committed to mainline.
Ian
diff -r e6c55d1cd62b go/gogo.cc --- a/go/gogo.cc Fri Jan 24 14:47:58 2014 -0800 +++ b/go/gogo.cc Tue Jan 28 13:42:48 2014 -0800 @@ -4094,12 +4094,19 @@ // stack splitting for the thunk. bool disable_split_stack = this->is_recover_thunk_; + // This should go into a unique section if that has been + // requested elsewhere, or if this is a nointerface function. + // We want to put a nointerface function into a unique section + // because there is a good chance that the linker garbage + // collection can discard it. + bool in_unique_section = this->in_unique_section_ || this->nointerface_; + Btype* functype = this->type_->get_backend_fntype(gogo); this->fndecl_ = gogo->backend()->function(functype, no->get_id(gogo), asm_name, is_visible, false, is_inlinable, - disable_split_stack, - this->in_unique_section_, this->location()); + disable_split_stack, in_unique_section, + this->location()); } return this->fndecl_; }