[llvm] r189954 - Revert "Add r159136 back now that pr13124 has been fixed."
Nick Lewycky
nicholas at mxc.ca
Thu Sep 5 00:59:07 PDT 2013
Rafael EspĂndola wrote:
>>> Say we have a "linkonce_odr unnamed_addr" in two translation units:
>>> * In TU 1 this optimization kicks in and makes it hidden.
>>> * In TU 2 it gets const merged with a constant that is *not* unnamed_addr,
>>> resulting in a non unnamed_addr constant with default visibility.
>>
>>
>> That shouldn't happen. A hidden symbol doesn't get merged with anything
>> outside its TU, right? I think you can just rename it.
>
> hidden, not internal, so it does get merged.
>
> But yes, one way to handle this without LTO is to make the
> linkonce_odr symbol internal instead of hidden. This introduces a bit
> of code duplication, but can be profitable if the function is really
> small.
What I'd like is a guarantee that code (incorrectly) relying the
presence of an implicit instantiation in another TU will not link.
Nick
> Wit gcc 4.8 when compiling
>
> ------------------------------
> void f();
> struct foo {
> typedef void (foo::*mptr)();
> virtual mptr zed();
> void bar() {
> }
> __attribute__((noinline)) void baz() {
> f();
> }
> virtual void bah() {
> };
> };
> foo::mptr foo::zed() {
> baz();
> return&foo::bar;
> }
> -------------------------------------
>
> I get an internal _ZN3foo3bazEv.isra.0 function which effective
> implements this optimization.
>
>
>> Nick
>>
>
> Cheers,
> Rafael
>
More information about the llvm-commits
mailing list