[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