From 49f17537ee87f32c4f6d5bc606d362d974d23507 Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Sat, 29 Jan 2011 22:10:32 +0000 Subject: When emitting RTTI for a non-class type, compute the visibility of the RTTI data based on the explicit visibility of the type. llvm-svn: 124553 --- clang/lib/CodeGen/CGRTTI.cpp | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) (limited to 'clang/lib/CodeGen/CGRTTI.cpp') diff --git a/clang/lib/CodeGen/CGRTTI.cpp b/clang/lib/CodeGen/CGRTTI.cpp index b2129489bb3..957b21893c5 100644 --- a/clang/lib/CodeGen/CGRTTI.cpp +++ b/clang/lib/CodeGen/CGRTTI.cpp @@ -570,11 +570,7 @@ llvm::Constant *RTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) { llvm::GlobalVariable *TypeName = GetAddrOfTypeName(Ty, Linkage); const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(VMContext); - llvm::Constant *TypeNameAsInt8Ptr = - llvm::ConstantExpr::getBitCast(TypeName, Int8PtrTy); - - bool Hidden = DecideHidden(Ty); - Fields.push_back(TypeNameAsInt8Ptr); + Fields.push_back(llvm::ConstantExpr::getBitCast(TypeName, Int8PtrTy)); switch (Ty->getTypeClass()) { #define TYPE(Class, Base) @@ -677,12 +673,21 @@ llvm::Constant *RTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) { CGM.setTypeVisibility(GV, RD, CodeGenModule::TVK_ForRTTI); CGM.setTypeVisibility(TypeName, RD, CodeGenModule::TVK_ForRTTIName); - - } else if (Hidden || - (CGM.getCodeGenOpts().HiddenWeakVTables && - Linkage == llvm::GlobalValue::LinkOnceODRLinkage)) { - GV->setVisibility(llvm::GlobalValue::HiddenVisibility); + } else { + Visibility TypeInfoVisibility = DefaultVisibility; + if (CGM.getCodeGenOpts().HiddenWeakVTables && + Linkage == llvm::GlobalValue::LinkOnceODRLinkage) + TypeInfoVisibility = HiddenVisibility; + + // The type name should have the same visibility as the type itself. + Visibility ExplicitVisibility = Ty->getVisibility(); + TypeName->setVisibility(CodeGenModule:: + GetLLVMVisibility(ExplicitVisibility)); + + TypeInfoVisibility = minVisibility(TypeInfoVisibility, Ty->getVisibility()); + GV->setVisibility(CodeGenModule::GetLLVMVisibility(TypeInfoVisibility)); } + GV->setUnnamedAddr(true); return llvm::ConstantExpr::getBitCast(GV, Int8PtrTy); -- cgit v1.2.3