[PATCH] D139269: [lld-macho] Canonicalize LSDA pointers

Jez Ng via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 5 13:19:43 PST 2022


This revision was automatically updated to reflect the committed changes.
Closed by commit rG04b1dad7177b: [lld-macho] Canonicalize LSDA pointers (authored by int3).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D139269

Files:
  lld/MachO/UnwindInfoSection.cpp
  lld/test/MachO/icf-only-lsda-folded.s


Index: lld/test/MachO/icf-only-lsda-folded.s
===================================================================
--- /dev/null
+++ lld/test/MachO/icf-only-lsda-folded.s
@@ -0,0 +1,65 @@
+# REQUIRES: x86
+# RUN: rm -rf %t; split-file %s %t
+
+## This is a regression test. Previously, we would emit a bogus LSDA pointer if
+## the following conditions held:
+##   * ICF and dead-strip were both done
+##   * There exist two functions different compact unwind encodings, but the
+##     same LSDA
+##
+## Essentially, we'd neglected to canonicalize the LSDA pointer after ICF, but
+## the broken output would only appear if the compact unwind entry that pointed
+## to it was not itself folded.
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin19.0.0 %t/test.s -o %t/test.o
+# RUN: %lld -dylib -dead_strip --icf=all %t/test.o -o %t/test
+# RUN: llvm-objdump --macho --syms --unwind-info %t/test | FileCheck %s
+
+# CHECK:      SYMBOL TABLE:
+## Sanity check: Verify that the LSDAs are dedup'ed
+# CHECK-NEXT: [[#%.16x, EXC:]]       l     O __TEXT,__gcc_except_tab _exception0
+# CHECK-NEXT: [[#EXC]]               l     O __TEXT,__gcc_except_tab _exception1
+## But that the functions themselves aren't
+# CHECK-NEXT: [[#%.16x, FOO:]]        g     F __TEXT,__text _foo
+# CHECK-NEXT: [[#%.16x, BAR:FOO + 1]] g     F __TEXT,__text _bar
+
+## _foo and _bar should share the same LSDA. We would previously emit a bogus
+## address for _bar's LSDA.
+# CHECK:      Contents of __unwind_info section:
+# CHECK:      LSDA descriptors:
+# CHECK-NEXT:     [0]: function offset=0x[[#%.8x, FOO]], LSDA offset=0x[[#%.8x, EXC]]
+# CHECK-NEXT:     [1]: function offset=0x[[#%.8x, BAR]], LSDA offset=0x[[#%.8x, EXC]]
+
+## But there should be two distinct encodings, one for each function
+# CHECK:      Second level indices:
+# CHECK-NEXT:     Second level index[0]:
+# CHECK-NEXT:       [0]: function offset=0x[[#%.8x, FOO]], encoding[0]=0x42020000
+# CHECK-NEXT:       [1]: function offset=0x[[#%.8x, BAR]], encoding[1]=0x42010000
+
+#--- test.s
+.text
+.globl _foo, _bar
+
+_foo:
+  .cfi_startproc
+	.cfi_lsda 16, _exception0
+	.cfi_def_cfa_offset 16
+  ret
+  .cfi_endproc
+
+_bar:
+  .cfi_startproc
+	.cfi_lsda 16, _exception1
+	.cfi_def_cfa_offset 8 ## ensure _bar's CUE doesn't get folded with _foo's
+  ret
+  .cfi_endproc
+
+.section	__TEXT,__gcc_except_tab
+
+_exception0:
+  .quad 0x1234
+
+_exception1:
+  .quad 0x1234
+
+.subsections_via_symbols
Index: lld/MachO/UnwindInfoSection.cpp
===================================================================
--- lld/MachO/UnwindInfoSection.cpp
+++ lld/MachO/UnwindInfoSection.cpp
@@ -251,6 +251,11 @@
   for (size_t i = 0; i < isec->relocs.size(); ++i) {
     Reloc &r = isec->relocs[i];
     assert(target->hasAttr(r.type, RelocAttrBits::UNSIGNED));
+    // Since compact unwind sections aren't part of the inputSections vector,
+    // they don't get canonicalized by scanRelocations(), so we have to do the
+    // canonicalization here.
+    if (auto *referentIsec = r.referent.dyn_cast<InputSection *>())
+      r.referent = referentIsec->canonical();
 
     // Functions and LSDA entries always reside in the same object file as the
     // compact unwind entries that references them, and thus appear as section


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D139269.480221.patch
Type: text/x-patch
Size: 3271 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221205/d159d720/attachment.bin>


More information about the llvm-commits mailing list