aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGVtable.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen/CGVtable.cpp')
-rw-r--r--lib/CodeGen/CGVtable.cpp39
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;
+}