summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/MicrosoftVBTables.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/CodeGen/MicrosoftVBTables.cpp')
-rw-r--r--clang/lib/CodeGen/MicrosoftVBTables.cpp12
1 files changed, 6 insertions, 6 deletions
diff --git a/clang/lib/CodeGen/MicrosoftVBTables.cpp b/clang/lib/CodeGen/MicrosoftVBTables.cpp
index b4b98d3357a..dabf52c1ccc 100644
--- a/clang/lib/CodeGen/MicrosoftVBTables.cpp
+++ b/clang/lib/CodeGen/MicrosoftVBTables.cpp
@@ -195,15 +195,13 @@ void VBTableInfo::EmitVBTableDefinition(
const ASTRecordLayout &DerivedLayout =
CGM.getContext().getASTRecordLayout(RD);
- SmallVector<llvm::Constant *, 4> Offsets;
+ SmallVector<llvm::Constant *, 4> Offsets(1 + ReusingBase->getNumVBases(), 0);
// The offset from ReusingBase's vbptr to itself always leads.
CharUnits VBPtrOffset = BaseLayout.getVBPtrOffset();
- Offsets.push_back(
- llvm::ConstantInt::get(CGM.IntTy, -VBPtrOffset.getQuantity()));
+ Offsets[0] = llvm::ConstantInt::get(CGM.IntTy, -VBPtrOffset.getQuantity());
- // These are laid out in the same order as in Itanium, which is the same as
- // the order of the vbase iterator.
+ MicrosoftVTableContext &Context = CGM.getMicrosoftVTableContext();
for (CXXRecordDecl::base_class_const_iterator I = ReusingBase->vbases_begin(),
E = ReusingBase->vbases_end(); I != E; ++I) {
const CXXRecordDecl *VBase = I->getType()->getAsCXXRecordDecl();
@@ -211,7 +209,9 @@ void VBTableInfo::EmitVBTableDefinition(
assert(!Offset.isNegative());
// Make it relative to the subobject vbptr.
Offset -= VBPtrSubobject.getBaseOffset() + VBPtrOffset;
- Offsets.push_back(llvm::ConstantInt::get(CGM.IntTy, Offset.getQuantity()));
+ unsigned VBIndex = Context.getVBTableIndex(ReusingBase, VBase);
+ assert(Offsets[VBIndex] == 0 && "The same vbindex seen twice?");
+ Offsets[VBIndex] = llvm::ConstantInt::get(CGM.IntTy, Offset.getQuantity());
}
assert(Offsets.size() ==
OpenPOWER on IntegriCloud