summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2014-07-13 05:19:56 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2014-07-13 05:19:56 +0000
commitb2615aa44d0cabd821b7afe5acdc847af9937c76 (patch)
treee966034f9df7a73558b796f2bb13c8cbcb1337ef /clang/lib/CodeGen
parentebc741168bc0bd25666282979b318370477bd405 (diff)
downloadbcm5719-llvm-b2615aa44d0cabd821b7afe5acdc847af9937c76.tar.gz
bcm5719-llvm-b2615aa44d0cabd821b7afe5acdc847af9937c76.zip
MS ABI: Stick internal vftables in a comdat if they have RTTI data
Previously, we would have a private backing variable and an internal alias pointing at it. However, -fdata-sections only fires if a global variable has non-private linkage. This means that an unreferenced vftable wouldn't get discarded, bloating the object file. Instead, stick the backing variable in a comdat even if the alias has internal linkage. This will allow the linker to drop the vftable if it is unused. llvm-svn: 212901
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r--clang/lib/CodeGen/MicrosoftCXXABI.cpp10
1 files changed, 4 insertions, 6 deletions
diff --git a/clang/lib/CodeGen/MicrosoftCXXABI.cpp b/clang/lib/CodeGen/MicrosoftCXXABI.cpp
index 52438644baa..41b7574e34c 100644
--- a/clang/lib/CodeGen/MicrosoftCXXABI.cpp
+++ b/clang/lib/CodeGen/MicrosoftCXXABI.cpp
@@ -1325,15 +1325,13 @@ llvm::GlobalVariable *MicrosoftCXXABI::getAddrOfVTable(const CXXRecordDecl *RD,
if (llvm::GlobalValue::isAvailableExternallyLinkage(VFTableLinkage)) {
// AvailableExternally implies that we grabbed the data from another
// executable. No need to stick the alias in a Comdat.
- } else if (llvm::GlobalValue::isLocalLinkage(VFTableLinkage)) {
- // If it's local, it means that the virtual function table can't be
- // referenced in another translation unit. No need to stick the alias
- // in a Comdat.
- } else if (llvm::GlobalValue::isWeakODRLinkage(VFTableLinkage) ||
+ } else if (llvm::GlobalValue::isInternalLinkage(VFTableLinkage) ||
+ llvm::GlobalValue::isWeakODRLinkage(VFTableLinkage) ||
llvm::GlobalValue::isLinkOnceODRLinkage(VFTableLinkage)) {
// The alias is going to be dropped into a Comdat, no need to make it
// weak.
- VFTableLinkage = llvm::GlobalValue::ExternalLinkage;
+ if (!llvm::GlobalValue::isInternalLinkage(VFTableLinkage))
+ VFTableLinkage = llvm::GlobalValue::ExternalLinkage;
llvm::Comdat *C =
CGM.getModule().getOrInsertComdat(VFTable->getName());
// We must indicate which VFTable is larger to support linking between
OpenPOWER on IntegriCloud