diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2011-10-18 00:55:28 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2011-10-18 00:55:28 +0000 |
commit | 97c0aefe8c0523417ffe8a500a220286e11e7a46 (patch) | |
tree | eef858c82940328aa2bcbcab7d21e7ca009dc326 /lib/CodeGen/CGRecordLayoutBuilder.cpp | |
parent | 3eff3214647fe25e80dbf1dd096cc73a11d9a77a (diff) |
Rewrite parts of MS ABI C++ layout. Based on work by r4start; I ended up doing this while I was trying to review his patch.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@142325 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGRecordLayoutBuilder.cpp')
-rw-r--r-- | lib/CodeGen/CGRecordLayoutBuilder.cpp | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/lib/CodeGen/CGRecordLayoutBuilder.cpp b/lib/CodeGen/CGRecordLayoutBuilder.cpp index 6475ccac03..c677fc7a57 100644 --- a/lib/CodeGen/CGRecordLayoutBuilder.cpp +++ b/lib/CodeGen/CGRecordLayoutBuilder.cpp @@ -669,7 +669,13 @@ CGRecordLayoutBuilder::LayoutNonVirtualBases(const CXXRecordDecl *RD, // Check if we need to add a vtable pointer. if (RD->isDynamicClass()) { - if (!PrimaryBase) { + if (PrimaryBase) { + if (!Layout.isPrimaryBaseVirtual()) + LayoutNonVirtualBase(PrimaryBase, CharUnits::Zero()); + else + LayoutVirtualBase(PrimaryBase, CharUnits::Zero()); + } else if (Types.getContext().getTargetInfo().getCXXABI() != + CXXABI_Microsoft) { llvm::Type *FunctionType = llvm::FunctionType::get(llvm::Type::getInt32Ty(Types.getLLVMContext()), /*isVarArg=*/true); @@ -678,11 +684,7 @@ CGRecordLayoutBuilder::LayoutNonVirtualBases(const CXXRecordDecl *RD, assert(NextFieldOffset.isZero() && "VTable pointer must come first!"); AppendField(CharUnits::Zero(), VTableTy->getPointerTo()); - } else { - if (!Layout.isPrimaryBaseVirtual()) - LayoutNonVirtualBase(PrimaryBase, CharUnits::Zero()); - else - LayoutVirtualBase(PrimaryBase, CharUnits::Zero()); + } } |