aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/CodeGen/CodeGenModule.cpp
diff options
context:
space:
mode:
authorDerek Schuff <dschuff@google.com>2015-05-08 16:47:21 +0000
committerDerek Schuff <dschuff@google.com>2015-05-08 16:47:21 +0000
commit2312bd38114c932374f37aa4fe6c8fefc763dbfb (patch)
treea35e7f252d2bda095536bdf987bbaadc0188809c /clang/lib/CodeGen/CodeGenModule.cpp
parent049887b252f7f7cca78ade06f03075f0df8d247c (diff)
downloadllvm-2312bd38114c932374f37aa4fe6c8fefc763dbfb.zip
llvm-2312bd38114c932374f37aa4fe6c8fefc763dbfb.tar.gz
llvm-2312bd38114c932374f37aa4fe6c8fefc763dbfb.tar.bz2
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
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r--clang/lib/CodeGen/CodeGenModule.cpp23
1 files changed, 12 insertions, 11 deletions
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;