thakis created this revision.
thakis added a reviewer: rnk.
No effective behavior change, just for cleanliness.
Fixes PR36159.
https://reviews.llvm.org/D44223
Files:
lib/CodeGen/MicrosoftCXXABI.cpp
Index: lib/CodeGen/MicrosoftCXXABI.cpp
===================================================================
--- lib/CodeGen/MicrosoftCXXABI.cpp
+++ lib/CodeGen/MicrosoftCXXABI.cpp
@@ -1196,15 +1196,22 @@
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 VBaseEntry;
+ SmallVector<VBaseEntry, 4> VBases(VBaseMap.begin(), VBaseMap.end());
+ std::stable_sort(VBases.begin(), VBases.end(),
+ [](const VBaseEntry &a, const VBaseEntry &b) {
+ return a.second.VBaseOffset < b.second.VBaseOffset;
+ });
+
+ for (const VBaseEntry E : VBases) {
+ if (!E.second.hasVtorDisp())
continue;
llvm::Value *VBaseOffset =
- GetVirtualBaseClassOffset(CGF, getThisAddress(CGF), RD, I->first);
+ GetVirtualBaseClassOffset(CGF, getThisAddress(CGF), RD, E.first);
uint64_t ConstantVBaseOffset =
- Layout.getVBaseClassOffset(I->first).getQuantity();
+ Layout.getVBaseClassOffset(E.first).getQuantity();
// vtorDisp_for_vbase = vbptr[vbase_idx] - offsetof(RD, vbase).
llvm::Value *VtorDispValue = Builder.CreateSub(
Index: lib/CodeGen/MicrosoftCXXABI.cpp
===================================================================
--- lib/CodeGen/MicrosoftCXXABI.cpp
+++ lib/CodeGen/MicrosoftCXXABI.cpp
@@ -1196,15 +1196,22 @@
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 VBaseEntry;
+ SmallVector<VBaseEntry, 4> VBases(VBaseMap.begin(), VBaseMap.end());
+ std::stable_sort(VBases.begin(), VBases.end(),
+ [](const VBaseEntry &a, const VBaseEntry &b) {
+ return a.second.VBaseOffset < b.second.VBaseOffset;
+ });
+
+ for (const VBaseEntry E : VBases) {
+ if (!E.second.hasVtorDisp())
continue;
llvm::Value *VBaseOffset =
- GetVirtualBaseClassOffset(CGF, getThisAddress(CGF), RD, I->first);
+ GetVirtualBaseClassOffset(CGF, getThisAddress(CGF), RD, E.first);
uint64_t ConstantVBaseOffset =
- Layout.getVBaseClassOffset(I->first).getQuantity();
+ Layout.getVBaseClassOffset(E.first).getQuantity();
// vtorDisp_for_vbase = vbptr[vbase_idx] - offsetof(RD, vbase).
llvm::Value *VtorDispValue = Builder.CreateSub(
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits