From: David Majnemer Date: Fri, 7 Nov 2014 07:26:38 +0000 (+0000) Subject: CodeGen, Itanium: Properly dllimport RTTI data X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=507d386ac2bf5528401fd1a1fa75f81abf809c01;p=clang CodeGen, Itanium: Properly dllimport RTTI data We would blindly assume that RTTI data should have the same linkage as the vtable because we didn't think the RTTI data was external. This oversight stemmed because we didn't take dllimport into account. This fixes PR21512. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@221511 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/ItaniumCXXABI.cpp b/lib/CodeGen/ItaniumCXXABI.cpp index 084fd3be5b..66ea0f6844 100644 --- a/lib/CodeGen/ItaniumCXXABI.cpp +++ b/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(Ty)) { + const CXXRecordDecl *RD = cast(RecordTy->getDecl()); + if (RD->hasAttr()) + 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()) + return true; } return false; diff --git a/test/CodeGenCXX/dllimport-rtti.cpp b/test/CodeGenCXX/dllimport-rtti.cpp index 7ed7dadfe4..b5a5d543d6 100644 --- a/test/CodeGenCXX/dllimport-rtti.cpp +++ b/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;