1effb87dfSFangrui Song // REQUIRES: lld-available
2effb87dfSFangrui Song
3*9788652dSVitaly Buka // FIXME: Investigate and fix.
4*9788652dSVitaly Buka // XFAIL: powerpc64-target-arch
5*9788652dSVitaly Buka
6effb87dfSFangrui Song // RUN: %clang_profgen -fcoverage-mapping -c %s -o %t0.o
7effb87dfSFangrui Song // RUN: %clang_profgen -fcoverage-mapping -c %s -DOBJ_1 -o %t1.o
8effb87dfSFangrui Song // RUN: %clang_profgen -fcoverage-mapping -c %s -DOBJ_2 -o %t2.o
9effb87dfSFangrui Song
10effb87dfSFangrui Song /// An external symbol can override a weak external symbol.
11effb87dfSFangrui Song // RUN: %clang_profgen -fcoverage-mapping -fuse-ld=lld %t0.o %t1.o -o %t1
12effb87dfSFangrui Song // RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t1 | FileCheck %s --check-prefix=CHECK1
13effb87dfSFangrui Song // RUN: llvm-profdata show %t.profraw --all-functions | FileCheck %s --check-prefix=PROFILE1_NOGC
14effb87dfSFangrui Song // RUN: %clang_profgen -fcoverage-mapping -fuse-ld=lld -Wl,--gc-sections %t0.o %t1.o -o %t1
15effb87dfSFangrui Song // RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t1 | FileCheck %s --check-prefix=CHECK1
16effb87dfSFangrui Song // RUN: llvm-profdata show %t.profraw --all-functions | FileCheck %s --check-prefix=PROFILE1_NOGC
17effb87dfSFangrui Song
18effb87dfSFangrui Song // RUN: %clang_profgen -fcoverage-mapping -fuse-ld=lld %t0.o %t2.o -o %t2
19effb87dfSFangrui Song // RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t2 | FileCheck %s --check-prefix=CHECK2
20effb87dfSFangrui Song // RUN: llvm-profdata show %t.profraw --all-functions | FileCheck %s --check-prefix=PROFILE2_NOGC
21effb87dfSFangrui Song // RUN: %clang_profgen -fcoverage-mapping -fuse-ld=lld -Wl,--gc-sections %t0.o %t2.o -o %t2
22effb87dfSFangrui Song // RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t2 | FileCheck %s --check-prefix=CHECK2
23effb87dfSFangrui Song // RUN: llvm-profdata show %t.profraw --all-functions | FileCheck %s --check-prefix=PROFILE2_GC
24effb87dfSFangrui Song
25effb87dfSFangrui Song /// Repeat the above tests with -ffunction-sections.
26effb87dfSFangrui Song // RUN: %clang_profgen -fcoverage-mapping -ffunction-sections -c %s -o %t0.o
27effb87dfSFangrui Song // RUN: %clang_profgen -fcoverage-mapping -ffunction-sections -c %s -DOBJ_1 -o %t1.o
28effb87dfSFangrui Song // RUN: %clang_profgen -fcoverage-mapping -ffunction-sections -c %s -DOBJ_2 -o %t2.o
29effb87dfSFangrui Song
30effb87dfSFangrui Song // RUN: %clang_profgen -fcoverage-mapping -fuse-ld=lld %t0.o %t1.o -o %t1
31effb87dfSFangrui Song // RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t1 | FileCheck %s --check-prefix=CHECK1
32effb87dfSFangrui Song // RUN: llvm-profdata show %t.profraw --all-functions | FileCheck %s --check-prefix=PROFILE1_NOGC
33effb87dfSFangrui Song // RUN: %clang_profgen -fcoverage-mapping -fuse-ld=lld -Wl,--gc-sections %t0.o %t1.o -o %t1
34effb87dfSFangrui Song // RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t1 | FileCheck %s --check-prefix=CHECK1
35effb87dfSFangrui Song // RUN: llvm-profdata show %t.profraw --all-functions | FileCheck %s --check-prefix=PROFILE1_GC
36effb87dfSFangrui Song
37effb87dfSFangrui Song // RUN: %clang_profgen -fcoverage-mapping -fuse-ld=lld %t0.o %t2.o -o %t2
38effb87dfSFangrui Song // RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t2 | FileCheck %s --check-prefix=CHECK2
39effb87dfSFangrui Song // RUN: llvm-profdata show %t.profraw --all-functions | FileCheck %s --check-prefix=PROFILE2_NOGC
40effb87dfSFangrui Song // RUN: %clang_profgen -fcoverage-mapping -fuse-ld=lld -Wl,--gc-sections %t0.o %t2.o -o %t2
41effb87dfSFangrui Song // RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t2 | FileCheck %s --check-prefix=CHECK2
42effb87dfSFangrui Song // RUN: llvm-profdata show %t.profraw --all-functions | FileCheck %s --check-prefix=PROFILE2_GC
43effb87dfSFangrui Song
44effb87dfSFangrui Song // CHECK1: strong
45effb87dfSFangrui Song // CHECK1: strong
46effb87dfSFangrui Song
47effb87dfSFangrui Song /// __profc__Z4weakv in %t1.o is local and has a zero value.
48effb87dfSFangrui Song /// Without GC it takes a duplicate entry.
49effb87dfSFangrui Song // PROFILE1_NOGC: _Z4weakv:
50effb87dfSFangrui Song // PROFILE1_NOGC-NEXT: Hash:
51effb87dfSFangrui Song // PROFILE1_NOGC-NEXT: Counters: 1
52effb87dfSFangrui Song // PROFILE1_NOGC-NEXT: Function count: 0
53effb87dfSFangrui Song // PROFILE1_NOGC: _Z4weakv:
54effb87dfSFangrui Song // PROFILE1_NOGC-NEXT: Hash:
55effb87dfSFangrui Song // PROFILE1_NOGC-NEXT: Counters: 1
56effb87dfSFangrui Song // PROFILE1_NOGC-NEXT: Function count: 2
57effb87dfSFangrui Song
58effb87dfSFangrui Song // PROFILE1_GC: _Z4weakv:
59effb87dfSFangrui Song // PROFILE1_GC-NEXT: Hash:
60effb87dfSFangrui Song // PROFILE1_GC-NEXT: Counters: 1
61effb87dfSFangrui Song // PROFILE1_GC-NEXT: Function count: 2
62effb87dfSFangrui Song // PROFILE1_GC-NOT: _Z4weakv:
63effb87dfSFangrui Song
64effb87dfSFangrui Song // CHECK2: weak
65effb87dfSFangrui Song // CHECK2: weak
66effb87dfSFangrui Song
67effb87dfSFangrui Song /// __profc__Z4weakv in %t2.o is weak and resolves to the value of %t0.o's copy.
68effb87dfSFangrui Song /// Without GC it takes a duplicate entry.
69effb87dfSFangrui Song // PROFILE2_NOGC: _Z4weakv:
70effb87dfSFangrui Song // PROFILE2_NOGC-NEXT: Hash:
71effb87dfSFangrui Song // PROFILE2_NOGC-NEXT: Counters: 1
72effb87dfSFangrui Song // PROFILE2_NOGC-NEXT: Function count: 2
73effb87dfSFangrui Song // PROFILE2_NOGC: _Z4weakv:
74effb87dfSFangrui Song // PROFILE2_NOGC-NEXT: Hash:
75effb87dfSFangrui Song // PROFILE2_NOGC-NEXT: Counters: 1
76effb87dfSFangrui Song // PROFILE2_NOGC-NEXT: Function count: 2
77effb87dfSFangrui Song
78effb87dfSFangrui Song // PROFILE2_GC: _Z4weakv:
79effb87dfSFangrui Song // PROFILE2_GC-NEXT: Hash:
80effb87dfSFangrui Song // PROFILE2_GC-NEXT: Counters: 1
81effb87dfSFangrui Song // PROFILE2_GC-NEXT: Function count: 2
82effb87dfSFangrui Song // PROFILE2_GC-NOT: _Z4weakv:
83effb87dfSFangrui Song
84effb87dfSFangrui Song #ifdef OBJ_1
85effb87dfSFangrui Song #include <stdio.h>
86effb87dfSFangrui Song
weak()87effb87dfSFangrui Song void weak() { puts("strong"); }
foo()88effb87dfSFangrui Song void foo() { weak(); }
89effb87dfSFangrui Song
90effb87dfSFangrui Song #elif defined(OBJ_2)
91effb87dfSFangrui Song #include <stdio.h>
92effb87dfSFangrui Song
weak()93effb87dfSFangrui Song __attribute__((weak)) void weak() { puts("unreachable"); }
foo()94effb87dfSFangrui Song void foo() { weak(); }
95effb87dfSFangrui Song
96effb87dfSFangrui Song #else
97effb87dfSFangrui Song #include <stdio.h>
98effb87dfSFangrui Song
weak()99effb87dfSFangrui Song __attribute__((weak)) void weak() { puts("weak"); }
100effb87dfSFangrui Song void foo();
101effb87dfSFangrui Song
main()102effb87dfSFangrui Song int main() {
103effb87dfSFangrui Song foo();
104effb87dfSFangrui Song weak();
105effb87dfSFangrui Song }
106effb87dfSFangrui Song #endif
107