diff --git a/lld/ELF/ICF.cpp b/lld/ELF/ICF.cpp index 8b58c990cef1..0bc4dc35ce27 100644 --- a/lld/ELF/ICF.cpp +++ b/lld/ELF/ICF.cpp @@ -77,6 +77,7 @@ #include "Config.h" #include "SymbolTable.h" #include "Symbols.h" +#include "SyntheticSections.h" #include "lld/Common/Threads.h" #include "llvm/ADT/Hashing.h" #include "llvm/BinaryFormat/ELF.h" @@ -166,6 +167,12 @@ static bool isEligible(InputSection *S) { if (!(S->Flags & SHF_EXECINSTR) && !Config->IgnoreDataAddressEquality) return false; + // Don't merge synthetic sections as their Data member is not valid and empty. + // The Data member needs to be valid for ICF as it is used by ICF to determine + // the equality of section contents. + if (isa(S)) + return false; + // .init and .fini contains instructions that must be executed to // initialize and finalize the process. They cannot and should not // be merged. diff --git a/lld/test/ELF/icf-merged-sections.s b/lld/test/ELF/icf-merged-sections.s index e29bd4938d70..1f6e77ec5353 100644 --- a/lld/test/ELF/icf-merged-sections.s +++ b/lld/test/ELF/icf-merged-sections.s @@ -1,20 +1,28 @@ # REQUIRES: x86 # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o -# RUN: ld.lld %t.o -o %t --icf=all --ignore-data-address-equality --print-icf-sections | FileCheck %s --check-prefix ICF -# RUN: llvm-objdump -s -d -print-imm-hex %t | FileCheck %s +# RUN: ld.lld %t.o -o %t --icf=all --ignore-data-address-equality --print-icf-sections | FileCheck -allow-empty --check-prefix=NOICF %s +# RUN: llvm-readobj -s -section-data %t | FileCheck %s -# ICF: selected section :(.rodata) -# ICF-NEXT: removing identical section :(.rodata) +# Check that merge synthetic sections are not merged by ICF. -# CHECK: {{^}}.text: -# CHECK-NEXT: movq 0x[[ADDR:[0-9a-f]+]], %rax -# CHECK-NEXT: movq 0x[[ADDR]], %rax -# CHECK: Contents of section .rodata: -# CHECK-NEXT: 2a000000 00000000 67452301 10325476 +# NOICF-NOT: selected section :(.rodata) -.section .rodata, "a" - .quad 42 +# CHECK: Name: .rodata +# CHECK-NEXT: Type: SHT_PROGBITS +# CHECK-NEXT: Flags [ +# CHECK-NEXT: SHF_ALLOC +# CHECK-NEXT: SHF_MERGE +# CHECK-NEXT: ] +# CHECK-NEXT: Address: +# CHECK-NEXT: Offset: +# CHECK-NEXT: Size: 16 +# CHECK-NEXT: Link: +# CHECK-NEXT: Info: +# CHECK-NEXT: AddressAlignment: 8 +# CHECK-NEXT: EntrySize: 0 +# CHECK-NEXT: SectionData ( +# CHECK-NEXT: 0000: 67452301 10325476 67452301 10325476 .section .rodata.cst4,"aM",@progbits,4 rodata4: @@ -27,7 +35,3 @@ rodata4: rodata8: .long 0x01234567 .long 0x76543210 - -.section .text,"ax" - movq rodata4, %rax - movq rodata8, %rax