diff options
author | Mike Stump <mrs@apple.com> | 2009-08-14 01:44:03 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-08-14 01:44:03 +0000 |
commit | 215389180617e4edb8aa95a5526509948ed1416f (patch) | |
tree | 83535ae95ad43e0cf82afcebe2fac05ee3a24820 /lib/CodeGen/CGCXX.cpp | |
parent | 183d7181fd59842ac969cbc6fe0376f85dc63ae4 (diff) |
Deconflate virtual base offsets from non-virtual base offsets.
Deconflate a virtual base primary from a non-virtual base.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@78971 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGCXX.cpp')
-rw-r--r-- | lib/CodeGen/CGCXX.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp index 4460a254b7..04da0ee175 100644 --- a/lib/CodeGen/CGCXX.cpp +++ b/lib/CodeGen/CGCXX.cpp @@ -703,6 +703,7 @@ void CodeGenFunction::GenerateVtableForBase(const CXXRecordDecl *RD, if (isPrimary) { // The virtual base offsets come first... + // FIXME: audit for (CXXRecordDecl::reverse_base_class_const_iterator i = Class->bases_rbegin(), e = Class->bases_rend(); i != e; ++i) { @@ -710,7 +711,7 @@ void CodeGenFunction::GenerateVtableForBase(const CXXRecordDecl *RD, continue; const CXXRecordDecl *Base = cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl()); - int64_t BaseOffset = Layout.getBaseClassOffset(Base) / 8; + int64_t BaseOffset = Layout.getVBaseClassOffset(Base) / 8; llvm::Constant *m; m = llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext), BaseOffset); m = llvm::ConstantExpr::getIntToPtr(m, Ptr8Ty); @@ -741,7 +742,11 @@ void CodeGenFunction::GenerateVtableForBase(const CXXRecordDecl *RD, if (TopPrimary) { if (RD) { - int64_t BaseOffset = -(Layout.getBaseClassOffset(RD) / 8); + int64_t BaseOffset; + if (ForVirtualBase) + BaseOffset = -(Layout.getVBaseClassOffset(RD) / 8); + else + BaseOffset = -(Layout.getBaseClassOffset(RD) / 8); m = llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext), BaseOffset); m = llvm::ConstantExpr::getIntToPtr(m, Ptr8Ty); } @@ -784,13 +789,15 @@ llvm::Value *CodeGenFunction::GenerateVtable(const CXXRecordDecl *RD) { // The primary base comes first. GenerateVtableForBase(PrimaryBase, RD, rtti, methods, true, PrimaryBaseWasVirtual, IndirectPrimary); + + // Then come the non-virtual bases. for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(), e = RD->bases_end(); i != e; ++i) { if (i->isVirtual()) continue; const CXXRecordDecl *Base = cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl()); - if (Base != PrimaryBase) + if (Base != PrimaryBase || PrimaryBaseWasVirtual) GenerateVtableForBase(Base, RD, rtti, methods, false, false, IndirectPrimary); } |