[MC] Sort FDEs by the associated CIE before emitting them.

This isn't necessary according to the DWARF standard, but it matches the
.eh_frame sections emitted by other tools in practice, and the Android
libunwindstack rejects .eh_frame sections where an FDE refers to a CIE
other than the closest previous CIE. So match the other tools and also
sort accordingly.

I consider this a bug in libunwindstack, but it's easy enough to emit
a compatible .eh_frame section for compatibility with installed
operating systems.

Differential Revision: https://reviews.llvm.org/D58266



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@356216 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/MC/MCDwarf.cpp b/lib/MC/MCDwarf.cpp
index 2b5bb61..83b6b4f 100644
--- a/lib/MC/MCDwarf.cpp
+++ b/lib/MC/MCDwarf.cpp
@@ -1763,6 +1763,20 @@
         IsSimple(Frame.IsSimple), RAReg(Frame.RAReg),
         IsBKeyFrame(Frame.IsBKeyFrame) {}
 
+  StringRef PersonalityName() const {
+    if (!Personality)
+      return StringRef();
+    return Personality->getName();
+  }
+
+  bool operator<(const CIEKey &Other) const {
+    return std::make_tuple(PersonalityName(), PersonalityEncoding, LsdaEncoding,
+                           IsSignalFrame, IsSimple, RAReg) <
+           std::make_tuple(Other.PersonalityName(), Other.PersonalityEncoding,
+                           Other.LsdaEncoding, Other.IsSignalFrame,
+                           Other.IsSimple, Other.RAReg);
+  }
+
   const MCSymbol *Personality;
   unsigned PersonalityEncoding;
   unsigned LsdaEncoding;
@@ -1840,7 +1854,17 @@
 
   const MCSymbol *DummyDebugKey = nullptr;
   bool CanOmitDwarf = MOFI->getOmitDwarfIfHaveCompactUnwind();
