mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-02 10:49:22 +00:00
[ELF] Disable ICF for synthetic sections
The Data member of synthetic section's is not valid and empty. The Data member is required to be valid by ICF as it is used by ICF to determine the equality of section contents. Therefore, exclude synthetic sections from ICF. Fixes bug PR36910. Differential Revision: https://reviews.llvm.org/D44923 llvm-svn: 328624
This commit is contained in:
parent
156adaf89e
commit
ae0a7735b9
@ -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<SyntheticSection>(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.
|
||||
|
@ -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 <internal>:(.rodata)
|
||||
# ICF-NEXT: removing identical section <internal>:(.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 <internal>:(.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
|
||||
|
Loading…
Reference in New Issue
Block a user