| # REQUIRES: x86 |
| |
| # RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o |
| # RUN: ld.lld -pie %t.o --icf=all --print-icf-sections -o /dev/null | \ |
| # RUN: FileCheck --check-prefixes=EXE %s |
| |
| # RUN: ld.lld -shared %t.o --icf=all --print-icf-sections -o /dev/null | \ |
| # RUN: FileCheck --check-prefix=DSO %s --implicit-check-not=removing |
| |
| ## Definitions are non-preemptible in an executable. |
| # EXE: selected section {{.*}}:(.text.h1) |
| # EXE-NEXT: removing identical section {{.*}}:(.text.h2) |
| # EXE-NEXT: removing identical section {{.*}}:(.text.h3) |
| # EXE: selected section {{.*}}:(.text.f1) |
| # EXE-NEXT: removing identical section {{.*}}:(.text.f2) |
| # EXE-NEXT: selected section {{.*}}:(.text.g1) |
| # EXE: removing identical section {{.*}}:(.text.g2) |
| # EXE-NEXT: removing identical section {{.*}}:(.text.g3) |
| |
| ## Definitions are preemptible in a DSO. Only leaf functions can be folded. |
| # DSO: selected section {{.*}}:(.text.f1) |
| # DSO-NEXT: removing identical section {{.*}}:(.text.f2) |
| # DSO-NEXT: selected section {{.*}}:(.text.g1) |
| # DSO-NEXT: removing identical section {{.*}}:(.text.g3) |
| |
| .globl f1, f2, g1, g2, g3 |
| |
| .section .text.f1 |
| f1: ret |
| .section .text.f2 |
| f2: ret |
| |
| ## In -shared mode, .text.g1 and .text.g2 cannot be folded because f1 and f2 are |
| ## preemptible and may refer to different functions at runtime. |
| .section .text.g1 |
| g1: jmp f1@plt |
| .section .text.g2 |
| g2: jmp f2@plt |
| .section .text.g3 |
| g3: jmp f1@plt |
| |
| ## In -shared mode, the sections below cannot be folded because g1, g2 and g3 |
| ## are preemptible and may refer to different functions at runtime. |
| .section .text.h1 |
| jmp g1@plt |
| .section .text.h2 |
| jmp g2@plt |
| .section .text.h3 |
| jmp g3@plt |