From 9a86a137b0872bad25161fb3408a71d919638757 Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Sat, 29 Jan 2011 20:36:11 +0000 Subject: [PATCH] Add RTTIBuilder::GetAddrOfTypeName which uses the newly added CreateOrReplaceCXXRuntimeVariable. Set the visibility for typeinfo names. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124548 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGRTTI.cpp | 43 +++++++++++++++++++++++++++++++---- lib/CodeGen/CodeGenModule.cpp | 4 ++++ 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/lib/CodeGen/CGRTTI.cpp b/lib/CodeGen/CGRTTI.cpp index 8ce465c59a..b2129489bb 100644 --- a/lib/CodeGen/CGRTTI.cpp +++ b/lib/CodeGen/CGRTTI.cpp @@ -30,6 +30,10 @@ class RTTIBuilder { /// Fields - The fields of the RTTI descriptor currently being built. llvm::SmallVector Fields; + /// GetAddrOfTypeName - Returns the mangled type name of the given type. + llvm::GlobalVariable * + GetAddrOfTypeName(QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage); + /// GetAddrOfExternalRTTIDescriptor - Returns the constant for the RTTI /// descriptor of the given type. llvm::Constant *GetAddrOfExternalRTTIDescriptor(QualType Ty); @@ -162,6 +166,26 @@ public: }; } +llvm::GlobalVariable * +RTTIBuilder::GetAddrOfTypeName(QualType Ty, + llvm::GlobalVariable::LinkageTypes Linkage) { + llvm::SmallString<256> OutName; + CGM.getCXXABI().getMangleContext().mangleCXXRTTIName(Ty, OutName); + llvm::StringRef Name = OutName.str(); + + // We know that the mangled name of the type starts at index 4 of the + // mangled name of the typename, so we can just index into it in order to + // get the mangled name of the type. + llvm::Constant *Init = llvm::ConstantArray::get(VMContext, Name.substr(4)); + + llvm::GlobalVariable *GV = + CGM.CreateOrReplaceCXXRuntimeVariable(Name, Init->getType(), Linkage); + + GV->setInitializer(Init); + + return GV; +} + llvm::Constant *RTTIBuilder::GetAddrOfExternalRTTIDescriptor(QualType Ty) { // Mangle the RTTI name. llvm::SmallString<256> OutName; @@ -543,8 +567,14 @@ llvm::Constant *RTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) { BuildVTablePointer(cast(Ty)); // And the name. + 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(BuildName(Ty, Hidden, Linkage)); + Fields.push_back(TypeNameAsInt8Ptr); switch (Ty->getTypeClass()) { #define TYPE(Class, Base) @@ -642,10 +672,13 @@ llvm::Constant *RTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) { // type_infos themselves, so we can emit these as hidden symbols. // But don't do this if we're worried about strict visibility // compatibility. - if (const RecordType *RT = dyn_cast(Ty)) - CGM.setTypeVisibility(GV, cast(RT->getDecl()), - CodeGenModule::TVK_ForRTTI); - else if (Hidden || + if (const RecordType *RT = dyn_cast(Ty)) { + const CXXRecordDecl *RD = cast(RT->getDecl()); + + 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); diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 88de91afec..41f499e525 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -199,6 +199,10 @@ void CodeGenModule::setTypeVisibility(llvm::GlobalValue *GV, if (!CodeGenOpts.HiddenWeakVTables) return; + // We never want to drop the visibility for RTTI names. + if (TVK == TVK_ForRTTIName) + return; + // We want to drop the visibility to hidden for weak type symbols. // This isn't possible if there might be unresolved references // elsewhere that rely on this symbol being visible. -- 2.40.0