[llvm] r309492 - MC: account for the return column in the CIE key

Saleem Abdulrasool via llvm-commits llvm-commits at lists.llvm.org
Sat Jul 29 13:03:01 PDT 2017


Author: compnerd
Date: Sat Jul 29 13:03:00 2017
New Revision: 309492

URL: http://llvm.org/viewvc/llvm-project?rev=309492&view=rev
Log:
MC: account for the return column in the CIE key

If the return column is different, we cannot coalesce the CIE across the
FDEs.  Add that to the key calculation.  This ensures that we emit a
separate CIE.

Modified:
    llvm/trunk/lib/MC/MCDwarf.cpp
    llvm/trunk/test/Assembler/return-column.s

Modified: llvm/trunk/lib/MC/MCDwarf.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCDwarf.cpp?rev=309492&r1=309491&r2=309492&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCDwarf.cpp (original)
+++ llvm/trunk/lib/MC/MCDwarf.cpp Sat Jul 29 13:03:00 2017
@@ -1465,24 +1465,26 @@ namespace {
 
 struct CIEKey {
   static const CIEKey getEmptyKey() {
-    return CIEKey(nullptr, 0, -1, false, false);
+    return CIEKey(nullptr, 0, -1, false, false, static_cast<unsigned>(INT_MAX));
   }
 
   static const CIEKey getTombstoneKey() {
-    return CIEKey(nullptr, -1, 0, false, false);
+    return CIEKey(nullptr, -1, 0, false, false, static_cast<unsigned>(INT_MAX));
   }
 
   CIEKey(const MCSymbol *Personality, unsigned PersonalityEncoding,
-         unsigned LsdaEncoding, bool IsSignalFrame, bool IsSimple)
+         unsigned LsdaEncoding, bool IsSignalFrame, bool IsSimple,
+         unsigned RAReg)
       : Personality(Personality), PersonalityEncoding(PersonalityEncoding),
         LsdaEncoding(LsdaEncoding), IsSignalFrame(IsSignalFrame),
-        IsSimple(IsSimple) {}
+        IsSimple(IsSimple), RAReg(RAReg) {}
 
   const MCSymbol *Personality;
   unsigned PersonalityEncoding;
   unsigned LsdaEncoding;
   bool IsSignalFrame;
   bool IsSimple;
+  unsigned RAReg;
 };
 
 } // end anonymous namespace
@@ -1496,7 +1498,7 @@ template <> struct DenseMapInfo<CIEKey>
   static unsigned getHashValue(const CIEKey &Key) {
     return static_cast<unsigned>(
         hash_combine(Key.Personality, Key.PersonalityEncoding, Key.LsdaEncoding,
-                     Key.IsSignalFrame, Key.IsSimple));
+                     Key.IsSignalFrame, Key.IsSimple, Key.RAReg));
   }
 
   static bool isEqual(const CIEKey &LHS, const CIEKey &RHS) {
@@ -1504,7 +1506,8 @@ template <> struct DenseMapInfo<CIEKey>
            LHS.PersonalityEncoding == RHS.PersonalityEncoding &&
            LHS.LsdaEncoding == RHS.LsdaEncoding &&
            LHS.IsSignalFrame == RHS.IsSignalFrame &&
-           LHS.IsSimple == RHS.IsSimple;
+           LHS.IsSimple == RHS.IsSimple &&
+           LHS.RAReg == RHS.RAReg;
   }
 };
 
@@ -1561,8 +1564,8 @@ void MCDwarfFrameEmitter::Emit(MCObjectS
       // of by the compact unwind encoding.
       continue;
 
-    CIEKey Key(Frame.Personality, Frame.PersonalityEncoding,
-               Frame.LsdaEncoding, Frame.IsSignalFrame, Frame.IsSimple);
+    CIEKey Key(Frame.Personality, Frame.PersonalityEncoding, Frame.LsdaEncoding,
+               Frame.IsSignalFrame, Frame.IsSimple, Frame.RAReg);
     const MCSymbol *&CIEStart = IsEH ? CIEStarts[Key] : DummyDebugKey;
     if (!CIEStart)
       CIEStart = &Emitter.EmitCIE(

Modified: llvm/trunk/test/Assembler/return-column.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Assembler/return-column.s?rev=309492&r1=309491&r2=309492&view=diff
==============================================================================
--- llvm/trunk/test/Assembler/return-column.s (original)
+++ llvm/trunk/test/Assembler/return-column.s Sat Jul 29 13:03:00 2017
@@ -4,15 +4,28 @@
 
 	.text
 
-proc:
+	.section .text.f,"ax", at progbits
+	.global f
+	.type f, at function
+f:
 	.cfi_startproc
 	.cfi_return_column 0
 	.cfi_endproc
 
+	.section .text.g,"ax", at progbits
+	.global g
+	.type g, at function
+g:
+	.cfi_startproc
+	.cfi_return_column 65
+	.cfi_endproc
+
+// CHECK-ASM-ROUNDTRIP-LABEL: f:
 // CHECK-ASM-ROUNDTRIP: .cfi_startproc
 // CHECK-ASM-ROUNDTRIP-NEXT: .cfi_return_column 0
 // CHECK-ASM-ROUNDTRIP: .cfi_endproc
 
 // CHECK-EH_FRAME: Contents of section .eh_frame:
 // CHECK-EH_FRAME:  0000 14000000 00000000 017a5200 017c0001  .........zR..|..
+// CHECK-EH_FRAME:  0030 00000000 017a5200 017c4101 1b0c0404  .....zR..|A.....
 




More information about the llvm-commits mailing list