[lld] 2c6fae1 - ELF: Discard .ARM.exidx sections for empty functions instead of misordering them.

Peter Collingbourne via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 4 09:12:05 PST 2019


Author: Peter Collingbourne
Date: 2019-11-04T09:11:14-08:00
New Revision: 2c6fae179e6984c7330ff8a284d7a10ce142eef9

URL: https://github.com/llvm/llvm-project/commit/2c6fae179e6984c7330ff8a284d7a10ce142eef9
DIFF: https://github.com/llvm/llvm-project/commit/2c6fae179e6984c7330ff8a284d7a10ce142eef9.diff

LOG: 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

Added: 
    lld/test/ELF/arm-exidx-empty-fn.s

Modified: 
    lld/ELF/SyntheticSections.cpp

Removed: 
    


################################################################################
diff  --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp
index 33e3fdbe6f14..40cc92faf7bb 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 000000000000..6cf9870155e6
--- /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


        


More information about the llvm-commits mailing list