diff options
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... |