From dbd0900ac3de45ac86fe87453a946096f2f8ef2b Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 10 Oct 2013 15:04:21 +0000 Subject: [PATCH] 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 --- lib/CodeGen/CGCXX.cpp | 27 +++++++++++++++++++++------ test/CodeGenCXX/destructors.cpp | 31 +++---------------------------- 2 files changed, 24 insertions(+), 34 deletions(-) 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 - struct foobar { - foobar() { - } - }; - - template struct foobar; -} - -namespace test11 { - void g(); - template - struct foobar { - foobar() { - g(); - } - }; - foobar x; -} -- 2.40.0