Index: lld/trunk/ELF/Writer.cpp =================================================================== --- lld/trunk/ELF/Writer.cpp +++ lld/trunk/ELF/Writer.cpp @@ -1010,11 +1010,14 @@ Sec->SortRank < CurSec->SortRank) break; } + + auto IsLiveSection = [](BaseCommand *Cmd) { + auto *OS = dyn_cast(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(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 @@ // 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(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