[PATCH] D39172: [ELF] When placing orphans, handle case when last section is dead

Petr Hosek via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun Oct 22 15:16:16 PDT 2017


phosek created this revision.
Herald added a subscriber: emaste.

]r315292 introduced a change that's supposed consistently ignore
 "dead" output sections when placing orphans. Unfortuantely, 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.


Repository:
  rL LLVM

https://reviews.llvm.org/D39172

Files:
  ELF/Writer.cpp
  test/ELF/linkerscript/orphan-discard.s


Index: test/ELF/linkerscript/orphan-discard.s
===================================================================
--- /dev/null
+++ test/ELF/linkerscript/orphan-discard.s
@@ -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
Index: ELF/Writer.cpp
===================================================================
--- ELF/Writer.cpp
+++ ELF/Writer.cpp
@@ -1010,20 +1010,22 @@
         Sec->SortRank < CurSec->SortRank)
       break;
   }
+
+  auto P = [](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), P);
   I = J.base();
 
   // As a special case, if the orphan section is the last section, put
   // it at the very end, past any other commands.
   // 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, P);
   if (NextSec == E)
     return E;
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D39172.119801.patch
Type: text/x-patch
Size: 2131 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171022/b005f62e/attachment.bin>


More information about the llvm-commits mailing list