From 9deb22b8506c463b61d83d5c56ceb8dd2d8ae598 Mon Sep 17 00:00:00 2001 From: Mike Stump Date: Wed, 12 Aug 2009 18:50:26 +0000 Subject: [PATCH] Improve the secondary vtables to not include vbase offsets. WIP. llvm-svn: 78831 --- clang/lib/CodeGen/CGCXX.cpp | 28 ++++++++++++------------ clang/test/CodeGenCXX/virt.cpp | 39 ++++++++++++++++++++++++++++++++-- 2 files changed, 52 insertions(+), 15 deletions(-) diff --git a/clang/lib/CodeGen/CGCXX.cpp b/clang/lib/CodeGen/CGCXX.cpp index 7541357a72c9..f161f9f68eb4 100644 --- a/clang/lib/CodeGen/CGCXX.cpp +++ b/clang/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(i->getType()->getAs()->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(i->getType()->getAs()->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... diff --git a/clang/test/CodeGenCXX/virt.cpp b/clang/test/CodeGenCXX/virt.cpp index 7c51a39376a9..d9e8664460cc 100644 --- a/clang/test/CodeGenCXX/virt.cpp +++ b/clang/test/CodeGenCXX/virt.cpp @@ -128,6 +128,41 @@ struct test3_D : virtual test3_B1 { // CHECK-LP64: .quad __ZN8test3_B16funcB1Ev // CHECK-LP64: .quad __ZN7test3_D5funcDEv +struct test4_D : virtual B, virtual C { +}; + +// CHECK-LP32:__ZTV7test4_D: +// CHECK-LP32: .space 4 +// CHECK-LP32: .long 4 +// CHECK-LP32: .space 4 +// CHECK-LP32: .space 4 +// CHECK-LP32: .space 4 +// CHECK-LP32: .long __ZTI7test4_D +// CHECK-LP32: .long __ZN1C4bee1Ev +// CHECK-LP32: .long __ZN1C4bee2Ev +// CHECK-LP32: .space 4 +// CHECK-LP32: .space 4 +// CHECK-LP32: .long 4294967292 +// CHECK-LP32: .long __ZTI7test4_D +// CHECK-LP32: .long __ZN1B4bar1Ev +// CHECK-LP32: .long __ZN1B4bar2Ev + +// CHECK-LP64:__ZTV7test4_D: +// CHECK-LP64: .space 8 +// CHECK-LP64: .quad 8 +// CHECK-LP64: .space 8 +// CHECK-LP64: .space 8 +// CHECK-LP64: .space 8 +// CHECK-LP64: .quad __ZTI7test4_D +// CHECK-LP64: .quad __ZN1C4bee1Ev +// CHECK-LP64: .quad __ZN1C4bee2Ev +// CHECK-LP64: .space 8 +// CHECK-LP64: .space 8 +// CHECK-LP64: .quad 18446744073709551608 +// CHECK-LP64: .quad __ZTI7test4_D +// CHECK-LP64: .quad __ZN1B4bar1Ev +// CHECK-LP64: .quad __ZN1B4bar2Ev + @@ -210,5 +245,5 @@ struct test3_D : virtual test3_B1 { // CHECK-LP64: .quad __ZN2D14bar5Ev -test3_D d; - +test4_D d4; +test3_D d3;