diff options
author | Mike Stump <mrs@apple.com> | 2009-08-12 18:50:26 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-08-12 18:50:26 +0000 |
commit | 34fae9cf27b19664f1f4526e195aff2299de2c40 (patch) | |
tree | 51243eed0ce6ab843d5c3e69d76976dfe586a80d /lib/CodeGen/CGCXX.cpp | |
parent | acf2d137f362ede2b8f6a86b4f9dd9f6bcf00d7a (diff) |
Improve the secondary vtables to not include vbase offsets. WIP.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@78831 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGCXX.cpp')
-rw-r--r-- | lib/CodeGen/CGCXX.cpp | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp index 7541357a72..f161f9f68e 100644 --- a/lib/CodeGen/CGCXX.cpp +++ b/lib/CodeGen/CGCXX.cpp @@ -638,19 +638,21 @@ void CodeGenFunction::GenerateVtableForBase(const CXXRecordDecl *RD, const ASTRecordLayout &Layout = getContext().getASTRecordLayout(Class); - // The virtual base offsets come first... - for (CXXRecordDecl::reverse_base_class_const_iterator i - = Class->bases_rbegin(), - e = Class->bases_rend(); i != e; ++i) { - if (!i->isVirtual()) - continue; - const CXXRecordDecl *Base = - cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl()); - int64_t BaseOffset = Layout.getBaseClassOffset(Base) / 8; - llvm::Constant *m; - m = llvm::ConstantInt::get(llvm::Type::Int64Ty, BaseOffset); - m = llvm::ConstantExpr::getIntToPtr(m, Ptr8Ty); - methods.push_back(m); + if (isPrimary) { + // The virtual base offsets come first... + for (CXXRecordDecl::reverse_base_class_const_iterator i + = Class->bases_rbegin(), + e = Class->bases_rend(); i != e; ++i) { + if (!i->isVirtual()) + continue; + const CXXRecordDecl *Base = + cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl()); + int64_t BaseOffset = Layout.getBaseClassOffset(Base) / 8; + llvm::Constant *m; + m = llvm::ConstantInt::get(llvm::Type::Int64Ty, BaseOffset); + m = llvm::ConstantExpr::getIntToPtr(m, Ptr8Ty); + methods.push_back(m); + } } // then comes the the vcall offsets for all our functions... |