[PATCH] D133581: [lld-macho] Sort data-in-code entries

Daniel Bertalan via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 13 10:10:52 PDT 2022


This revision was automatically updated to reflect the committed changes.
Closed by commit rG025a5b22c848: [lld-macho] Sort data-in-code entries (authored by BertalanD).
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Changed prior to commit:
  https://reviews.llvm.org/D133581?vs=459289&id=459792#toc

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D133581

Files:
  lld/MachO/SyntheticSections.cpp
  lld/MachO/SyntheticSections.h
  lld/test/MachO/data-in-code-section-ordering.s


Index: lld/test/MachO/data-in-code-section-ordering.s
===================================================================
--- /dev/null
+++ lld/test/MachO/data-in-code-section-ordering.s
@@ -0,0 +1,39 @@
+# REQUIRES: x86
+# RUN: rm -rf %t; split-file %s %t
+
+## Check that data-in-code information is sorted even if
+## sections are reordered compared to the input order.
+
+# RUN: sed -e s/SYM/_first/ %t/input.s | \
+# RUN:   llvm-mc -filetype=obj --triple=x86_64-apple-darwin -o %t/first.o
+# RUN: sed -e s/SYM/_second/ %t/input.s | \
+# RUN:   llvm-mc -filetype=obj --triple=x86_64-apple-darwin -o %t/second.o
+# RUN: sed -e s/SYM/_third/ %t/input.s | \
+# RUN:   llvm-mc -filetype=obj --triple=x86_64-apple-darwin -o %t/third.o
+# RUN: %lld -dylib -lSystem -order_file %t/order.txt %t/first.o %t/second.o %t/third.o -o %t/out
+# RUN: llvm-objdump --macho --syms %t/out > %t/dump.txt
+# RUN: llvm-objdump --macho --data-in-code %t/out >> %t/dump.txt
+# RUN: FileCheck %s < %t/dump.txt
+
+# CHECK-LABEL: SYMBOL TABLE:
+# CHECK-DAG:   [[#%x, SECOND:]] g     F __TEXT,__text _second
+# CHECK-DAG:   [[#%x, FIRST:]]  g     F __TEXT,__text _first
+# CHECK-DAG:   [[#%x, THIRD:]]  g     F __TEXT,__text _third
+
+# CHECK-LABEL: Data in code table (3 entries)
+# CHECK-NEXT:  offset              length kind
+# CHECK-NEXT:  0x[[#%.8x, SECOND]] 4      JUMP_TABLE32
+# CHECK-NEXT:  0x[[#%.8x, FIRST]]  4      JUMP_TABLE32
+# CHECK-NEXT:  0x[[#%.8x, THIRD]]  4      JUMP_TABLE32
+
+#--- order.txt
+_second
+_first
+_third
+
+#--- input.s
+.globl SYM
+SYM:
+.data_region jt32
+.long 0
+.end_data_region
Index: lld/MachO/SyntheticSections.h
===================================================================
--- lld/MachO/SyntheticSections.h
+++ lld/MachO/SyntheticSections.h
@@ -380,8 +380,9 @@
   size_t size = 0;
 };
 
-// Stores 'data in code' entries that describe the locations of
-// data regions inside code sections.
+// Stores 'data in code' entries that describe the locations of data regions
+// inside code sections. This is used by llvm-objdump to distinguish jump tables
+// and stop them from being disassembled as instructions.
 class DataInCodeSection final : public LinkEditSection {
 public:
   DataInCodeSection();
Index: lld/MachO/SyntheticSections.cpp
===================================================================
--- lld/MachO/SyntheticSections.cpp
+++ lld/MachO/SyntheticSections.cpp
@@ -933,8 +933,8 @@
     if (entries.empty())
       continue;
 
-    assert(is_sorted(dataInCodeEntries, [](const data_in_code_entry &lhs,
-                                           const data_in_code_entry &rhs) {
+    assert(is_sorted(entries, [](const data_in_code_entry &lhs,
+                                 const data_in_code_entry &rhs) {
       return lhs.offset < rhs.offset;
     }));
     // For each code subsection find 'data in code' entries residing in it.
@@ -963,6 +963,12 @@
       }
     }
   }
+
+  // ld64 emits the table in sorted order too.
+  llvm::sort(dataInCodeEntries,
+             [](const data_in_code_entry &lhs, const data_in_code_entry &rhs) {
+               return lhs.offset < rhs.offset;
+             });
   return dataInCodeEntries;
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D133581.459792.patch
Type: text/x-patch
Size: 3190 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220913/6c49f5a3/attachment.bin>


More information about the llvm-commits mailing list