From: George Rimar Date: Fri, 23 Feb 2018 10:27:13 +0000 (+0000) Subject: [ELF] - Do not crash with --emit-relocs and --icf=all together. X-Git-Tag: llvmorg-7.0.0-rc1~12181 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=cde84d1cd06dc6dd4bdd00d2717d2d8e1299e596;p=platform%2Fupstream%2Fllvm.git [ELF] - Do not crash with --emit-relocs and --icf=all together. Previously we would crash because did not mark .rel[a] sections as dead and they tried to access parent which was not live after ICF and therefore was null. Differential revision: https://reviews.llvm.org/D43241 llvm-svn: 325877 --- diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index f7a757e..f6676af 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -789,6 +789,8 @@ void InputSection::replace(InputSection *Other) { Alignment = std::max(Alignment, Other->Alignment); Other->Repl = Repl; Other->Live = false; + for (InputSection *IS : Other->DependentSections) + IS->Live = false; } template diff --git a/lld/test/ELF/emit-relocs-icf.s b/lld/test/ELF/emit-relocs-icf.s new file mode 100644 index 0000000..59e003f --- /dev/null +++ b/lld/test/ELF/emit-relocs-icf.s @@ -0,0 +1,33 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t1.o +# RUN: ld.lld --emit-relocs --icf=all %t1.o -o %t +# RUN: llvm-readobj -r %t | FileCheck %s + +# CHECK: Relocations [ +# CHECK-NEXT: Section {{.*}} .rela.text { +# CHECK-NEXT: R_X86_64_32 .text 0x1 +# CHECK-NEXT: R_X86_64_PLT32 fn 0xFFFFFFFFFFFFFFFC +# CHECK-NEXT: } +# CHECK-NEXT: ] + +.section .text.fn,"ax",@progbits,unique,0 +.globl fn +.type fn,@function +fn: + nop + +bar: + movl $bar, %edx + callq fn@PLT + nop + +.section .text.fn2,"ax",@progbits,unique,1 +.globl fn2 +.type fn2,@function +fn2: + nop + +foo: + movl $foo, %edx + callq fn2@PLT + nop