r195501 - Adjust r194296 to not apply the alias replacement for externally

Rafael EspĂ­ndola rafael.espindola at gmail.com
Fri Nov 22 13:56:42 PST 2013


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 <joerg at bec.de> 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list