[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