forked from mirrors/gecko-dev
Bug 1786338 - Apply upstream patch fixing slop issues on aarch64 mac. r=firefox-build-system-reviewers,andi
Differential Revision: https://phabricator.services.mozilla.com/D169858
This commit is contained in:
parent
4fa125ed02
commit
56367314c0
2 changed files with 100 additions and 0 deletions
|
|
@ -18,6 +18,7 @@
|
||||||
"llvmorg-16-init-14750-ga903ecb4a26d.patch",
|
"llvmorg-16-init-14750-ga903ecb4a26d.patch",
|
||||||
"llvmorg-16-init-15447-g8d3ab9dfc4d4.patch",
|
"llvmorg-16-init-15447-g8d3ab9dfc4d4.patch",
|
||||||
"llvmorg-16-init-17468-gc512eda38ebe.patch",
|
"llvmorg-16-init-17468-gc512eda38ebe.patch",
|
||||||
|
"llvmorg-17-init-2171-g8198f30f7e75.patch",
|
||||||
"compiler-rt-rss-limit-heap-profile.patch"
|
"compiler-rt-rss-limit-heap-profile.patch"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
99
build/build-clang/llvmorg-17-init-2171-g8198f30f7e75.patch
Normal file
99
build/build-clang/llvmorg-17-init-2171-g8198f30f7e75.patch
Normal file
|
|
@ -0,0 +1,99 @@
|
||||||
|
From 8198f30f7e756e3368c3eda62ecc3d0cc62d1570 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jez Ng <jezng@fb.com>
|
||||||
|
Date: Tue, 14 Feb 2023 14:34:19 -0500
|
||||||
|
Subject: [PATCH] [lld-macho] Account for alignment in thunk insertion
|
||||||
|
algorithm
|
||||||
|
|
||||||
|
We previously neglected this, leading us to underestimate the maximum
|
||||||
|
possible branch address offset.
|
||||||
|
|
||||||
|
Fixing this should allow us to reduce `slop` to more reasonable
|
||||||
|
levels. I've lowered it to 256 for now, though I suspect we could go
|
||||||
|
lower.
|
||||||
|
|
||||||
|
Fixes https://github.com/llvm/llvm-project/issues/59259.
|
||||||
|
|
||||||
|
Reviewed By: serge-sans-paille
|
||||||
|
|
||||||
|
Differential Revision: https://reviews.llvm.org/D144029
|
||||||
|
---
|
||||||
|
lld/MachO/ConcatOutputSection.cpp | 10 +++--
|
||||||
|
lld/test/MachO/arm64-thunk-for-alignment.s | 44 ++++++++++++++++++++++
|
||||||
|
2 files changed, 51 insertions(+), 3 deletions(-)
|
||||||
|
create mode 100644 lld/test/MachO/arm64-thunk-for-alignment.s
|
||||||
|
|
||||||
|
diff --git a/lld/MachO/ConcatOutputSection.cpp b/lld/MachO/ConcatOutputSection.cpp
|
||||||
|
index cbd3a2492d25..b522bd9b289e 100644
|
||||||
|
--- a/lld/MachO/ConcatOutputSection.cpp
|
||||||
|
+++ b/lld/MachO/ConcatOutputSection.cpp
|
||||||
|
@@ -246,10 +246,14 @@ void TextOutputSection::finalize() {
|
||||||
|
// contains several branch instructions in succession, then the distance
|
||||||
|
// from the current position to the position where the thunks are inserted
|
||||||
|
// grows. So leave room for a bunch of thunks.
|
||||||
|
- unsigned slop = 1024 * thunkSize;
|
||||||
|
- while (finalIdx < endIdx && addr + size + inputs[finalIdx]->getSize() <
|
||||||
|
- isecVA + forwardBranchRange - slop)
|
||||||
|
+ unsigned slop = 256 * thunkSize;
|
||||||
|
+ while (finalIdx < endIdx) {
|
||||||
|
+ size_t expectedNewSize = alignTo(addr + size, inputs[finalIdx]->align) +
|
||||||
|
+ inputs[finalIdx]->getSize();
|
||||||
|
+ if (expectedNewSize >= isecVA + forwardBranchRange - slop)
|
||||||
|
+ break;
|
||||||
|
finalizeOne(inputs[finalIdx++]);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (!isec->hasCallSites)
|
||||||
|
continue;
|
||||||
|
diff --git a/lld/test/MachO/arm64-thunk-for-alignment.s b/lld/test/MachO/arm64-thunk-for-alignment.s
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..f497b81f705b
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/lld/test/MachO/arm64-thunk-for-alignment.s
|
||||||
|
@@ -0,0 +1,44 @@
|
||||||
|
+# REQUIRES: aarch64
|
||||||
|
+# RUN: rm -rf %t; split-file %s %t
|
||||||
|
+# RUN: llvm-mc -filetype=obj -triple=arm64-apple-darwin %t/foo.s -o %t/foo.o
|
||||||
|
+# RUN: llvm-mc -filetype=obj -triple=arm64-apple-darwin %t/bar.s -o %t/bar.o
|
||||||
|
+# RUN: %lld -dylib -arch arm64 -lSystem -o %t/out %t/foo.o %t/bar.o
|
||||||
|
+
|
||||||
|
+# RUN: llvm-objdump --macho --syms %t/out | FileCheck %s
|
||||||
|
+# CHECK: _bar.thunk.0
|
||||||
|
+
|
||||||
|
+## Regression test for PR59259. Previously, we neglected to check section
|
||||||
|
+## alignments when deciding when to create thunks.
|
||||||
|
+
|
||||||
|
+## If we ignore alignment, the total size of _spacer1 + _spacer2 below is just
|
||||||
|
+## under the limit at which we attempt to insert thunks between the spacers.
|
||||||
|
+## However, with alignment accounted for, their total size ends up being
|
||||||
|
+## 0x8000000, which is just above the max forward branch range, making thunk
|
||||||
|
+## insertion necessary. Thus, not accounting for alignment led to an error.
|
||||||
|
+
|
||||||
|
+#--- foo.s
|
||||||
|
+
|
||||||
|
+_foo:
|
||||||
|
+ b _bar
|
||||||
|
+
|
||||||
|
+## Size of a `b` instruction.
|
||||||
|
+.equ callSize, 4
|
||||||
|
+## Refer to `slop` in TextOutputSection::finalize().
|
||||||
|
+.equ slopSize, 12 * 256
|
||||||
|
+
|
||||||
|
+_spacer1:
|
||||||
|
+ .space 0x4000000 - slopSize - 2 * callSize - 1
|
||||||
|
+
|
||||||
|
+.subsections_via_symbols
|
||||||
|
+
|
||||||
|
+#--- bar.s
|
||||||
|
+.globl _bar
|
||||||
|
+
|
||||||
|
+.p2align 14
|
||||||
|
+_spacer2:
|
||||||
|
+ .space 0x4000000
|
||||||
|
+
|
||||||
|
+_bar:
|
||||||
|
+ ret
|
||||||
|
+
|
||||||
|
+.subsections_via_symbols
|
||||||
|
--
|
||||||
|
2.39.0.1.g6739ec1790
|
||||||
|
|
||||||
Loading…
Reference in a new issue