summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorHans Wennborg <hans@hanshq.net>2016-02-10 22:18:37 +0000
committerHans Wennborg <hans@hanshq.net>2016-02-10 22:18:37 +0000
commit8fab56e0dcf48d545a8aae1eae90b4f3d3f2231b (patch)
tree806ef9716bc5c8762bb37ce5f499ff1d439cfdc0 /clang/lib
parent4022d529594dea28ef11ae78c214cf37f139f053 (diff)
downloadbcm5719-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')
-rw-r--r--clang/lib/AST/MicrosoftMangle.cpp5
-rw-r--r--clang/lib/AST/VTableBuilder.cpp1
-rw-r--r--clang/lib/CodeGen/MicrosoftCXXABI.cpp15
3 files changed, 6 insertions, 15 deletions
diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp
index 930cf00d9e3..0634319cbd1 100644
--- a/clang/lib/AST/MicrosoftMangle.cpp
+++ b/clang/lib/AST/MicrosoftMangle.cpp
@@ -2599,10 +2599,7 @@ void MicrosoftMangleContextImpl::mangleCXXVFTable(
// NOTE: <cvr-qualifiers> here is always 'B' (const). <storage-class>
// is always '6' for vftables.
MicrosoftCXXNameMangler Mangler(*this, Out);
- if (Derived->hasAttr<DLLImportAttr>())
- Mangler.getStream() << "\01??_S";
- else
- Mangler.getStream() << "\01??_7";
+ Mangler.getStream() << "\01??_7";
Mangler.mangleName(Derived);
Mangler.getStream() << "6B"; // '6' for vftable, 'B' for const.
for (const CXXRecordDecl *RD : BasePath)
diff --git a/clang/lib/AST/VTableBuilder.cpp b/clang/lib/AST/VTableBuilder.cpp
index b728b279182..bae018652f9 100644
--- a/clang/lib/AST/VTableBuilder.cpp
+++ b/clang/lib/AST/VTableBuilder.cpp
@@ -2548,6 +2548,7 @@ public:
// Only include the RTTI component if we know that we will provide a
// definition of the vftable.
HasRTTIComponent = Context.getLangOpts().RTTIData &&
+ !MostDerivedClass->hasAttr<DLLImportAttr>() &&
MostDerivedClass->getTemplateSpecializationKind() !=
TSK_ExplicitInstantiationDeclaration;
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;
OpenPOWER on IntegriCloud