[lld] r316307 - [ELF] When placing orphans, handle case when last section is dead

Petr Hosek via llvm-commits llvm-commits at lists.llvm.org
Sun Oct 22 17:51:08 PDT 2017


Author: phosek
Date: Sun Oct 22 17:51:08 2017
New Revision: 316307

URL: http://llvm.org/viewvc/llvm-project?rev=316307&view=rev
Log:
[ELF] When placing orphans, handle case when last section is dead

r315292 introduced a change that's supposed to consistently ignore
"dead" output sections when placing orphans. Unfortunately, that
change doesn't handle the special case when the orphan section is
second to last section and the last section is dead (e.g. because
it's being discarded) introducing a regression in some cases.

This change handles this case by using the same predicate when
checking the last section.

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

Added:
    lld/trunk/test/ELF/linkerscript/orphan-discard.s
Modified:
    lld/trunk/ELF/Writer.cpp

Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=316307&r1=316306&r2=316307&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Sun Oct 22 17:51:08 2017
@@ -1010,11 +1010,14 @@ findOrphanPos(std::vector<BaseCommand *>
         Sec->SortRank < CurSec->SortRank)
       break;
   }
+
+  auto IsLiveSection = [](BaseCommand *Cmd) {
+    auto *OS = dyn_cast<OutputSection>(Cmd);
+    return OS && OS->Live;
+  };
+
   auto J = std::find_if(llvm::make_reverse_iterator(I),
-                        llvm::make_reverse_iterator(B), [](BaseCommand *Cmd) {
-                          auto *OS = dyn_cast<OutputSection>(Cmd);
-                          return OS && OS->Live;
-                        });
+                        llvm::make_reverse_iterator(B), IsLiveSection);
   I = J.base();
 
   // As a special case, if the orphan section is the last section, put
@@ -1022,8 +1025,7 @@ findOrphanPos(std::vector<BaseCommand *>
   // This matches bfd's behavior and is convenient when the linker script fully
   // specifies the start of the file, but doesn't care about the end (the non
   // alloc sections for example).
-  auto NextSec = std::find_if(
-      I, E, [](BaseCommand *Cmd) { return isa<OutputSection>(Cmd); });
+  auto NextSec = std::find_if(I, E, IsLiveSection);
   if (NextSec == E)
     return E;
 

Added: lld/trunk/test/ELF/linkerscript/orphan-discard.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/orphan-discard.s?rev=316307&view=auto
==============================================================================
--- lld/trunk/test/ELF/linkerscript/orphan-discard.s (added)
+++ lld/trunk/test/ELF/linkerscript/orphan-discard.s Sun Oct 22 17:51:08 2017
@@ -0,0 +1,25 @@
+# REQUIRES: x86
+# RUN: llvm-mc -position-independent -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
+# RUN: echo "SECTIONS { \
+# RUN:  . = 0xffffffff80000000; \
+# RUN:  .text : ALIGN(4096) { *(.text) } \
+# RUN:  .data : ALIGN(4096) { *(.data) } \
+# RUN:  .bss : ALIGN(4096) { *(.bss); } \
+# RUN:  . = ALIGN(4096); \
+# RUN:  _end = .; \
+# RUN:  /DISCARD/ : { *(.comment) } \
+# RUN: }" > %t.script
+# RUN: ld.lld -o %t --script %t.script %t.o
+# RUN: llvm-readelf -s -symbols %t | FileCheck %s
+
+# CHECK: .bss NOBITS ffffffff80002000 002008 000002 00 WA 0 0 4096
+# CHECK: ffffffff80003000 0 NOTYPE GLOBAL DEFAULT 3 _end
+
+.section .text, "ax"
+  ret
+
+.section .data, "aw"
+  .quad 0
+
+.section .bss, "", @nobits
+  .short 0




More information about the llvm-commits mailing list