summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2019-11-01 18:48:59 -0700
committerPeter Collingbourne <peter@pcc.me.uk>2019-11-04 09:11:14 -0800
commit2c6fae179e6984c7330ff8a284d7a10ce142eef9 (patch)
treeeafd4a1874afe07564a7e4de0e8fa8f63a3cbce4
parent664f84e246478db82be2871f36fd1a523d9f2731 (diff)
downloadbcm5719-llvm-2c6fae179e6984c7330ff8a284d7a10ce142eef9.tar.gz
bcm5719-llvm-2c6fae179e6984c7330ff8a284d7a10ce142eef9.zip
ELF: Discard .ARM.exidx sections for empty functions instead of misordering them.
The logic added in r372781 caused ARMExidxSyntheticSection::addSection() to return false for exidx sections without a link order dep that passed isValidExidxSectionDep(). This included exidx sections for empty functions. As a result, such exidx sections would end up treated like ordinary sections and would end up being laid out before the ARMExidxSyntheticSection, most likely in the wrong order relative to the exidx entries in the ARMExidxSyntheticSection, breaking the orderedness invariant relied upon by unwinders. Fix this by simply discarding such sections. Differential Revision: https://reviews.llvm.org/D69744
-rw-r--r--lld/ELF/SyntheticSections.cpp8
-rw-r--r--lld/test/ELF/arm-exidx-empty-fn.s41
2 files changed, 44 insertions, 5 deletions
diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp
index 33e3fdbe6f1..40cc92faf7b 100644
--- a/lld/ELF/SyntheticSections.cpp
+++ b/lld/ELF/SyntheticSections.cpp
@@ -3164,12 +3164,10 @@ static bool isValidExidxSectionDep(InputSection *isec) {
bool ARMExidxSyntheticSection::addSection(InputSection *isec) {
if (isec->type == SHT_ARM_EXIDX) {
- if (InputSection* dep = isec->getLinkOrderDep())
- if (isValidExidxSectionDep(dep)) {
+ if (InputSection *dep = isec->getLinkOrderDep())
+ if (isValidExidxSectionDep(dep))
exidxSections.push_back(isec);
- return true;
- }
- return false;
+ return true;
}
if (isValidExidxSectionDep(isec)) {
diff --git a/lld/test/ELF/arm-exidx-empty-fn.s b/lld/test/ELF/arm-exidx-empty-fn.s
new file mode 100644
index 00000000000..6cf9870155e
--- /dev/null
+++ b/lld/test/ELF/arm-exidx-empty-fn.s
@@ -0,0 +1,41 @@
+// REQUIRES: arm
+// RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %s -o %t.o
+// RUN: ld.lld %t.o -o %t -shared
+
+// RUN: llvm-readelf --unwind %t | FileCheck %s
+
+// Check that any exidx sections for empty functions are discarded.
+
+// CHECK: Entries [
+// CHECK-NEXT: Entry {
+// CHECK-NEXT: FunctionAddress:
+// CHECK-NEXT: Model: CantUnwind
+// CHECK-NEXT: }
+// CHECK-NEXT: Entry {
+// CHECK-NEXT: FunctionAddress:
+// CHECK-NEXT: Model: CantUnwind
+// CHECK-NEXT: }
+// CHECK-NEXT: ]
+
+.section .text.f0,"ax",%progbits
+.globl f0
+f0:
+.fnstart
+bx lr
+.cantunwind
+.fnend
+
+.section .text.f1,"ax",%progbits
+.globl f1
+f1:
+.fnstart
+.cantunwind
+.fnend
+
+.section .text.f2,"ax",%progbits
+.globl f2
+f2:
+.fnstart
+bx lr
+.cantunwind
+.fnend
OpenPOWER on IntegriCloud