This patch to the Go frontend always puts descriptor wrapper functions in their own section. This lets the linker GC them. That is convenient since we must generate a wrapper for every top-level exported function, although most of them will never be used. We can only know whether they are used or not at link time. Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu. Committed to mainline and 4.8 branch.
Ian
diff -r bc1ad842d946 go/gogo.cc --- a/go/gogo.cc Wed Jul 24 15:24:12 2013 -0700 +++ b/go/gogo.cc Fri Aug 02 09:58:44 2013 -0700 @@ -3582,6 +3582,12 @@ Named_object* dno = gogo->start_function(name, new_fntype, false, loc); dno->func_value()->is_descriptor_wrapper_ = true; + // Put the wrapper in a unique section so that it can be discarded + // by the linker if it is not needed. Every top-level function will + // get a wrapper, in case there is a reference other than a call + // from some other package, but most will not need one. + dno->func_value()->set_in_unique_section(); + gogo->start_block(loc); Expression* fn = Expression::make_func_reference(no, NULL, loc);