diff options
| author | Hans Wennborg <hans@hanshq.net> | 2016-02-10 22:18:37 +0000 |
|---|---|---|
| committer | Hans Wennborg <hans@hanshq.net> | 2016-02-10 22:18:37 +0000 |
| commit | 8fab56e0dcf48d545a8aae1eae90b4f3d3f2231b (patch) | |
| tree | 806ef9716bc5c8762bb37ce5f499ff1d439cfdc0 /clang/lib/CodeGen | |
| parent | 4022d529594dea28ef11ae78c214cf37f139f053 (diff) | |
| download | bcm5719-llvm-8fab56e0dcf48d545a8aae1eae90b4f3d3f2231b.tar.gz bcm5719-llvm-8fab56e0dcf48d545a8aae1eae90b4f3d3f2231b.zip | |
Revert r260388 "[MS ABI] Never reference dllimport'd vtables"
This caused the compiler to fail with "invalid linkage type
for global declaration" (PR26569).
llvm-svn: 260449
Diffstat (limited to 'clang/lib/CodeGen')
| -rw-r--r-- | clang/lib/CodeGen/MicrosoftCXXABI.cpp | 15 |
1 files changed, 4 insertions, 11 deletions
diff --git a/clang/lib/CodeGen/MicrosoftCXXABI.cpp b/clang/lib/CodeGen/MicrosoftCXXABI.cpp index 2567aa92f25..2870a91dd5f 100644 --- a/clang/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/clang/lib/CodeGen/MicrosoftCXXABI.cpp @@ -1673,16 +1673,7 @@ llvm::GlobalVariable *MicrosoftCXXABI::getAddrOfVTable(const CXXRecordDecl *RD, SmallString<256> VFTableName; mangleVFTableName(getMangleContext(), RD, VFPtr, VFTableName); - // Classes marked __declspec(dllimport) need vftables generated on the - // import-side in order to support features like constexpr. No other - // translation unit relies on the emission of the local vftable, translation - // units are expected to generate them as needed. - // - // Because of this unique behavior, we maintain this logic here instead of - // getVTableLinkage. - llvm::GlobalValue::LinkageTypes VFTableLinkage = - RD->hasAttr<DLLImportAttr>() ? llvm::GlobalValue::LinkOnceODRLinkage - : CGM.getVTableLinkage(RD); + llvm::GlobalValue::LinkageTypes VFTableLinkage = CGM.getVTableLinkage(RD); bool VFTableComesFromAnotherTU = llvm::GlobalValue::isAvailableExternallyLinkage(VFTableLinkage) || llvm::GlobalValue::isExternalLinkage(VFTableLinkage); @@ -1755,7 +1746,9 @@ llvm::GlobalVariable *MicrosoftCXXABI::getAddrOfVTable(const CXXRecordDecl *RD, if (C) VTable->setComdat(C); - if (RD->hasAttr<DLLExportAttr>()) + if (RD->hasAttr<DLLImportAttr>()) + VFTable->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass); + else if (RD->hasAttr<DLLExportAttr>()) VFTable->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass); VFTablesMap[ID] = VFTable; |

