[PATCH] D139663: Emit unwind information in the .debug_frame section when the .cfi_sections .debug_frame directive is used.

Shubham Sandeep Rastogi via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 5 09:13:21 PDT 2023


rastogishubham updated this revision to Diff 511124.
rastogishubham edited the summary of this revision.
rastogishubham added a comment.

The original patch was not addressing the issue correctly. The problem is that the function

  MCDwarfFrameEmitter::Emit

skips emitting the CIE and FDE in arm64 because the architecture supports emitting unwind information without having an eh frame section. This doesn't however mean that the debug frame section should be omitted if the

  .cfi_sections .debug_frame

directive is used. This patch just makes sure that the CIE and FDE is emitted in the debug frame section if that is required.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D139663/new/

https://reviews.llvm.org/D139663

Files:
  llvm/lib/MC/MCDwarf.cpp
  llvm/test/DebugInfo/AArch64/debugframeinfo.s


Index: llvm/test/DebugInfo/AArch64/debugframeinfo.s
===================================================================
--- /dev/null
+++ llvm/test/DebugInfo/AArch64/debugframeinfo.s
@@ -0,0 +1,42 @@
+# RUN: llvm-mc -filetype=obj --triple=arm64-apple-darwin22.1.0 %s -o %t.o
+# RUN: llvm-dwarfdump -debug-frame %t.o | FileCheck %s
+
+# CHECK: .debug_frame contents:
+# CHECK-EMPTY: 
+# CHECK-NEXT: 00000000 00000014 ffffffff CIE
+# CHECK-NEXT: Format:                DWARF32
+# CHECK-NEXT: Version:               4
+# CHECK-NEXT: Augmentation:          ""
+# CHECK-NEXT: Address size:          8
+# CHECK-NEXT: Segment desc size:     0
+# CHECK-NEXT: Code alignment factor: 1
+# CHECK-NEXT: Data alignment factor: -8
+# CHECK-NEXT: Return address column: 30
+# CHECK-EMPTY: 
+# CHECK-NEXT: DW_CFA_def_cfa: WSP +0
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-EMPTY: 
+# CHECK-NEXT: CFA=WSP
+# CHECK-EMPTY: 
+# CHECK-NEXT: 00000018 00000014 00000000 FDE cie=00000000 pc=00000000...00000000
+# CHECK-NEXT: Format:       DWARF32
+# CHECK-EMPTY: 
+# CHECK-NEXT: 0x0: CFA=WSP
+
+        .cfi_sections .debug_frame
+        .cfi_startproc
+        .cfi_personality 0x9b, g
+        .cfi_lsda 0x1b, h
+        .cfi_endproc
+
+        .global g
+        
+g:
+
+        .global h
+h:
Index: llvm/lib/MC/MCDwarf.cpp
===================================================================
--- llvm/lib/MC/MCDwarf.cpp
+++ llvm/lib/MC/MCDwarf.cpp
@@ -1856,7 +1856,6 @@
   const MCAsmInfo *AsmInfo = Context.getAsmInfo();
   FrameEmitterImpl Emitter(IsEH, Streamer);
   ArrayRef<MCDwarfFrameInfo> FrameArray = Streamer.getDwarfFrameInfos();
-
   // Emit the compact unwind info if available.
   bool NeedsEHFrameSection = !MOFI->getSupportsCompactUnwindWithoutEHFrame();
   if (IsEH && MOFI->getCompactUnwindSection()) {
@@ -1876,7 +1875,7 @@
     }
   }
 
-  if (!NeedsEHFrameSection) return;
+  if (!NeedsEHFrameSection && IsEH) return;
 
   MCSection &Section =
       IsEH ? *const_cast<MCObjectFileInfo *>(MOFI)->getEHFrameSection()
@@ -1903,7 +1902,7 @@
     const MCDwarfFrameInfo &Frame = *I;
     ++I;
     if (CanOmitDwarf && Frame.CompactUnwindEncoding !=
-          MOFI->getCompactUnwindDwarfEHFrameOnly())
+          MOFI->getCompactUnwindDwarfEHFrameOnly() && IsEH)
       // Don't generate an EH frame if we don't need one. I.e., it's taken care
       // of by the compact unwind encoding.
       continue;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D139663.511124.patch
Type: text/x-patch
Size: 2532 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230405/f205f748/attachment.bin>


More information about the llvm-commits mailing list