diff options
author | Mike Stump <mrs@apple.com> | 2009-11-10 02:30:51 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-11-10 02:30:51 +0000 |
commit | fbfb52d4cf10b4fd1ac19d1445fe2ffcb9c2bbf1 (patch) | |
tree | 96843941ffc1f9129d9e1af7b8ebf43f3e485c22 /lib/CodeGen/CGVtable.cpp | |
parent | 479529e679957fbb92b56e116e3c86734429331e (diff) |
Be sure to clear out VCall when we clear out VCalls.
Start implementing VTTs. WIP.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@86650 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGVtable.cpp')
-rw-r--r-- | lib/CodeGen/CGVtable.cpp | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/lib/CodeGen/CGVtable.cpp b/lib/CodeGen/CGVtable.cpp index 5c3c9a573e..e65c213b76 100644 --- a/lib/CodeGen/CGVtable.cpp +++ b/lib/CodeGen/CGVtable.cpp @@ -433,6 +433,7 @@ public: i != e; ++i) methods[InsertionPoint++] = wrap((0?600:0) + *i); VCalls.clear(); + VCall.clear(); } Index_t end(const CXXRecordDecl *RD, const ASTRecordLayout &Layout, @@ -700,6 +701,8 @@ llvm::Value *CodeGenFunction::GenerateVtable(const CXXRecordDecl *RD) { // then the vtables for all the virtual bases. b.GenerateVtableForVBases(RD); + //GenerateVTT(RD); + llvm::Constant *C; llvm::ArrayType *type = llvm::ArrayType::get(Ptr8Ty, methods.size()); C = llvm::ConstantArray::get(type, methods); @@ -711,3 +714,39 @@ llvm::Value *CodeGenFunction::GenerateVtable(const CXXRecordDecl *RD) { AddressPoint*LLVMPointerWidth/8)); return vtable; } + +class VTTBuilder { + /// Inits - The list of values built for the VTT. + std::vector<llvm::Constant *> &Inits; + /// Class - The most derived class that this vtable is being built for. + const CXXRecordDecl *Class; + CodeGenModule &CGM; // Per-module state. + +public: + VTTBuilder(std::vector<llvm::Constant *> &inits, const CXXRecordDecl *c, + CodeGenModule &cgm) : Inits(inits), Class(c), CGM(cgm) { + } +}; + +llvm::Value *CodeGenFunction::GenerateVTT(const CXXRecordDecl *RD) { + llvm::SmallString<256> OutName; + llvm::raw_svector_ostream Out(OutName); + mangleCXXVTT(CGM.getMangleContext(), RD, Out); + + llvm::GlobalVariable::LinkageTypes linktype; + linktype = llvm::GlobalValue::LinkOnceODRLinkage; + std::vector<llvm::Constant *> inits; + llvm::Type *Ptr8Ty=llvm::PointerType::get(llvm::Type::getInt8Ty(VMContext),0); + + VTTBuilder b(inits, RD, CGM); + + D1(printf("vtt %s\n", RD->getNameAsCString())); + + llvm::Constant *C; + llvm::ArrayType *type = llvm::ArrayType::get(Ptr8Ty, inits.size()); + C = llvm::ConstantArray::get(type, inits); + llvm::Value *vtt = new llvm::GlobalVariable(CGM.getModule(), type, true, + linktype, C, Out.str()); + vtt = Builder.CreateBitCast(vtt, Ptr8Ty); + return vtt; +} |