[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