[PATCH] D128382: [LLD] Two tweaks to symbol ordering scheme

YongKang Zhu via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 22 16:35:07 PDT 2022


yozhu updated this revision to Diff 439208.
yozhu added a comment.

Add a test case to verify the behavior when branch thunk might be needed


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D128382

Files:
  lld/ELF/Writer.cpp
  lld/test/ELF/arm-symbol-ordering-file-need-thunk.s
  lld/test/ELF/arm-symbol-ordering-file.s


Index: lld/test/ELF/arm-symbol-ordering-file.s
===================================================================
--- lld/test/ELF/arm-symbol-ordering-file.s
+++ lld/test/ELF/arm-symbol-ordering-file.s
@@ -5,10 +5,10 @@
 # RUN: ld.lld --symbol-ordering-file %t_order.txt %t.o -o %t2.out
 # RUN: llvm-nm -n %t2.out | FileCheck %s
 
-# CHECK: unordered1
+# CHECK: ordered
+# CHECK-NEXT: unordered1
 # CHECK-NEXT: unordered2
 # CHECK-NEXT: unordered3
-# CHECK-NEXT: ordered
 # CHECK-NEXT: unordered4
 
 .section .foo,"ax",%progbits,unique,1
Index: lld/test/ELF/arm-symbol-ordering-file-need-thunk.s
===================================================================
--- lld/test/ELF/arm-symbol-ordering-file-need-thunk.s
+++ lld/test/ELF/arm-symbol-ordering-file-need-thunk.s
@@ -4,29 +4,30 @@
 # RUN: echo ordered > %t_order.txt
 # RUN: ld.lld --symbol-ordering-file %t_order.txt %t.o -o %t2.out
 # RUN: llvm-nm -n %t2.out | FileCheck %s
+# RUN: rm -f %t.o %t2.out
 
 # CHECK: unordered1
 # CHECK-NEXT: unordered2
-# CHECK-NEXT: unordered3
 # CHECK-NEXT: ordered
+# CHECK-NEXT: unordered3
 # CHECK-NEXT: unordered4
 
 .section .foo,"ax",%progbits,unique,1
 unordered1:
-.zero 1
+.zero 0xC00000
 
 .section .foo,"ax",%progbits,unique,2
 unordered2:
-.zero 1
+.zero 0xC00000
 
 .section .foo,"ax",%progbits,unique,3
 unordered3:
-.zero 2
+.zero 0xC00000
 
 .section .foo,"ax",%progbits,unique,4
 unordered4:
-.zero 4
+.zero 0xC00000
 
 .section .foo,"ax",%progbits,unique,5
 ordered:
-.zero 1
+.zero 8
Index: lld/ELF/Writer.cpp
===================================================================
--- lld/ELF/Writer.cpp
+++ lld/ELF/Writer.cpp
@@ -1316,8 +1316,13 @@
   SmallVector<InputSection *, 0> unorderedSections;
   SmallVector<std::pair<InputSection *, int>, 0> orderedSections;
   uint64_t unorderedSize = 0;
+  uint64_t totalSize = 0;
+  uint64_t executableInputSections = 0;
 
   for (InputSection *isec : isd->sections) {
+    totalSize += isec->getSize();
+    if (isec->flags & SHF_EXECINSTR)
+      ++executableInputSections;
     auto i = order.find(isec);
     if (i == order.end()) {
       unorderedSections.push_back(isec);
@@ -1355,8 +1360,15 @@
   // of the second block of cold code can call the hot code without a thunk. So
   // we effectively double the amount of code that could potentially call into
   // the hot code without a thunk.
+  //
+  // The above is not necessary when less than two input sections contain
+  // anything that is executable or when total size of output section is small,
+  // for which no thunk would be required. Hot code could occupy one less page
+  // if it can be placed at beginning of the output section.
   size_t insPt = 0;
-  if (target->getThunkSectionSpacing() && !orderedSections.empty()) {
+  if (executableInputSections > 1 && target->getThunkSectionSpacing() &&
+      !orderedSections.empty() &&
+      totalSize >= target->getThunkSectionSpacing()) {
     uint64_t unorderedPos = 0;
     for (; insPt != unorderedSections.size(); ++insPt) {
       unorderedPos += unorderedSections[insPt]->getSize();


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D128382.439208.patch
Type: text/x-patch
Size: 3071 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220622/d8b2b1c2/attachment.bin>


More information about the llvm-commits mailing list