diff options
author | Mike Stump <mrs@apple.com> | 2009-08-06 23:48:32 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-08-06 23:48:32 +0000 |
commit | 02cf1e264719b4dada4377cc8a43888cb66f8815 (patch) | |
tree | 995c89149da7ef815757836cea5e58327f79fe1c /lib/CodeGen/CGCXX.cpp | |
parent | 9889652dbc10060cd604861ed2e5bc6719f845b0 (diff) |
Add support for vcall generation for vtables for virtual bases. WIP.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@78357 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGCXX.cpp')
-rw-r--r-- | lib/CodeGen/CGCXX.cpp | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp index d60f13019f..f1a5e1cca4 100644 --- a/lib/CodeGen/CGCXX.cpp +++ b/lib/CodeGen/CGCXX.cpp @@ -534,7 +534,8 @@ void CodeGenFunction::GenerateVtableForBase(const CXXRecordDecl *RD, const CXXRecordDecl *Class, llvm::Constant *rtti, std::vector<llvm::Constant *> &methods, - bool isPrimary) { + bool isPrimary, + bool ForVirtualBase) { typedef CXXRecordDecl::method_iterator meth_iter; llvm::Type *Ptr8Ty; Ptr8Ty = llvm::PointerType::get(llvm::Type::Int8Ty, 0); @@ -542,6 +543,26 @@ void CodeGenFunction::GenerateVtableForBase(const CXXRecordDecl *RD, if (RD && !RD->isDynamicClass()) return; + + if (RD && ForVirtualBase) + for (meth_iter mi = RD->method_begin(), me = RD->method_end(); mi != me; + ++mi) { + if (mi->isVirtual()) { + // FIXME: vcall: offset for virtual base for this function + m = llvm::Constant::getNullValue(Ptr8Ty); + methods.push_back(m); + } + } + if (isPrimary && ForVirtualBase) + for (meth_iter mi = Class->method_begin(), + me = Class->method_end(); mi != me; ++mi) { + if (mi->isVirtual()) { + // FIXME: vcall: offset for virtual base for this function + m = llvm::Constant::getNullValue(Ptr8Ty); + methods.push_back(m); + } + } + if (RD) { const ASTRecordLayout &Layout = getContext().getASTRecordLayout(Class); int64_t BaseOffset = -(Layout.getBaseClassOffset(RD) / 8); @@ -564,8 +585,7 @@ void CodeGenFunction::GenerateVtableForBase(const CXXRecordDecl *RD, return; // And add the virtuals for the class to the primary vtable. - RD = Class; - for (meth_iter mi = RD->method_begin(), me = RD->method_end(); mi != me; + for (meth_iter mi = Class->method_begin(), me = Class->method_end(); mi != me; ++mi) { if (mi->isVirtual()) { m = CGM.GetAddrOfFunction(GlobalDecl(*mi)); @@ -619,7 +639,7 @@ llvm::Value *CodeGenFunction::GenerateVtable(const CXXRecordDecl *RD) { const CXXRecordDecl *Base = cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl()); if (Base != PrimaryBase) - GenerateVtableForBase(Base, RD, rtti, methods); + GenerateVtableForBase(Base, RD, rtti, methods, false, true); } llvm::Constant *C; |