Index: lld/trunk/ELF/MarkLive.cpp =================================================================== --- lld/trunk/ELF/MarkLive.cpp +++ lld/trunk/ELF/MarkLive.cpp @@ -81,13 +81,6 @@ template static void forEachSuccessor(InputSection &Sec, std::function)> Fn) { - // Skip over discarded sections. This in theory shouldn't happen, because - // the ELF spec doesn't allow a relocation to point to a deduplicated - // COMDAT section directly. Unfortunately this happens in practice (e.g. - // .eh_frame) so we need to add a check. - if (&Sec == &InputSection::Discarded) - return; - ELFFile &Obj = Sec.getFile()->getObj(); for (const typename ELFT::Shdr *RelSec : Sec.RelocSections) { if (RelSec->sh_type == SHT_RELA) { @@ -198,7 +191,11 @@ SmallVector *, 256> Q; auto Enqueue = [&](ResolvedReloc R) { - if (!R.Sec) + // Skip over discarded sections. This in theory shouldn't happen, because + // the ELF spec doesn't allow a relocation to point to a deduplicated + // COMDAT section directly. Unfortunately this happens in practice (e.g. + // .eh_frame) so we need to add a check. + if (!R.Sec || R.Sec == &InputSection::Discarded) return; // Usually, a whole section is marked as live or dead, but in mergeable Index: lld/trunk/test/ELF/linkerscript/Inputs/comdat-gc.s =================================================================== --- lld/trunk/test/ELF/linkerscript/Inputs/comdat-gc.s +++ lld/trunk/test/ELF/linkerscript/Inputs/comdat-gc.s @@ -0,0 +1,5 @@ +.file 1 "test/ELF/linkerscript/Inputs/comdat_gc.s" + +.section .text._Z3fooIiEvv,"axG",@progbits,_Z3fooIiEvv,comdat +.loc 1 5 + ret Index: lld/trunk/test/ELF/linkerscript/comdat-gc.s =================================================================== --- lld/trunk/test/ELF/linkerscript/comdat-gc.s +++ lld/trunk/test/ELF/linkerscript/comdat-gc.s @@ -0,0 +1,14 @@ +# REQUIRES: x86 + +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/comdat-gc.s -o %t1 +# RUN: echo "SECTIONS { .text : { *(.text*) } }" > %t.script +# RUN: ld.lld --gc-sections --script %t.script %t %t1 -o %t2 +# RUN: llvm-readobj -sections -symbols %t2 | FileCheck -check-prefix=GC1 %s + +# GC1: Name: .debug_line + +.file 1 "test/ELF/linkerscript/comdat_gc.s" +.section .text._Z3fooIiEvv,"axG",@progbits,_Z3fooIiEvv,comdat +.loc 1 14 + ret