-  for (auto I = FrameArray.begin(), E = FrameArray.end(); I != E;) {
+  // Sort the FDEs by their corresponding CIE before we emit them.
+  // This isn't technically necessary according to the DWARF standard,
+  // but the Android libunwindstack rejects eh_frame sections where
+  // an FDE refers to a CIE other than the closest previous CIE.
+  std::vector<MCDwarfFrameInfo> FrameArrayX(FrameArray.begin(), FrameArray.end());
+  std::stable_sort(
+      FrameArrayX.begin(), FrameArrayX.end(),
+      [&](const MCDwarfFrameInfo &X, const MCDwarfFrameInfo &Y) -> bool {
+        return CIEKey(X) < CIEKey(Y);
+      });
+  for (auto I = FrameArrayX.begin(), E = FrameArrayX.end(); I != E;) {
     const MCDwarfFrameInfo &Frame = *I;
     ++I;
     if (CanOmitDwarf && Frame.CompactUnwindEncoding !=
diff --git a/test/CodeGen/AArch64/arm64-big-endian-eh.ll b/test/CodeGen/AArch64/arm64-big-endian-eh.ll
index 77d52e3..b387209 100644
--- a/test/CodeGen/AArch64/arm64-big-endian-eh.ll
+++ b/test/CodeGen/AArch64/arm64-big-endian-eh.ll
@@ -69,5 +69,7 @@
 declare void @_ZSt9terminatev()
 
 ; CHECK-LABEL: Contents of section .eh_frame:
+; CHECK-NEXT: {{^ 0000}}
+; CHECK-NEXT: {{^ 0010}}
 ; CHECK-NEXT: 0000 0000001c
 
diff --git a/test/MC/ELF/cfi-signal-frame.s b/test/MC/ELF/cfi-signal-frame.s
index 334cdb4..63244f3 100644
--- a/test/MC/ELF/cfi-signal-frame.s
+++ b/test/MC/ELF/cfi-signal-frame.s
@@ -23,11 +23,11 @@
 // CHECK-NEXT:     AddressAlignment: 8
 // CHECK-NEXT:     EntrySize: 0
 // CHECK-NEXT:     SectionData (
-// CHECK-NEXT:       0000: 14000000 00000000 017A5253 00017810
-// CHECK-NEXT:       0010: 011B0C07 08900100 10000000 1C000000
-// CHECK-NEXT:       0020: 00000000 00000000 00000000 14000000
-// CHECK-NEXT:       0030: 00000000 017A5200 01781001 1B0C0708
-// CHECK-NEXT:       0040: 90010000 10000000 1C000000 00000000
-// CHECK-NEXT:       0050: 00000000 00000000
+// CHECK-NEXT:       0000: 14000000 00000000 017A5200 01781001  |.........zR..x..|
+// CHECK-NEXT:       0010: 1B0C0708 90010000 10000000 1C000000  |................|
+// CHECK-NEXT:       0020: 00000000 00000000 00000000 14000000  |................|
+// CHECK-NEXT:       0030: 00000000 017A5253 00017810 011B0C07  |.....zRS..x.....|
+// CHECK-NEXT:       0040: 08900100 10000000 1C000000 00000000  |................|
+// CHECK-NEXT:       0050: 00000000 00000000                    |........|
 // CHECK-NEXT:     )
 // CHECK-NEXT:   }
diff --git a/test/MC/ELF/cfi.s b/test/MC/ELF/cfi.s
index 1e9a39d..abc987d 100644
--- a/test/MC/ELF/cfi.s
+++ b/test/MC/ELF/cfi.s
@@ -234,119 +234,117 @@
 // CHECK-NEXT:     Relocations [
 // CHECK-NEXT:     ]
 // CHECK-NEXT:     SectionData (
-// CHECK-NEXT:       0000: 14000000 00000000 017A4C52 00017810
-// CHECK-NEXT:       0010: 02031B0C 07089001 14000000 1C000000
-// CHECK-NEXT:       0020: 00000000 01000000 04000000 00000000
-// CHECK-NEXT:       0030: 20000000 00000000 017A504C 52000178
-// CHECK-NEXT:       0040: 100B0000 00000000 00000003 1B0C0708
-// CHECK-NEXT:       0050: 90010000 14000000 28000000 00000000
-// CHECK-NEXT:       0060: 01000000 04000000 00000000 14000000
-// CHECK-NEXT:       0070: 70000000 00000000 01000000 04000000
-// CHECK-NEXT:       0080: 00000000 20000000 00000000 017A504C
-// CHECK-NEXT:       0090: 52000178 100B0000 00000000 00000002
-// CHECK-NEXT:       00A0: 1B0C0708 90010000 10000000 28000000
-// CHECK-NEXT:       00B0: 00000000 01000000 02000000 18000000
-// CHECK-NEXT:       00C0: 00000000 017A5052 00017810 04020000
-// CHECK-NEXT:       00D0: 1B0C0708 90010000 10000000 20000000
-// CHECK-NEXT:       00E0: 00000000 01000000 00000000 18000000
-// CHECK-NEXT:       00F0: 00000000 017A5052 00017810 06030000
-// CHECK-NEXT:       0100: 00001B0C 07089001 10000000 20000000
-// CHECK-NEXT:       0110: 00000000 01000000 00000000 1C000000
-// CHECK-NEXT:       0120: 00000000 017A5052 00017810 0A040000
-// CHECK-NEXT:       0130: 00000000 00001B0C 07089001 10000000
-// CHECK-NEXT:       0140: 24000000 00000000 01000000 00000000
-// CHECK-NEXT:       0150: 18000000 00000000 017A5052 00017810
-// CHECK-NEXT:       0160: 040A0000 1B0C0708 90010000 10000000
-// CHECK-NEXT:       0170: 20000000 00000000 01000000 00000000
-// CHECK-NEXT:       0180: 18000000 00000000 017A5052 00017810
-// CHECK-NEXT:       0190: 060B0000 00001B0C 07089001 10000000
-// CHECK-NEXT:       01A0: 20000000 00000000 01000000 00000000
-// CHECK-NEXT:       01B0: 1C000000 00000000 017A5052 00017810
-// CHECK-NEXT:       01C0: 0A0C0000 00000000 00001B0C 07089001
-// CHECK-NEXT:       01D0: 10000000 24000000 00000000 01000000
-// CHECK-NEXT:       01E0: 00000000 1C000000 00000000 017A5052
-// CHECK-NEXT:       01F0: 00017810 0A080000 00000000 00001B0C
-// CHECK-NEXT:       0200: 07089001 10000000 24000000 00000000
-// CHECK-NEXT:       0210: 01000000 00000000 1C000000 00000000
-// CHECK-NEXT:       0220: 017A5052 00017810 0A100000 00000000
-// CHECK-NEXT:       0230: 00001B0C 07089001 10000000 24000000
-// CHECK-NEXT:       0240: 00000000 01000000 00000000 18000000
-// CHECK-NEXT:       0250: 00000000 017A5052 00017810 04120000
-// CHECK-NEXT:       0260: 1B0C0708 90010000 10000000 20000000
-// CHECK-NEXT:       0270: 00000000 01000000 00000000 18000000
-// CHECK-NEXT:       0280: 00000000 017A5052 00017810 06130000
-// CHECK-NEXT:       0290: 00001B0C 07089001 10000000 20000000
-// CHECK-NEXT:       02A0: 00000000 01000000 00000000 1C000000
-// CHECK-NEXT:       02B0: 00000000 017A5052 00017810 0A140000
-// CHECK-NEXT:       02C0: 00000000 00001B0C 07089001 10000000
-// CHECK-NEXT:       02D0: 24000000 00000000 01000000 00000000
-// CHECK-NEXT:       02E0: 18000000 00000000 017A5052 00017810
-// CHECK-NEXT:       02F0: 041A0000 1B0C0708 90010000 10000000
-// CHECK-NEXT:       0300: 20000000 00000000 01000000 00000000
-// CHECK-NEXT:       0310: 18000000 00000000 017A5052 00017810
-// CHECK-NEXT:       0320: 061B0000 00001B0C 07089001 10000000
-// CHECK-NEXT:       0330: 20000000 00000000 01000000 00000000
-// CHECK-NEXT:       0340: 1C000000 00000000 017A5052 00017810
-// CHECK-NEXT:       0350: 0A1C0000 00000000 00001B0C 07089001
-// CHECK-NEXT:       0360: 10000000 24000000 00000000 01000000
-// CHECK-NEXT:       0370: 00000000 1C000000 00000000 017A5052
-// CHECK-NEXT:       0380: 00017810 0A180000 00000000 00001B0C
-// CHECK-NEXT:       0390: 07089001 10000000 24000000 00000000
-// CHECK-NEXT:       03A0: 01000000 00000000 1C000000 00000000
-// CHECK-NEXT:       03B0: 017A5052 00017810 0A800000 00000000
-// CHECK-NEXT:       03C0: 00001B0C 07089001 10000000 24000000
-// CHECK-NEXT:       03D0: 00000000 01000000 00000000 18000000
-// CHECK-NEXT:       03E0: 00000000 017A5052 00017810 04820000
-// CHECK-NEXT:       03F0: 1B0C0708 90010000 10000000 20000000
-// CHECK-NEXT:       0400: 00000000 01000000 00000000 18000000
-// CHECK-NEXT:       0410: 00000000 017A5052 00017810 06830000
-// CHECK-NEXT:       0420: 00001B0C 07089001 10000000 20000000
-// CHECK-NEXT:       0430: 00000000 01000000 00000000 1C000000
-// CHECK-NEXT:       0440: 00000000 017A5052 00017810 0A840000
-// CHECK-NEXT:       0450: 00000000 00001B0C 07089001 10000000
-// CHECK-NEXT:       0460: 24000000 00000000 01000000 00000000
-// CHECK-NEXT:       0470: 18000000 00000000 017A5052 00017810
-// CHECK-NEXT:       0480: 048A0000 1B0C0708 90010000 10000000
-// CHECK-NEXT:       0490: 20000000 00000000 01000000 00000000
-// CHECK-NEXT:       04A0: 18000000 00000000 017A5052 00017810
-// CHECK-NEXT:       04B0: 068B0000 00001B0C 07089001 10000000
-// CHECK-NEXT:       04C0: 20000000 00000000 01000000 00000000
-// CHECK-NEXT:       04D0: 1C000000 00000000 017A5052 00017810
-// CHECK-NEXT:       04E0: 0A8C0000 00000000 00001B0C 07089001
-// CHECK-NEXT:       04F0: 10000000 24000000 00000000 01000000
-// CHECK-NEXT:       0500: 00000000 1C000000 00000000 017A5052
-// CHECK-NEXT:       0510: 00017810 0A880000 00000000 00001B0C
-// CHECK-NEXT:       0520: 07089001 10000000 24000000 00000000
-// CHECK-NEXT:       0530: 01000000 00000000 1C000000 00000000
-// CHECK-NEXT:       0540: 017A5052 00017810 0A900000 00000000
-// CHECK-NEXT:       0550: 00001B0C 07089001 10000000 24000000
-// CHECK-NEXT:       0560: 00000000 01000000 00000000 18000000
-// CHECK-NEXT:       0570: 00000000 017A5052 00017810 04920000
-// CHECK-NEXT:       0580: 1B0C0708 90010000 10000000 20000000
-// CHECK-NEXT:       0590: 00000000 01000000 00000000 18000000
-// CHECK-NEXT:       05A0: 00000000 017A5052 00017810 06930000
-// CHECK-NEXT:       05B0: 00001B0C 07089001 10000000 20000000
-// CHECK-NEXT:       05C0: 00000000 01000000 00000000 1C000000
-// CHECK-NEXT:       05D0: 00000000 017A5052 00017810 0A940000
-// CHECK-NEXT:       05E0: 00000000 00001B0C 07089001 10000000
-// CHECK-NEXT:       05F0: 24000000 00000000 01000000 00000000
-// CHECK-NEXT:       0600: 18000000 00000000 017A5052 00017810
-// CHECK-NEXT:       0610: 049A0000 1B0C0708 90010000 10000000
-// CHECK-NEXT:       0620: 20000000 00000000 01000000 00000000
-// CHECK-NEXT:       0630: 18000000 00000000 017A5052 00017810
-// CHECK-NEXT:       0640: 069B0000 00001B0C 07089001 10000000
-// CHECK-NEXT:       0650: 20000000 00000000 01000000 00000000
-// CHECK-NEXT:       0660: 1C000000 00000000 017A5052 00017810
-// CHECK-NEXT:       0670: 0A9C0000 00000000 00001B0C 07089001
-// CHECK-NEXT:       0680: 10000000 24000000 00000000 01000000
-// CHECK-NEXT:       0690: 00000000 1C000000 00000000 017A5052
-// CHECK-NEXT:       06A0: 00017810 0A980000 00000000 00001B0C
-// CHECK-NEXT:       06B0: 07089001 10000000 24000000 00000000
-// CHECK-NEXT:       06C0: 01000000 00000000 10000000 00000000
-// CHECK-NEXT:       06D0: 017A5200 01781001 1B000000 10000000
-// CHECK-NEXT:       06E0: 18000000 00000000 01000000 00000000
-// CHECK-NEXT:     )
-// CHECK-NEXT:   }
+// CHECK-NEXT:       0000: 10000000 00000000 017A5200 01781001  |.........zR..x..|
+// CHECK-NEXT:       0010: 1B000000 10000000 18000000 00000000  |................|
+// CHECK-NEXT:       0020: 01000000 00000000 14000000 00000000  |................|
+// CHECK-NEXT:       0030: 017A4C52 00017810 02031B0C 07089001  |.zLR..x.........|
+// CHECK-NEXT:       0040: 14000000 1C000000 00000000 01000000  |................|
+// CHECK-NEXT:       0050: 04000000 00000000 14000000 34000000  |............4...|
+// CHECK-NEXT:       0060: 00000000 01000000 04000000 00000000  |................|
+// CHECK-NEXT:       0070: 20000000 00000000 017A504C 52000178  | ........zPLR..x|
+// CHECK-NEXT:       0080: 100B0000 00000000 00000002 1B0C0708  |................|
+// CHECK-NEXT:       0090: 90010000 10000000 28000000 00000000  |........(.......|
+// CHECK-NEXT:       00A0: 01000000 02000000 20000000 00000000  |........ .......|
+// CHECK-NEXT:       00B0: 017A504C 52000178 100B0000 00000000  |.zPLR..x........|
+// CHECK-NEXT:       00C0: 00000003 1B0C0708 90010000 14000000  |................|
+// CHECK-NEXT:       00D0: 28000000 00000000 01000000 04000000  |(...............|
+// CHECK-NEXT:       00E0: 00000000 18000000 00000000 017A5052  |.............zPR|
+// CHECK-NEXT:       00F0: 00017810 04020000 1B0C0708 90010000  |..x.............|
+// CHECK-NEXT:       0100: 10000000 20000000 00000000 01000000  |.... ...........|
+// CHECK-NEXT:       0110: 00000000 18000000 00000000 017A5052  |.............zPR|
+// CHECK-NEXT:       0120: 00017810 06030000 00001B0C 07089001  |..x.............|
+// CHECK-NEXT:       0130: 10000000 20000000 00000000 01000000  |.... ...........|
+// CHECK-NEXT:       0140: 00000000 1C000000 00000000 017A5052  |.............zPR|
+// CHECK-NEXT:       0150: 00017810 0A040000 00000000 00001B0C  |..x.............|
+// CHECK-NEXT:       0160: 07089001 10000000 24000000 00000000  |........$.......|
+// CHECK-NEXT:       0170: 01000000 00000000 1C000000 00000000  |................|
+// CHECK-NEXT:       0180: 017A5052 00017810 0A080000 00000000  |.zPR..x.........|
+// CHECK-NEXT:       0190: 00001B0C 07089001 10000000 24000000  |............$...|
+// CHECK-NEXT:       01A0: 00000000 01000000 00000000 18000000  |................|
+// CHECK-NEXT:       01B0: 00000000 017A5052 00017810 040A0000  |.....zPR..x.....|
+// CHECK-NEXT:       01C0: 1B0C0708 90010000 10000000 20000000  |............ ...|
+// CHECK-NEXT:       01D0: 00000000 01000000 00000000 18000000  |................|
+// CHECK-NEXT:       01E0: 00000000 017A5052 00017810 060B0000  |.....zPR..x.....|
+// CHECK-NEXT:       01F0: 00001B0C 07089001 10000000 20000000  |............ ...|
+// CHECK-NEXT:       0200: 00000000 01000000 00000000 1C000000  |................|
+// CHECK-NEXT:       0210: 00000000 017A5052 00017810 0A0C0000  |.....zPR..x.....|
+// CHECK-NEXT:       0220: 00000000 00001B0C 07089001 10000000  |................|
+// CHECK-NEXT:       0230: 24000000 00000000 01000000 00000000  |$...............|
+// CHECK-NEXT:       0240: 1C000000 00000000 017A5052 00017810  |.........zPR..x.|
+// CHECK-NEXT:       0250: 0A100000 00000000 00001B0C 07089001  |................|
+// CHECK-NEXT:       0260: 10000000 24000000 00000000 01000000  |....$...........|
+// CHECK-NEXT:       0270: 00000000 18000000 00000000 017A5052  |.............zPR|
+// CHECK-NEXT:       0280: 00017810 04120000 1B0C0708 90010000  |..x.............|
+// CHECK-NEXT:       0290: 10000000 20000000 00000000 01000000  |.... ...........|
+// CHECK-NEXT:       02A0: 00000000 18000000 00000000 017A5052  |.............zPR|
+// CHECK-NEXT:       02B0: 00017810 06130000 00001B0C 07089001  |..x.............|
+// CHECK-NEXT:       02C0: 10000000 20000000 00000000 01000000  |.... ...........|
+// CHECK-NEXT:       02D0: 00000000 1C000000 00000000 017A5052  |.............zPR|
+// CHECK-NEXT:       02E0: 00017810 0A140000 00000000 00001B0C  |..x.............|
+// CHECK-NEXT:       02F0: 07089001 10000000 24000000 00000000  |........$.......|
+// CHECK-NEXT:       0300: 01000000 00000000 1C000000 00000000  |................|
+// CHECK-NEXT:       0310: 017A5052 00017810 0A180000 00000000  |.zPR..x.........|
+// CHECK-NEXT:       0320: 00001B0C 07089001 10000000 24000000  |............$...|
+// CHECK-NEXT:       0330: 00000000 01000000 00000000 18000000  |................|
+// CHECK-NEXT:       0340: 00000000 017A5052 00017810 041A0000  |.....zPR..x.....|
+// CHECK-NEXT:       0350: 1B0C0708 90010000 10000000 20000000  |............ ...|
+// CHECK-NEXT:       0360: 00000000 01000000 00000000 18000000  |................|
+// CHECK-NEXT:       0370: 00000000 017A5052 00017810 061B0000  |.....zPR..x.....|
+// CHECK-NEXT:       0380: 00001B0C 07089001 10000000 20000000  |............ ...|
+// CHECK-NEXT:       0390: 00000000 01000000 00000000 1C000000  |................|
+// CHECK-NEXT:       03A0: 00000000 017A5052 00017810 0A1C0000  |.....zPR..x.....|
+// CHECK-NEXT:       03B0: 00000000 00001B0C 07089001 10000000  |................|
+// CHECK-NEXT:       03C0: 24000000 00000000 01000000 00000000  |$...............|
+// CHECK-NEXT:       03D0: 1C000000 00000000 017A5052 00017810  |.........zPR..x.|
+// CHECK-NEXT:       03E0: 0A800000 00000000 00001B0C 07089001  |................|
+// CHECK-NEXT:       03F0: 10000000 24000000 00000000 01000000  |....$...........|
+// CHECK-NEXT:       0400: 00000000 18000000 00000000 017A5052  |.............zPR|
+// CHECK-NEXT:       0410: 00017810 04820000 1B0C0708 90010000  |..x.............|
+// CHECK-NEXT:       0420: 10000000 20000000 00000000 01000000  |.... ...........|
+// CHECK-NEXT:       0430: 00000000 18000000 00000000 017A5052  |.............zPR|
+// CHECK-NEXT:       0440: 00017810 06830000 00001B0C 07089001  |..x.............|
+// CHECK-NEXT:       0450: 10000000 20000000 00000000 01000000  |.... ...........|
+// CHECK-NEXT:       0460: 00000000 1C000000 00000000 017A5052  |.............zPR|
+// CHECK-NEXT:       0470: 00017810 0A840000 00000000 00001B0C  |..x.............|
+// CHECK-NEXT:       0480: 07089001 10000000 24000000 00000000  |........$.......|
+// CHECK-NEXT:       0490: 01000000 00000000 1C000000 00000000  |................|
+// CHECK-NEXT:       04A0: 017A5052 00017810 0A880000 00000000  |.zPR..x.........|
+// CHECK-NEXT:       04B0: 00001B0C 07089001 10000000 24000000  |............$...|
+// CHECK-NEXT:       04C0: 00000000 01000000 00000000 18000000  |................|
+// CHECK-NEXT:       04D0: 00000000 017A5052 00017810 048A0000  |.....zPR..x.....|
+// CHECK-NEXT:       04E0: 1B0C0708 90010000 10000000 20000000  |............ ...|
+// CHECK-NEXT:       04F0: 00000000 01000000 00000000 18000000  |................|
+// CHECK-NEXT:       0500: 00000000 017A5052 00017810 068B0000  |.....zPR..x.....|
+// CHECK-NEXT:       0510: 00001B0C 07089001 10000000 20000000  |............ ...|
+// CHECK-NEXT:       0520: 00000000 01000000 00000000 1C000000  |................|
+// CHECK-NEXT:       0530: 00000000 017A5052 00017810 0A8C0000  |.....zPR..x.....|
+// CHECK-NEXT:       0540: 00000000 00001B0C 07089001 10000000  |................|
+// CHECK-NEXT:       0550: 24000000 00000000 01000000 00000000  |$...............|
+// CHECK-NEXT:       0560: 1C000000 00000000 017A5052 00017810  |.........zPR..x.|
+// CHECK-NEXT:       0570: 0A900000 00000000 00001B0C 07089001  |................|
+// CHECK-NEXT:       0580: 10000000 24000000 00000000 01000000  |....$...........|
+// CHECK-NEXT:       0590: 00000000 18000000 00000000 017A5052  |.............zPR|
+// CHECK-NEXT:       05A0: 00017810 04920000 1B0C0708 90010000  |..x.............|
+// CHECK-NEXT:       05B0: 10000000 20000000 00000000 01000000  |.... ...........|
+// CHECK-NEXT:       05C0: 00000000 18000000 00000000 017A5052  |.............zPR|
+// CHECK-NEXT:       05D0: 00017810 06930000 00001B0C 07089001  |..x.............|
+// CHECK-NEXT:       05E0: 10000000 20000000 00000000 01000000  |.... ...........|
+// CHECK-NEXT:       05F0: 00000000 1C000000 00000000 017A5052  |.............zPR|
+// CHECK-NEXT:       0600: 00017810 0A940000 00000000 00001B0C  |..x.............|
+// CHECK-NEXT:       0610: 07089001 10000000 24000000 00000000  |........$.......|
+// CHECK-NEXT:       0620: 01000000 00000000 1C000000 00000000  |................|
+// CHECK-NEXT:       0630: 017A5052 00017810 0A980000 00000000  |.zPR..x.........|
+// CHECK-NEXT:       0640: 00001B0C 07089001 10000000 24000000  |............$...|
+// CHECK-NEXT:       0650: 00000000 01000000 00000000 18000000  |................|
+// CHECK-NEXT:       0660: 00000000 017A5052 00017810 049A0000  |.....zPR..x.....|
+// CHECK-NEXT:       0670: 1B0C0708 90010000 10000000 20000000  |............ ...|
+// CHECK-NEXT:       0680: 00000000 01000000 00000000 18000000  |................|
+// CHECK-NEXT:       0690: 00000000 017A5052 00017810 069B0000  |.....zPR..x.....|
+// CHECK-NEXT:       06A0: 00001B0C 07089001 10000000 20000000  |............ ...|
+// CHECK-NEXT:       06B0: 00000000 01000000 00000000 1C000000  |................|
+// CHECK-NEXT:       06C0: 00000000 017A5052 00017810 0A9C0000  |.....zPR..x.....|
+// CHECK-NEXT:       06D0: 00000000 00001B0C 07089001 10000000  |................|
+// CHECK-NEXT:       06E0: 24000000 00000000 01000000 00000000  |$...............|
 
 // CHECK:        Section {
 // CHECK:          Index:
@@ -362,78 +360,78 @@
 // CHECK-NEXT:     AddressAlignment: 8
 // CHECK-NEXT:     EntrySize: 24
 // CHECK-NEXT:     Relocations [
-// CHECK-NEXT:       0x20  R_X86_64_PC32 .text 0x0
-// CHECK-NEXT:       0x29  R_X86_64_32   bar   0x0
-// CHECK-NEXT:       0x43  R_X86_64_64   foo   0x0
-// CHECK-NEXT:       0x5C  R_X86_64_PC32 .text 0x1
-// CHECK-NEXT:       0x65  R_X86_64_32   bar   0x0
-// CHECK-NEXT:       0x74  R_X86_64_PC32 .text 0x2
-// CHECK-NEXT:       0x7D  R_X86_64_32   bar   0x0
-// CHECK-NEXT:       0x97  R_X86_64_64   foo   0x0
-// CHECK-NEXT:       0xB0  R_X86_64_PC32 .text 0x3
-// CHECK-NEXT:       0xB9  R_X86_64_16   bar   0x0
-// CHECK-NEXT:       0xCE  R_X86_64_16   foo   0x0
-// CHECK-NEXT:       0xE0  R_X86_64_PC32 .text 0x4
-// CHECK-NEXT:       0xFE  R_X86_64_32   foo   0x0
-// CHECK-NEXT:       0x110 R_X86_64_PC32 .text 0x5
-// CHECK-NEXT:       0x12E R_X86_64_64   foo   0x0
-// CHECK-NEXT:       0x144 R_X86_64_PC32 .text 0x6
-// CHECK-NEXT:       0x162 R_X86_64_16   foo   0x0
-// CHECK-NEXT:       0x174 R_X86_64_PC32 .text 0x7
-// CHECK-NEXT:       0x192 R_X86_64_32   foo   0x0
-// CHECK-NEXT:       0x1A4 R_X86_64_PC32 .text 0x8
-// CHECK-NEXT:       0x1C2 R_X86_64_64   foo   0x0
-// CHECK-NEXT:       0x1D8 R_X86_64_PC32 .text 0x9
-// CHECK-NEXT:       0x1F6 R_X86_64_64   foo   0x0
-// CHECK-NEXT:       0x20C R_X86_64_PC32 .text 0xA
-// CHECK-NEXT:       0x22A R_X86_64_PC64 foo   0x0
-// CHECK-NEXT:       0x240 R_X86_64_PC32 .text 0xB
-// CHECK-NEXT:       0x25E R_X86_64_PC16 foo   0x0
-// CHECK-NEXT:       0x270 R_X86_64_PC32 .text 0xC
-// CHECK-NEXT:       0x28E R_X86_64_PC32 foo   0x0
-// CHECK-NEXT:       0x2A0 R_X86_64_PC32 .text 0xD
-// CHECK-NEXT:       0x2BE R_X86_64_PC64 foo   0x0
-// CHECK-NEXT:       0x2D4 R_X86_64_PC32 .text 0xE
-// CHECK-NEXT:       0x2F2 R_X86_64_PC16 foo   0x0
-// CHECK-NEXT:       0x304 R_X86_64_PC32 .text 0xF
-// CHECK-NEXT:       0x322 R_X86_64_PC32 foo   0x0
-// CHECK-NEXT:       0x334 R_X86_64_PC32 .text 0x10
-// CHECK-NEXT:       0x352 R_X86_64_PC64 foo   0x0
-// CHECK-NEXT:       0x368 R_X86_64_PC32 .text 0x11
-// CHECK-NEXT:       0x386 R_X86_64_PC64 foo   0x0
-// CHECK-NEXT:       0x39C R_X86_64_PC32 .text 0x12
-// CHECK-NEXT:       0x3BA R_X86_64_64   foo   0x0
-// CHECK-NEXT:       0x3D0 R_X86_64_PC32 .text 0x13
-// CHECK-NEXT:       0x3EE R_X86_64_16   foo   0x0
-// CHECK-NEXT:       0x400 R_X86_64_PC32 .text 0x14
-// CHECK-NEXT:       0x41E R_X86_64_32   foo   0x0
-// CHECK-NEXT:       0x430 R_X86_64_PC32 .text 0x15
-// CHECK-NEXT:       0x44E R_X86_64_64   foo   0x0
-// CHECK-NEXT:       0x464 R_X86_64_PC32 .text 0x16
-// CHECK-NEXT:       0x482 R_X86_64_16   foo   0x0
-// CHECK-NEXT:       0x494 R_X86_64_PC32 .text 0x17
-// CHECK-NEXT:       0x4B2 R_X86_64_32   foo   0x0
-// CHECK-NEXT:       0x4C4 R_X86_64_PC32 .text 0x18
-// CHECK-NEXT:       0x4E2 R_X86_64_64   foo   0x0
-// CHECK-NEXT:       0x4F8 R_X86_64_PC32 .text 0x19
-// CHECK-NEXT:       0x516 R_X86_64_64   foo   0x0
-// CHECK-NEXT:       0x52C R_X86_64_PC32 .text 0x1A
-// CHECK-NEXT:       0x54A R_X86_64_PC64 foo   0x0
-// CHECK-NEXT:       0x560 R_X86_64_PC32 .text 0x1B
-// CHECK-NEXT:       0x57E R_X86_64_PC16 foo   0x0
-// CHECK-NEXT:       0x590 R_X86_64_PC32 .text 0x1C
-// CHECK-NEXT:       0x5AE R_X86_64_PC32 foo   0x0
-// CHECK-NEXT:       0x5C0 R_X86_64_PC32 .text 0x1D
-// CHECK-NEXT:       0x5DE R_X86_64_PC64 foo   0x0
-// CHECK-NEXT:       0x5F4 R_X86_64_PC32 .text 0x1E
-// CHECK-NEXT:       0x612 R_X86_64_PC16 foo   0x0
-// CHECK-NEXT:       0x624 R_X86_64_PC32 .text 0x1F
-// CHECK-NEXT:       0x642 R_X86_64_PC32 foo   0x0
-// CHECK-NEXT:       0x654 R_X86_64_PC32 .text 0x20
-// CHECK-NEXT:       0x672 R_X86_64_PC64 foo   0x0
-// CHECK-NEXT:       0x688 R_X86_64_PC32 .text 0x21
-// CHECK-NEXT:       0x6A6 R_X86_64_PC64 foo   0x0
-// CHECK-NEXT:       0x6BC R_X86_64_PC32 .text 0x22
-// CHECK-NEXT:       0x6E4 R_X86_64_PC32 .text 0x23
+// CHECK-NEXT:       0x1C R_X86_64_PC32 .text 0x23
+// CHECK-NEXT:       0x48 R_X86_64_PC32 .text 0x0
+// CHECK-NEXT:       0x51 R_X86_64_32 bar 0x0
+// CHECK-NEXT:       0x60 R_X86_64_PC32 .text 0x2
+// CHECK-NEXT:       0x69 R_X86_64_32 bar 0x0
+// CHECK-NEXT:       0x83 R_X86_64_64 foo 0x0
+// CHECK-NEXT:       0x9C R_X86_64_PC32 .text 0x3
+// CHECK-NEXT:       0xA5 R_X86_64_16 bar 0x0
+// CHECK-NEXT:       0xBB R_X86_64_64 foo 0x0
+// CHECK-NEXT:       0xD4 R_X86_64_PC32 .text 0x1
+// CHECK-NEXT:       0xDD R_X86_64_32 bar 0x0
+// CHECK-NEXT:       0xF6 R_X86_64_16 foo 0x0
+// CHECK-NEXT:       0x108 R_X86_64_PC32 .text 0x4
+// CHECK-NEXT:       0x126 R_X86_64_32 foo 0x0
+// CHECK-NEXT:       0x138 R_X86_64_PC32 .text 0x5
+// CHECK-NEXT:       0x156 R_X86_64_64 foo 0x0
+// CHECK-NEXT:       0x16C R_X86_64_PC32 .text 0x6
+// CHECK-NEXT:       0x18A R_X86_64_64 foo 0x0
+// CHECK-NEXT:       0x1A0 R_X86_64_PC32 .text 0xA
+// CHECK-NEXT:       0x1BE R_X86_64_16 foo 0x0
+// CHECK-NEXT:       0x1D0 R_X86_64_PC32 .text 0x7
+// CHECK-NEXT:       0x1EE R_X86_64_32 foo 0x0
+// CHECK-NEXT:       0x200 R_X86_64_PC32 .text 0x8
+// CHECK-NEXT:       0x21E R_X86_64_64 foo 0x0
+// CHECK-NEXT:       0x234 R_X86_64_PC32 .text 0x9
+// CHECK-NEXT:       0x252 R_X86_64_PC64 foo 0x0
+// CHECK-NEXT:       0x268 R_X86_64_PC32 .text 0xB
+// CHECK-NEXT:       0x286 R_X86_64_PC16 foo 0x0
+// CHECK-NEXT:       0x298 R_X86_64_PC32 .text 0xC
+// CHECK-NEXT:       0x2B6 R_X86_64_PC32 foo 0x0
+// CHECK-NEXT:       0x2C8 R_X86_64_PC32 .text 0xD
+// CHECK-NEXT:       0x2E6 R_X86_64_PC64 foo 0x0
+// CHECK-NEXT:       0x2FC R_X86_64_PC32 .text 0xE
+// CHECK-NEXT:       0x31A R_X86_64_PC64 foo 0x0
+// CHECK-NEXT:       0x330 R_X86_64_PC32 .text 0x12
+// CHECK-NEXT:       0x34E R_X86_64_PC16 foo 0x0
+// CHECK-NEXT:       0x360 R_X86_64_PC32 .text 0xF
+// CHECK-NEXT:       0x37E R_X86_64_PC32 foo 0x0
+// CHECK-NEXT:       0x390 R_X86_64_PC32 .text 0x10
+// CHECK-NEXT:       0x3AE R_X86_64_PC64 foo 0x0
+// CHECK-NEXT:       0x3C4 R_X86_64_PC32 .text 0x11
+// CHECK-NEXT:       0x3E2 R_X86_64_64 foo 0x0
+// CHECK-NEXT:       0x3F8 R_X86_64_PC32 .text 0x13
+// CHECK-NEXT:       0x416 R_X86_64_16 foo 0x0
+// CHECK-NEXT:       0x428 R_X86_64_PC32 .text 0x14
+// CHECK-NEXT:       0x446 R_X86_64_32 foo 0x0
+// CHECK-NEXT:       0x458 R_X86_64_PC32 .text 0x15
+// CHECK-NEXT:       0x476 R_X86_64_64 foo 0x0
+// CHECK-NEXT:       0x48C R_X86_64_PC32 .text 0x16
+// CHECK-NEXT:       0x4AA R_X86_64_64 foo 0x0
+// CHECK-NEXT:       0x4C0 R_X86_64_PC32 .text 0x1A
+// CHECK-NEXT:       0x4DE R_X86_64_16 foo 0x0
+// CHECK-NEXT:       0x4F0 R_X86_64_PC32 .text 0x17
+// CHECK-NEXT:       0x50E R_X86_64_32 foo 0x0
+// CHECK-NEXT:       0x520 R_X86_64_PC32 .text 0x18
+// CHECK-NEXT:       0x53E R_X86_64_64 foo 0x0
+// CHECK-NEXT:       0x554 R_X86_64_PC32 .text 0x19
+// CHECK-NEXT:       0x572 R_X86_64_PC64 foo 0x0
+// CHECK-NEXT:       0x588 R_X86_64_PC32 .text 0x1B
+// CHECK-NEXT:       0x5A6 R_X86_64_PC16 foo 0x0
+// CHECK-NEXT:       0x5B8 R_X86_64_PC32 .text 0x1C
+// CHECK-NEXT:       0x5D6 R_X86_64_PC32 foo 0x0
+// CHECK-NEXT:       0x5E8 R_X86_64_PC32 .text 0x1D
+// CHECK-NEXT:       0x606 R_X86_64_PC64 foo 0x0
+// CHECK-NEXT:       0x61C R_X86_64_PC32 .text 0x1E
+// CHECK-NEXT:       0x63A R_X86_64_PC64 foo 0x0
+// CHECK-NEXT:       0x650 R_X86_64_PC32 .text 0x22
+// CHECK-NEXT:       0x66E R_X86_64_PC16 foo 0x0
+// CHECK-NEXT:       0x680 R_X86_64_PC32 .text 0x1F
+// CHECK-NEXT:       0x69E R_X86_64_PC32 foo 0x0
+// CHECK-NEXT:       0x6B0 R_X86_64_PC32 .text 0x20
+// CHECK-NEXT:       0x6CE R_X86_64_PC64 foo 0x0
+// CHECK-NEXT:       0x6E4 R_X86_64_PC32 .text 0x21
 // CHECK-NEXT:     ]
 // CHECK:        }