forked from OSchip/llvm-project
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:
parent
664f84e246
commit
2c6fae179e
|
@ -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)) {
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue