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
This commit is contained in:
Peter Collingbourne 2019-11-01 18:48:59 -07:00
parent 664f84e246
commit 2c6fae179e
2 changed files with 44 additions and 5 deletions

View File

@ -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)) {

View File

@ -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