Skip to content

Commit

Permalink
Revert "Use aliases for more constructors and destructors."
Browse files Browse the repository at this point in the history
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
  • Loading branch information
espindola committed Oct 10, 2013
1 parent 58b6ccf commit dbd0900
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 34 deletions.
27 changes: 21 additions & 6 deletions lib/CodeGen/CGCXX.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
31 changes: 3 additions & 28 deletions test/CodeGenCXX/destructors.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}

0 comments on commit dbd0900

Please sign in to comment.