diff options
author | Anders Carlsson <andersca@mac.com> | 2011-01-29 20:36:11 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2011-01-29 20:36:11 +0000 |
commit | 9a86a137b0872bad25161fb3408a71d919638757 (patch) | |
tree | 028db4db1de36640c25b5dbc1beaaacff5cefaf5 /lib/CodeGen/CGRTTI.cpp | |
parent | fa2e99f72f9bfe2270ea8caf76d0eef11c45259f (diff) |
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
Diffstat (limited to 'lib/CodeGen/CGRTTI.cpp')
-rw-r--r-- | lib/CodeGen/CGRTTI.cpp | 43 |
1 files changed, 38 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<llvm::Constant *, 16> 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<Type>(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<RecordType>(Ty)) - CGM.setTypeVisibility(GV, cast<CXXRecordDecl>(RT->getDecl()), - CodeGenModule::TVK_ForRTTI); - else if (Hidden || + if (const RecordType *RT = dyn_cast<RecordType>(Ty)) { + const CXXRecordDecl *RD = cast<CXXRecordDecl>(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); |