diff options
-rw-r--r-- | clang/lib/CodeGen/ItaniumCXXABI.cpp | 11 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/dllimport-rtti.cpp | 18 |
2 files changed, 21 insertions, 8 deletions
diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index 084fd3be5b3..66ea0f68448 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -2190,6 +2190,11 @@ ItaniumRTTIBuilder::GetAddrOfExternalRTTIDescriptor(QualType Ty) { /*Constant=*/true, llvm::GlobalValue::ExternalLinkage, nullptr, Name); + if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) { + const CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl()); + if (RD->hasAttr<DLLImportAttr>()) + GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass); + } } return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy); @@ -2312,7 +2317,11 @@ static bool ShouldUseExternalRTTIDescriptor(CodeGenModule &CGM, // FIXME: this may need to be reconsidered if the key function // changes. - return CGM.getVTables().isVTableExternal(RD); + if (CGM.getVTables().isVTableExternal(RD)) + return true; + + if (RD->hasAttr<DLLImportAttr>()) + return true; } return false; diff --git a/clang/test/CodeGenCXX/dllimport-rtti.cpp b/clang/test/CodeGenCXX/dllimport-rtti.cpp index 7ed7dadfe40..b5a5d543d6e 100644 --- a/clang/test/CodeGenCXX/dllimport-rtti.cpp +++ b/clang/test/CodeGenCXX/dllimport-rtti.cpp @@ -1,13 +1,17 @@ -// RUN: %clang_cc1 -triple i686-windows-msvc -emit-llvm -std=c++1y -O1 -disable-llvm-optzns -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple i686-windows-msvc -emit-llvm -std=c++1y -O1 -disable-llvm-optzns -o - %s | FileCheck %s --check-prefix=MSVC +// RUN: %clang_cc1 -triple i686-windows-gnu -emit-llvm -std=c++1y -O1 -disable-llvm-optzns -o - %s | FileCheck %s --check-prefix=GNU struct __declspec(dllimport) S { - virtual void f(); + virtual void f() {} } s; -// CHECK-DAG: @"\01??_7S@@6B@" = available_externally dllimport -// CHECK-DAG: @"\01??_R0?AUS@@@8" = linkonce_odr -// CHECK-DAG: @"\01??_R1A@?0A@EA@S@@8" = linkonce_odr -// CHECK-DAG: @"\01??_R2S@@8" = linkonce_odr -// CHECK-DAG: @"\01??_R3S@@8" = linkonce_odr +// MSVC-DAG: @"\01??_7S@@6B@" = available_externally dllimport +// MSVC-DAG: @"\01??_R0?AUS@@@8" = linkonce_odr +// MSVC-DAG: @"\01??_R1A@?0A@EA@S@@8" = linkonce_odr +// MSVC-DAG: @"\01??_R2S@@8" = linkonce_odr +// MSVC-DAG: @"\01??_R3S@@8" = linkonce_odr + +// GNU-DAG: @_ZTV1S = available_externally dllimport +// GNU-DAG: @_ZTI1S = external dllimport struct U : S { } u; |