From 2312bd38114c932374f37aa4fe6c8fefc763dbfb Mon Sep 17 00:00:00 2001 From: Derek Schuff Date: Fri, 8 May 2015 16:47:21 +0000 Subject: Do not emit thunks with available_externally linkage in comdats Functions with available_externally linkage will not be emitted to object files (they will just be undefined symbols), so it does not make sense to put them in comdats. Creates a second overload of maybeSetTrivialComdat that uses the GlobalObject instead of the Decl, and uses that in several places that had the faulty logic. Differential Revision: http://reviews.llvm.org/D9580 llvm-svn: 236879 --- clang/lib/CodeGen/CodeGenModule.cpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'clang/lib/CodeGen/CodeGenModule.cpp') diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index d75dcd2..b3d7b5d 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -1298,8 +1298,7 @@ llvm::Constant *CodeGenModule::GetAddrOfUuidDescriptor( auto *GV = new llvm::GlobalVariable( getModule(), Init->getType(), /*isConstant=*/true, llvm::GlobalValue::LinkOnceODRLinkage, Init, Name); - if (supportsCOMDAT()) - GV->setComdat(TheModule.getOrInsertComdat(GV->getName())); + maybeSetTrivialComdat(*GV); return GV; } @@ -1850,9 +1849,7 @@ CodeGenModule::CreateOrReplaceCXXRuntimeVariable(StringRef Name, OldGV->eraseFromParent(); } - if (supportsCOMDAT() && GV->isWeakForLinker() && - !GV->hasAvailableExternallyLinkage()) - GV->setComdat(TheModule.getOrInsertComdat(GV->getName())); + maybeSetTrivialComdat(*GV); return GV; } @@ -1985,6 +1982,14 @@ void CodeGenModule::maybeSetTrivialComdat(const Decl &D, GO.setComdat(TheModule.getOrInsertComdat(GO.getName())); } +void CodeGenModule::maybeSetTrivialComdat(llvm::GlobalObject &GO) { + if (!supportsCOMDAT()) + return; + if (GO.isWeakForLinker() && !GO.hasAvailableExternallyLinkage()) { + GO.setComdat(getModule().getOrInsertComdat(GO.getName())); + } +} + void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) { llvm::Constant *Init = nullptr; QualType ASTTy = D->getType(); @@ -2924,10 +2929,7 @@ GenerateStringLiteral(llvm::Constant *C, llvm::GlobalValue::LinkageTypes LT, nullptr, llvm::GlobalVariable::NotThreadLocal, AddrSpace); GV->setAlignment(Alignment); GV->setUnnamedAddr(true); - if (GV->isWeakForLinker()) { - assert(CGM.supportsCOMDAT() && "Only COFF uses weak string literals"); - GV->setComdat(M.getOrInsertComdat(GV->getName())); - } + CGM.maybeSetTrivialComdat(*GV); return GV; } @@ -3109,8 +3111,7 @@ llvm::Constant *CodeGenModule::GetAddrOfGlobalTemporary( setGlobalVisibility(GV, VD); GV->setAlignment( getContext().getTypeAlignInChars(MaterializedType).getQuantity()); - if (supportsCOMDAT() && GV->isWeakForLinker()) - GV->setComdat(TheModule.getOrInsertComdat(GV->getName())); + maybeSetTrivialComdat(*GV); if (VD->getTLSKind()) setTLSMode(GV, *VD); Slot = GV; -- cgit v1.1