From 2eeccea15cbb45f34ab1adc459b086e803bf15a1 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Wed, 7 Mar 2018 23:15:20 +0000 Subject: [PATCH] [ms] Emit vtordisp initializers in a deterministic order. No effective behavior change, just for cleanliness. Analysis and typing by me, actual patch mostly by Reid. Fixes PR36159. https://reviews.llvm.org/D44223 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@326960 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/MicrosoftCXXABI.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/CodeGen/MicrosoftCXXABI.cpp b/lib/CodeGen/MicrosoftCXXABI.cpp index 74b744a250..d48dfbf090 100644 --- a/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/lib/CodeGen/MicrosoftCXXABI.cpp @@ -1196,15 +1196,16 @@ void MicrosoftCXXABI::initializeHiddenVirtualInheritanceMembers( unsigned AS = getThisAddress(CGF).getAddressSpace(); llvm::Value *Int8This = nullptr; // Initialize lazily. - for (VBOffsets::const_iterator I = VBaseMap.begin(), E = VBaseMap.end(); - I != E; ++I) { + for (const CXXBaseSpecifier &S : RD->vbases()) { + const CXXRecordDecl *VBase = S.getType()->getAsCXXRecordDecl(); + auto I = VBaseMap.find(VBase); + assert(I != VBaseMap.end()); if (!I->second.hasVtorDisp()) continue; llvm::Value *VBaseOffset = - GetVirtualBaseClassOffset(CGF, getThisAddress(CGF), RD, I->first); - uint64_t ConstantVBaseOffset = - Layout.getVBaseClassOffset(I->first).getQuantity(); + GetVirtualBaseClassOffset(CGF, getThisAddress(CGF), RD, VBase); + uint64_t ConstantVBaseOffset = I->second.VBaseOffset.getQuantity(); // vtorDisp_for_vbase = vbptr[vbase_idx] - offsetof(RD, vbase). llvm::Value *VtorDispValue = Builder.CreateSub( -- 2.50.1