summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNico Weber <nicolasweber@gmx.de>2018-03-07 23:15:20 +0000
committerNico Weber <nicolasweber@gmx.de>2018-03-07 23:15:20 +0000
commit91af2747f284098a98a9ce7738618cb771edbd77 (patch)
tree2a41915c98465ed526bbcce0fe0601a9a7458a0d
parentcd72cbc667d09b739a22d6b8bf0ba418187b779f (diff)
downloadbcm5719-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.cpp11
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(
OpenPOWER on IntegriCloud