diff options
| author | Anders Carlsson <andersca@mac.com> | 2010-02-17 06:30:02 +0000 |
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2010-02-17 06:30:02 +0000 |
| commit | d2fd3027268495b2a0a6fdcbd5c9e8d934d480ee (patch) | |
| tree | bc8e0286701130f468f297c44e86732ae12eab8c /clang/lib/CodeGen | |
| parent | e78bc753fee1be5be27d981e0dbbd957c13a5c6d (diff) | |
| download | bcm5719-llvm-d2fd3027268495b2a0a6fdcbd5c9e8d934d480ee.tar.gz bcm5719-llvm-d2fd3027268495b2a0a6fdcbd5c9e8d934d480ee.zip | |
Handle primary bases in AddVCallOffsets.
llvm-svn: 96461
Diffstat (limited to 'clang/lib/CodeGen')
| -rw-r--r-- | clang/lib/CodeGen/CGVtable.cpp | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CGVtable.cpp b/clang/lib/CodeGen/CGVtable.cpp index 2b8b064f268..58989ede0bc 100644 --- a/clang/lib/CodeGen/CGVtable.cpp +++ b/clang/lib/CodeGen/CGVtable.cpp @@ -985,10 +985,17 @@ VtableBuilder::AddVCallAndVBaseOffsets(BaseSubobject Base, void VtableBuilder::AddVCallOffsets(BaseSubobject Base) { const CXXRecordDecl *RD = Base.getBase(); - const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD); + + // Handle the primary base first. const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBase(); - assert(!PrimaryBase && "FIXME: Handle the primary base!"); + if (PrimaryBase && Layout.getPrimaryBaseWasVirtual()) { + // Get the base offset of the primary base. + uint64_t PrimaryBaseOffset = Base.getBaseOffset() + + Layout.getBaseClassOffset(PrimaryBase); + + AddVCallOffsets(BaseSubobject(PrimaryBase, PrimaryBaseOffset)); + } // Add the vcall offsets. for (CXXRecordDecl::method_iterator I = RD->method_begin(), |

