diff options
author | Mike Stump <mrs@apple.com> | 2009-07-31 23:15:31 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-07-31 23:15:31 +0000 |
commit | 738f8c278da5950d0d4607de2debe0bdfad64185 (patch) | |
tree | efb0b5505a9197e7dda5b00a89e82e8c931b91aa /lib/CodeGen/CGCXX.cpp | |
parent | 12905987c4ab9fb705f88f56b35298f730c8dbd5 (diff) |
Add beginnigs of rtti generation, wire up more of -fno-exceptions.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77751 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGCXX.cpp')
-rw-r--r-- | lib/CodeGen/CGCXX.cpp | 41 |
1 files changed, 36 insertions, 5 deletions
diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp index 62dabf77d6..356d31829b 100644 --- a/lib/CodeGen/CGCXX.cpp +++ b/lib/CodeGen/CGCXX.cpp @@ -490,10 +490,42 @@ const char *CodeGenModule::getMangledCXXDtorName(const CXXDestructorDecl *D, return UniqueMangledName(Name.begin(), Name.end()); } +llvm::Constant *CodeGenFunction::GenerateRtti(const CXXRecordDecl *RD) { + llvm::Type *Ptr8Ty; + Ptr8Ty = llvm::PointerType::get(llvm::Type::Int8Ty, 0); + llvm::Constant *rtti = llvm::Constant::getNullValue(Ptr8Ty); + + if (!getContext().getLangOptions().Rtti) + return rtti; + + llvm::SmallString<256> OutName; + llvm::raw_svector_ostream Out(OutName); + QualType ClassTy; + // FIXME: What is the design on getTagDeclType when it requires casting + // away const? mutable? + ClassTy = getContext().getTagDeclType(const_cast<CXXRecordDecl*>(RD)); + mangleCXXRtti(ClassTy, getContext(), Out); + const char *Name = OutName.c_str(); + llvm::GlobalVariable::LinkageTypes linktype; + linktype = llvm::GlobalValue::WeakAnyLinkage; + std::vector<llvm::Constant *> info; + assert (0 && "FIXME: implement rtti descriptor"); + // FIXME: descriptor + info.push_back(llvm::Constant::getNullValue(Ptr8Ty)); + assert (0 && "FIXME: implement rtti ts"); + // FIXME: TS + info.push_back(llvm::Constant::getNullValue(Ptr8Ty)); + + llvm::Constant *C; + llvm::ArrayType *type = llvm::ArrayType::get(Ptr8Ty, info.size()); + C = llvm::ConstantArray::get(type, info); + rtti = new llvm::GlobalVariable(CGM.getModule(), type, true, linktype, C, + Name); + rtti = llvm::ConstantExpr::getBitCast(rtti, Ptr8Ty); + return rtti; +} + llvm::Value *CodeGenFunction::GenerateVtable(const CXXRecordDecl *RD) { - const llvm::FunctionType *FTy; - FTy = llvm::FunctionType::get(llvm::Type::VoidTy, - std::vector<const llvm::Type*>(), false); llvm::SmallString<256> OutName; llvm::raw_svector_ostream Out(OutName); QualType ClassTy; @@ -512,7 +544,7 @@ llvm::Value *CodeGenFunction::GenerateVtable(const CXXRecordDecl *RD) { m = llvm::Constant::getNullValue(Ptr8Ty); int64_t offset = 0; methods.push_back(m); offset += LLVMPointerWidth; - methods.push_back(m); offset += LLVMPointerWidth; + methods.push_back(GenerateRtti(RD)); offset += LLVMPointerWidth; for (meth_iter mi = RD->method_begin(), me = RD->method_end(); mi != me; ++mi) { if (mi->isVirtual()) { @@ -526,7 +558,6 @@ llvm::Value *CodeGenFunction::GenerateVtable(const CXXRecordDecl *RD) { C = llvm::ConstantArray::get(type, methods); llvm::Value *vtable = new llvm::GlobalVariable(CGM.getModule(), type, true, linktype, C, Name); - // CGM.CreateRuntimeFunction(FTy, Name); vtable = Builder.CreateBitCast(vtable, Ptr8Ty); // FIXME: finish layout for virtual bases vtable = Builder.CreateGEP(vtable, |