[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 17:51:51 PDT 2017
This revision was automatically updated to reflect the committed changes.
Closed by commit rL316307: [ELF] When placing orphans, handle case when last section is dead (authored by phosek).
Changed prior to commit:
https://reviews.llvm.org/D39172?vs=119804&id=119805#toc
Repository:
rL LLVM
https://reviews.llvm.org/D39172
Files:
lld/trunk/ELF/Writer.cpp
lld/trunk/test/ELF/linkerscript/orphan-discard.s
Index: lld/trunk/ELF/Writer.cpp
===================================================================
--- lld/trunk/ELF/Writer.cpp
+++ lld/trunk/ELF/Writer.cpp
@@ -1010,20 +1010,22 @@
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
// 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, IsLiveSection);
if (NextSec == E)
return E;
Index: lld/trunk/test/ELF/linkerscript/orphan-discard.s
===================================================================
--- lld/trunk/test/ELF/linkerscript/orphan-discard.s
+++ lld/trunk/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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D39172.119805.patch
Type: text/x-patch
Size: 2256 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171023/65fd4ced/attachment.bin>
More information about the llvm-commits
mailing list