Index: ELF/ICF.cpp =================================================================== --- ELF/ICF.cpp +++ ELF/ICF.cpp @@ -375,6 +375,19 @@ Sections[Begin]->replace(Sections[I]); } }); + + // Mark ARM Exception Index table sections that refer to folded code + // sections as not live. These sections have an implict dependency + // via the link order dependency. + if (Config->EMachine == EM_ARM) + for (InputSectionBase *Sec : InputSections) { + auto *S = dyn_cast(Sec); + if (!S || !(S->Flags & SHF_LINK_ORDER)) + continue; + InputSectionBase *CodeSec = S->getLinkOrderDep(); + if (CodeSec->Live == false) + S->Live = false; + } } // ICF entry point function. Index: test/ELF/arm-icf-exidx.s =================================================================== --- /dev/null +++ test/ELF/arm-icf-exidx.s @@ -0,0 +1,31 @@ +// REQUIRES: arm +// RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %s -o %t +// RUN: ld.lld %t -o %t2 --icf=all +// RUN: llvm-objdump -s -d -triple=armv7a-none-linux-gnueabi %t2 | FileCheck %s + + .syntax unified + .section .text.f,"axG",%progbits,f,comdat +f: + .fnstart + bx lr + .fnend + + .section .text.g,"axG",%progbits,g,comdat +g: + .fnstart + bx lr + .fnend + + .section .text.h + .global __aeabi_unwind_cpp_pr0 +__aeabi_unwind_cpp_pr0: + bx lr + +// CHECK: Disassembly of section .text: +// CHECK-NEXT: f: +// CHECK-NEXT: 11000: 1e ff 2f e1 bx lr +// CHECK: __aeabi_unwind_cpp_pr0: +// CHECK-NEXT: 11004: 1e ff 2f e1 bx lr + +// CHECK: Contents of section .ARM.exidx: +// CHECK-NEXT: 100d4 2c0f0000 b0b0b080 280f0000 01000000