diff options
author | Nico Weber <nicolasweber@gmx.de> | 2018-03-07 23:15:20 +0000 |
---|---|---|
committer | Nico Weber <nicolasweber@gmx.de> | 2018-03-07 23:15:20 +0000 |
commit | 91af2747f284098a98a9ce7738618cb771edbd77 (patch) | |
tree | 2a41915c98465ed526bbcce0fe0601a9a7458a0d | |
parent | cd72cbc667d09b739a22d6b8bf0ba418187b779f (diff) | |
download | bcm5719-llvm-91af2747f284098a98a9ce7738618cb771edbd77.tar.gz bcm5719-llvm-91af2747f284098a98a9ce7738618cb771edbd77.zip |
[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
llvm-svn: 326960
-rw-r--r-- | clang/lib/CodeGen/MicrosoftCXXABI.cpp | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/clang/lib/CodeGen/MicrosoftCXXABI.cpp b/clang/lib/CodeGen/MicrosoftCXXABI.cpp index 74b744a2504..d48dfbf0909 100644 --- a/clang/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/clang/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( |