Index: lib/CodeGen/MicrosoftCXXABI.cpp =================================================================== --- lib/CodeGen/MicrosoftCXXABI.cpp +++ lib/CodeGen/MicrosoftCXXABI.cpp @@ -1196,15 +1196,21 @@ unsigned AS = getThisAddress(CGF).getAddressSpace(); llvm::Value *Int8This = nullptr; // Initialize lazily. - for (VBOffsets::const_iterator I = VBaseMap.begin(), E = VBaseMap.end(); - I != E; ++I) { - if (!I->second.hasVtorDisp()) + // Emit vtordisps in vbase offset order, to have deterministic output. + typedef VBOffsets::value_type VBase; + SmallVector VBases(VBaseMap.begin(), VBaseMap.end()); + std::sort(VBases.begin(), VBases.end(), [](const VBase &a, const VBase &b) { + return a.second.VBaseOffset < b.second.VBaseOffset; + }); + + for (const VBase &V : VBases) { + if (!V.second.hasVtorDisp()) continue; llvm::Value *VBaseOffset = - GetVirtualBaseClassOffset(CGF, getThisAddress(CGF), RD, I->first); + GetVirtualBaseClassOffset(CGF, getThisAddress(CGF), RD, V.first); uint64_t ConstantVBaseOffset = - Layout.getVBaseClassOffset(I->first).getQuantity(); + Layout.getVBaseClassOffset(V.first).getQuantity(); // vtorDisp_for_vbase = vbptr[vbase_idx] - offsetof(RD, vbase). llvm::Value *VtorDispValue = Builder.CreateSub(