Bill, can you pull this into 3.4? It just disables an optimization as as the comment says fixes building libc++'s locale.
On 22 November 2013 16:34, Joerg Sonnenberger <[email protected]> wrote: > Author: joerg > Date: Fri Nov 22 15:34:35 2013 > New Revision: 195501 > > URL: http://llvm.org/viewvc/llvm-project?rev=195501&view=rev > Log: > Adjust r194296 to not apply the alias replacement for externally > available always-inline functions. This breaks libc++'s locale > implementation. Code generation for this case should be fixed, but this > is a stop gap fix for clang 3.4. > > Modified: > cfe/trunk/lib/CodeGen/CGCXX.cpp > cfe/trunk/test/CodeGenCXX/ctor-dtor-alias.cpp > > Modified: cfe/trunk/lib/CodeGen/CGCXX.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCXX.cpp?rev=195501&r1=195500&r2=195501&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGCXX.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGCXX.cpp Fri Nov 22 15:34:35 2013 > @@ -140,7 +140,14 @@ bool CodeGenModule::TryEmitDefinitionAsA > > // Instead of creating as alias to a linkonce_odr, replace all of the uses > // of the aliassee. > - if (llvm::GlobalValue::isDiscardableIfUnused(Linkage)) { > + if (llvm::GlobalValue::isDiscardableIfUnused(Linkage) && > + (TargetLinkage != llvm::GlobalValue::AvailableExternallyLinkage || > + !TargetDecl.getDecl()->hasAttr<AlwaysInlineAttr>())) { > + // FIXME: An extern template instanciation will create functions with > + // linkage "AvailableExternally". In libc++, some classes also define > + // members with attribute "AlwaysInline" and expect no reference to > + // be generated. It is desirable to reenable this optimisation after > + // corresponding LLVM changes. > Replacements[MangledName] = Aliasee; > return false; > } > > Modified: cfe/trunk/test/CodeGenCXX/ctor-dtor-alias.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/ctor-dtor-alias.cpp?rev=195501&r1=195500&r2=195501&view=diff > ============================================================================== > --- cfe/trunk/test/CodeGenCXX/ctor-dtor-alias.cpp (original) > +++ cfe/trunk/test/CodeGenCXX/ctor-dtor-alias.cpp Fri Nov 22 15:34:35 2013 > @@ -1,6 +1,9 @@ > // RUN: %clang_cc1 %s -triple x86_64-linux -emit-llvm -o - > -mconstructor-aliases -O1 -disable-llvm-optzns | FileCheck %s > // RUN: %clang_cc1 %s -triple x86_64-linux -emit-llvm -o - > -mconstructor-aliases | FileCheck --check-prefix=NOOPT %s > > +// RUN: %clang_cc1 -cc1 -triple x86_64--netbsd -emit-llvm \ > +// RUN: -mconstructor-aliases -O2 %s -o - | FileCheck > --check-prefix=CHECK-RAUW %s > + > namespace test1 { > // test that we don't produce an alias when the destructor is weak_odr. The > // reason to avoid it that another TU might have no explicit template > @@ -129,3 +132,32 @@ namespace test8 { > struct zed : public bar {}; > zed foo; > } > + > +// CHECK-RAUW: @_ZTV1C = linkonce_odr unnamed_addr constant [4 x i8*] > [{{[^@]*}}@_ZTI1C {{[^@]*}}@_ZN1CD2Ev {{[^@]*}}@_ZN1CD0Ev {{[^@]*}}] > +// r194296 replaced C::~C with B::~B without emitting the later. > + > +class A { > +public: > + A(int); > + virtual ~A(); > +}; > + > +template <class> > +class B : A { > +public: > + B() > + : A(0) { > + } > + __attribute__((always_inline)) ~B() { > + } > +}; > + > +extern template class B<char>; > + > +class C : B<char> { > +}; > + > +void > +fn1() { > + new C; > +} > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
