[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 15:31:06 PDT 2022


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

Address review feedback


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.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/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.439184.patch
Type: text/x-patch
Size: 2110 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220622/b4b4ce6d/attachment.bin>


More information about the llvm-commits mailing list