r194296 - Use rauw for all discardable aliases, not just linkonce_odr.

Rafael EspĂ­ndola rafael.espindola at gmail.com
Fri Nov 22 10:34:05 PST 2013


> Right now ~moneypunct_byname() is attributed with __always_inline__, meaning it should never be part of libc++.dylib.  That being said, moneypunct_byname is also extern templates for the required instantiations, and there is a poorly understood bad interaction between __always_inline__ and extern template.  That could very well be at the base of this problem here.
>
> If I'm remembering correctly, it goes something like:  If something is marked __always_inline__, it doesn't get outlined when the templated is explicitly instantiated into a source (which I believe is correct behavior).  However when the client needs an __always_inline__ and the type is marked extern template, the client assumes it can find the symbol outlined elsewhere (which I believe is incorrect behavior).

No, code is produce when we do an explicit template instantiation.

template<typename T>
struct foo {
  __attribute__((always_inline))void f() {
  }
};
template struct foo<int>;

produces:

define weak_odr void @_ZN3fooIiE1fEv

with a alwaysinline attribute.

I think we have to do this, since someone can take a function pointer
to f, in which case always_inline fails. We will avoid the
optimization that made the problem more visible for now, but we should
probably figure out a better way to get the desired effect in libc++.



>
> I may be remembering incorrectly...
>
> Howard
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list