diff options
| author | David Majnemer <david.majnemer@gmail.com> | 2014-07-13 05:19:56 +0000 |
|---|---|---|
| committer | David Majnemer <david.majnemer@gmail.com> | 2014-07-13 05:19:56 +0000 |
| commit | b2615aa44d0cabd821b7afe5acdc847af9937c76 (patch) | |
| tree | e966034f9df7a73558b796f2bb13c8cbcb1337ef /clang/lib/CodeGen | |
| parent | ebc741168bc0bd25666282979b318370477bd405 (diff) | |
| download | bcm5719-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.cpp | 10 |
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 |

