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. llvm-svn: 221511
This commit is contained in:
parent
771c132e0f
commit
1fb1a044e5
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue