From: Rafael Espindola <rafael.espindola@gmail.com>
Date: Thu, 10 Oct 2013 15:04:21 +0000 (+0000)
Subject: Revert "Use aliases for more constructors and destructors."
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dbd0900ac3de45ac86fe87453a946096f2f8ef2b;p=clang

Revert "Use aliases for more constructors and destructors."

This reverts commit r192300.

The change itself looks correct, but it found issues on how we handle aliases
in llvm.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@192353 91177308-0d34-0410-b5e6-96231b3b80d8
---

diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp
index d181f8d37b..7dd850be0b 100644
--- a/lib/CodeGen/CGCXX.cpp
+++ b/lib/CodeGen/CGCXX.cpp
@@ -108,17 +108,32 @@ bool CodeGenModule::TryEmitDefinitionAsAlias(GlobalDecl AliasDecl,
   // support aliases with that linkage, fail.
   llvm::GlobalValue::LinkageTypes Linkage = getFunctionLinkage(AliasDecl);
 
-  // We can't use an alias if the linkage is not valid for one.
-  if (!llvm::GlobalAlias::isValidLinkage(Linkage))
+  switch (Linkage) {
+  // We can definitely emit aliases to definitions with external linkage.
+  case llvm::GlobalValue::ExternalLinkage:
+  case llvm::GlobalValue::ExternalWeakLinkage:
+    break;
+
+  // Same with local linkage.
+  case llvm::GlobalValue::InternalLinkage:
+  case llvm::GlobalValue::PrivateLinkage:
+  case llvm::GlobalValue::LinkerPrivateLinkage:
+    break;
+
+  // We should try to support linkonce linkages.
+  case llvm::GlobalValue::LinkOnceAnyLinkage:
+  case llvm::GlobalValue::LinkOnceODRLinkage:
     return true;
 
+  // Other linkages will probably never be supported.
+  default:
+    return true;
+  }
+
   llvm::GlobalValue::LinkageTypes TargetLinkage
     = getFunctionLinkage(TargetDecl);
 
-  // Don't create an strong alias to a linker weak symbol. If the linker
-  // decides to drop the symbol, the alias would become undefined.
-  if (llvm::GlobalValue::isWeakForLinker(TargetLinkage) &&
-      !llvm::GlobalValue::isWeakForLinker(Linkage))
+  if (llvm::GlobalValue::isWeakForLinker(TargetLinkage))
     return true;
 
   // Derive the type for the alias.
diff --git a/test/CodeGenCXX/destructors.cpp b/test/CodeGenCXX/destructors.cpp
index 0be188b29c..f2c6f212ad 100644
--- a/test/CodeGenCXX/destructors.cpp
+++ b/test/CodeGenCXX/destructors.cpp
@@ -6,16 +6,10 @@
 // CHECK: @_ZN5test11OD2Ev = alias {{.*}} @_ZN5test11AD2Ev
 // CHECK: @_ZN5test11SD2Ev = alias bitcast {{.*}} @_ZN5test11AD2Ev
 
-// CHECK: @_ZN6test106foobarIvEC1Ev = alias weak_odr void (%"struct.test10::foobar"*)* @_ZN6test106foobarIvEC2Ev
-
-// CHECK: @_ZN6test116foobarIvEC1Ev = alias linkonce_odr void (%"struct.test11::foobar"*)* @_ZN6test116foobarIvEC2Ev
-
 // CHECK: @_ZN5test312_GLOBAL__N_11DD1Ev = alias internal {{.*}} @_ZN5test312_GLOBAL__N_11DD2Ev
 // CHECK: @_ZN5test312_GLOBAL__N_11DD2Ev = alias internal bitcast {{.*}} @_ZN5test312_GLOBAL__N_11CD2Ev
 // CHECK: @_ZN5test312_GLOBAL__N_11CD1Ev = alias internal {{.*}} @_ZN5test312_GLOBAL__N_11CD2Ev
 
-// CHECK: @_ZN6PR752617allocator_derivedD1Ev = alias linkonce_odr void (%"struct.PR7526::allocator_derived"*)* @_ZN6PR752617allocator_derivedD2Ev
-
 struct A {
   int a;
   
@@ -50,6 +44,9 @@ namespace PR7526 {
   // CHECK: call void @__cxa_call_unexpected
   allocator::~allocator() throw() { foo(); }
 
+  // CHECK-LABEL: define linkonce_odr void @_ZN6PR752617allocator_derivedD1Ev(%"struct.PR7526::allocator_derived"* %this) unnamed_addr
+  // CHECK-NOT: call void @__cxa_call_unexpected
+  // CHECK:     }
   void foo() {
     allocator_derived ad;
   }
@@ -422,25 +419,3 @@ namespace test9 {
   // CHECK: ret void
 
   // CHECK: attributes [[NUW]] = {{[{].*}} nounwind {{.*[}]}}
-
-
-namespace test10 {
-  template<typename T>
-  struct foobar {
-    foobar() {
-    }
-  };
-
-  template struct foobar<void>;
-}
-
-namespace test11 {
-  void g();
-  template<typename T>
-  struct foobar {
-    foobar() {
-      g();
-    }
-  };
-  foobar<void> x;
-}