]> granicus.if.org Git - clang/commitdiff
Don't produce an alias for a destructor if the target is weak.
authorRafael Espindola <rafael.espindola@gmail.com>
Fri, 5 Mar 2010 01:21:10 +0000 (01:21 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Fri, 5 Mar 2010 01:21:10 +0000 (01:21 +0000)
This fixes bootstrap on ELF systems :-)

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

lib/CodeGen/CGCXX.cpp

index 4889fc08f488912a313f848d75aff446482de13b..cd5d64697d156cbb293f1f41d0eb3042687e6718 100644 (file)
@@ -109,6 +109,16 @@ bool CodeGenModule::TryEmitBaseDestructorAsAlias(const CXXDestructorDecl *D) {
                                   GlobalDecl(BaseD, Dtor_Base));
 }
 
+static bool isWeakForLinker(llvm::GlobalValue::LinkageTypes Linkage) {
+  return (Linkage == llvm::GlobalValue::AvailableExternallyLinkage ||
+          Linkage == llvm::GlobalValue::WeakAnyLinkage ||
+          Linkage == llvm::GlobalValue::WeakODRLinkage ||
+          Linkage == llvm::GlobalValue::LinkOnceAnyLinkage ||
+          Linkage == llvm::GlobalValue::LinkOnceODRLinkage ||
+          Linkage == llvm::GlobalValue::CommonLinkage ||
+          Linkage == llvm::GlobalValue::ExternalWeakLinkage);
+}
+
 /// Try to emit a definition as a global alias for another definition.
 bool CodeGenModule::TryEmitDefinitionAsAlias(GlobalDecl AliasDecl,
                                              GlobalDecl TargetDecl) {
@@ -142,6 +152,12 @@ bool CodeGenModule::TryEmitDefinitionAsAlias(GlobalDecl AliasDecl,
     return true;
   }
 
+  llvm::GlobalValue::LinkageTypes TargetLinkage
+    = getFunctionLinkage(cast<FunctionDecl>(TargetDecl.getDecl()));
+
+  if (isWeakForLinker(TargetLinkage))
+    return true;
+
   // Derive the type for the alias.
   const llvm::PointerType *AliasType
     = getTypes().GetFunctionType(AliasDecl)->getPointerTo();