[lld] 1ca16fc - Revert "[LLD][ELF][ARM] Fix ARM Exidx order for non monotonic section order"

Peter Smith via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 23 09:11:54 PDT 2020


Author: Peter Smith
Date: 2020-04-23T16:58:50+01:00
New Revision: 1ca16fc4f5146b90512d4740cfcc4d4c34640853

URL: https://github.com/llvm/llvm-project/commit/1ca16fc4f5146b90512d4740cfcc4d4c34640853
DIFF: https://github.com/llvm/llvm-project/commit/1ca16fc4f5146b90512d4740cfcc4d4c34640853.diff

LOG: Revert "[LLD][ELF][ARM] Fix ARM Exidx order for non monotonic section order"

This reverts commit f969c2aa657e28633ece63a5430e551f0b8beb98.

There are some msan buildbot failures sanitzer-x86_64-linux-fast that
I need to investigate.

Differential Revision: https://reviews.llvm.org/D78422

Added: 
    

Modified: 
    lld/ELF/SyntheticSections.cpp
    lld/ELF/Writer.cpp

Removed: 
    lld/test/ELF/arm-exidx-script-order.s


################################################################################
diff  --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp
index 70dbee3f6d48..8cf813ceffd0 100644
--- a/lld/ELF/SyntheticSections.cpp
+++ b/lld/ELF/SyntheticSections.cpp
@@ -3363,14 +3363,14 @@ void ARMExidxSyntheticSection::finalizeContents() {
 
   // Sort the executable sections that may or may not have associated
   // .ARM.exidx sections by order of ascending address. This requires the
-  // relative positions of InputSections and OutputSections to be known.
+  // relative positions of InputSections to be known.
   auto compareByFilePosition = [](const InputSection *a,
                                   const InputSection *b) {
     OutputSection *aOut = a->getParent();
     OutputSection *bOut = b->getParent();
 
     if (aOut != bOut)
-      return aOut->addr < bOut->addr;
+      return aOut->sectionIndex < bOut->sectionIndex;
     return a->outSecOff < b->outSecOff;
   };
   llvm::stable_sort(executableSections, compareByFilePosition);

diff  --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index a9dd643f85c6..91fdff145c62 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -1604,11 +1604,6 @@ template <class ELFT> void Writer<ELFT>::resolveShfLinkOrder() {
   }
 }
 
-static void finalizeSynthetic(SyntheticSection *sec) {
-  if (sec && sec->isNeeded() && sec->getParent())
-    sec->finalizeContents();
-}
-
 // We need to generate and finalize the content that depends on the address of
 // InputSections. As the generation of the content may also alter InputSection
 // addresses we must converge to a fixed point. We do that here. See the comment
@@ -1618,11 +1613,6 @@ template <class ELFT> void Writer<ELFT>::finalizeAddressDependentContent() {
   AArch64Err843419Patcher a64p;
   ARMErr657417Patcher a32p;
   script->assignAddresses();
-  // .ARM.exidx does not require precise addresses, but it does require the
-  // relative addresses of OutputSections because linker scripts can assign
-  // Virtual Addresses to OutputSections that are not monotonically increasing.
-  for (Partition &part : partitions)
-    finalizeSynthetic(part.armExidx);
 
   // Converts call x at GDPLT to call __tls_get_addr
   if (config->emachine == EM_HEXAGON)
@@ -1772,6 +1762,11 @@ template <class ELFT> void Writer<ELFT>::optimizeBasicBlockJumps() {
   }
 }
 
+static void finalizeSynthetic(SyntheticSection *sec) {
+  if (sec && sec->isNeeded() && sec->getParent())
+    sec->finalizeContents();
+}
+
 // In order to allow users to manipulate linker-synthesized sections,
 // we had to add synthetic sections to the input section list early,
 // even before we make decisions whether they are needed. This allows
@@ -2040,6 +2035,7 @@ template <class ELFT> void Writer<ELFT>::finalizeSections() {
   // Dynamic section must be the last one in this list and dynamic
   // symbol table section (dynSymTab) must be the first one.
   for (Partition &part : partitions) {
+    finalizeSynthetic(part.armExidx);
     finalizeSynthetic(part.dynSymTab);
     finalizeSynthetic(part.gnuHashTab);
     finalizeSynthetic(part.hashTab);

diff  --git a/lld/test/ELF/arm-exidx-script-order.s b/lld/test/ELF/arm-exidx-script-order.s
deleted file mode 100644
index 809278b9d131..000000000000
--- a/lld/test/ELF/arm-exidx-script-order.s
+++ /dev/null
@@ -1,57 +0,0 @@
-// REQUIRES: arm
-// RUN: llvm-mc --arm-add-build-attributes --triple=armv7a-linux-gnueabihf -filetype=obj %s -o %t.o
-// RUN: echo "SECTIONS { \
-// RUN:         . = 0x80000000; \
-// RUN:         .ARM.exidx : { *(.ARM.exidx) } \
-// RUN:         .text : { *(.text) } \
-// RUN:         .text.1 0x80000200 : AT(0x1000) { *(.text.1) } \
-// RUN:         .text.2 0x80000100 : AT(0x2000) { *(.text.2) } \
-// RUN: } " > %t.script
-// RUN: ld.lld --script %t.script %t.o -o %t
-// RUN: llvm-readobj -x .ARM.exidx %t | FileCheck %s
-
-/// When a linker script does not have monotonically increasing addresses
-/// the .ARM.exidx table should still be in monotonically increasing order.
-
-// CHECK: Hex dump of section '.ARM.exidx':
-// 0x80000000 + 0x28 = 0x80000028, 0x80000008 + 0xf8 = 0x80000100 
-// CHECK-NEXT: 0x80000000 24000000 08849780 f8000000 20849980
-// 0x80000010 + 0x1f0 = 0x8000200, 0x80000018 + 0x1ec = 0x8000204
-// CHECK-NEXT: 0x80000010 f0010000 10849880 ec010000 01000000
-
- .text
- .global _start
- .type _start, %function
-_start:
- .fnstart
- bx lr
- .save {r7, lr}
- .setfp r7, sp, #0
- .fnend
-
- .section .text.1, "ax", %progbits
- .global fn1
- .type fn1, %function
-fn1:
- .fnstart
- bx lr
- .save {r8, lr}
- .setfp r8, sp, #0
- .fnend
-
- .section .text.2, "ax", %progbits
- .global fn2
- .type fn2, %function
-fn2:
- .fnstart
- bx lr
- .save {r9, lr}
- .setfp r9, sp, #0
- .fnend
-
-/// Dummy definition for a reference from the personality routine created by
-/// the assembler, use .data to avoid generating a cantunwind table.
- .section .rodata
- .global __aeabi_unwind_cpp_pr0
-__aeabi_unwind_cpp_pr0:
- .word 0


        


More information about the llvm-commits mailing list