diff options
author | Mike Stump <mrs@apple.com> | 2009-11-14 14:25:18 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-11-14 14:25:18 +0000 |
commit | 14718425fa805177f5d82313f8e4478546558524 (patch) | |
tree | f1e9e3c2f5ab86c96b2840d84506ea64abfa8d27 /clang/lib/CodeGen/CGRtti.cpp | |
parent | 56ffa484731165dfaee2964c8c987c63d5052363 (diff) | |
download | bcm5719-llvm-14718425fa805177f5d82313f8e4478546558524.tar.gz bcm5719-llvm-14718425fa805177f5d82313f8e4478546558524.zip |
Add the name to the rtti data structure.
llvm-svn: 88792
Diffstat (limited to 'clang/lib/CodeGen/CGRtti.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGRtti.cpp | 39 |
1 files changed, 35 insertions, 4 deletions
diff --git a/clang/lib/CodeGen/CGRtti.cpp b/clang/lib/CodeGen/CGRtti.cpp index 7af15f0a8ca..8484e2d7dab 100644 --- a/clang/lib/CodeGen/CGRtti.cpp +++ b/clang/lib/CodeGen/CGRtti.cpp @@ -15,7 +15,38 @@ using namespace clang; using namespace CodeGen; +class RttiBuilder { + CodeGenModule &CGM; // Per-module state. + llvm::LLVMContext &VMContext; + const llvm::Type *Int8PtrTy; +public: + RttiBuilder(CodeGenModule &cgm) + : CGM(cgm), VMContext(cgm.getModule().getContext()), + Int8PtrTy(llvm::Type::getInt8PtrTy(VMContext)) { } + + llvm::Constant *BuildName(const CXXRecordDecl *RD) { + llvm::SmallString<256> OutName; + llvm::raw_svector_ostream Out(OutName); + mangleCXXRttiName(CGM.getMangleContext(), + CGM.getContext().getTagDeclType(RD), Out); + + llvm::GlobalVariable::LinkageTypes linktype; + linktype = llvm::GlobalValue::LinkOnceODRLinkage; + + llvm::Constant *C; + C = llvm::ConstantArray::get(VMContext, Out.str().substr(4)); + + llvm::Constant *s = new llvm::GlobalVariable(CGM.getModule(), C->getType(), + true, linktype, C, + Out.str()); + s = llvm::ConstantExpr::getBitCast(s, Int8PtrTy); + return s; + }; +}; + llvm::Constant *CodeGenModule::GenerateRtti(const CXXRecordDecl *RD) { + RttiBuilder b(*this); + const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(VMContext); if (!getContext().getLangOptions().Rtti) @@ -26,14 +57,14 @@ llvm::Constant *CodeGenModule::GenerateRtti(const CXXRecordDecl *RD) { mangleCXXRtti(getMangleContext(), Context.getTagDeclType(RD), Out); llvm::GlobalVariable::LinkageTypes linktype; - linktype = llvm::GlobalValue::WeakAnyLinkage; + linktype = llvm::GlobalValue::LinkOnceODRLinkage; std::vector<llvm::Constant *> info; // assert(0 && "FIXME: implement rtti descriptor"); // FIXME: descriptor info.push_back(llvm::Constant::getNullValue(Int8PtrTy)); - // assert(0 && "FIXME: implement rtti ts"); - // FIXME: TS - info.push_back(llvm::Constant::getNullValue(Int8PtrTy)); + info.push_back(b.BuildName(RD)); + + // FIXME: rest of rtti bits llvm::Constant *C; llvm::ArrayType *type = llvm::ArrayType::get(Int8PtrTy, info.size()); |