1 | /// Test instrumentation can handle various linkages. |
2 | // RUN: %clang_profgen -fcoverage-mapping %s -o %t |
3 | // RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t |
4 | // RUN: llvm-profdata show %t.profraw --all-functions | FileCheck %s |
5 | |
6 | // RUN: %clang_profgen -fcoverage-mapping -ffunction-sections %if target={{.*-windows-msvc.*}} %{ -Wl,-opt:ref %} %s -o %t |
7 | // RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t |
8 | // RUN: llvm-profdata show %t.profraw --all-functions | FileCheck %s |
9 | |
10 | // CHECK: {{.*}}external{{.*}}: |
11 | // CHECK-NEXT: Hash: |
12 | // CHECK-NEXT: Counters: 1 |
13 | // CHECK-NEXT: Function count: 1 |
14 | // CHECK: {{.*}}weak{{.*}}: |
15 | // CHECK-NEXT: Hash: |
16 | // CHECK-NEXT: Counters: 1 |
17 | // CHECK-NEXT: Function count: 1 |
18 | // CHECK: main: |
19 | // CHECK-NEXT: Hash: |
20 | // CHECK-NEXT: Counters: 1 |
21 | // CHECK-NEXT: Function count: 1 |
22 | // CHECK: {{.*}}internal{{.*}}: |
23 | // CHECK-NEXT: Hash: |
24 | // CHECK-NEXT: Counters: 1 |
25 | // CHECK-NEXT: Function count: 1 |
26 | // CHECK: {{.*}}linkonce_odr{{.*}}: |
27 | // CHECK-NEXT: Hash: |
28 | // CHECK-NEXT: Counters: 1 |
29 | // CHECK-NEXT: Function count: 1 |
30 | |
31 | #include <stdio.h> |
32 | |
33 | void discarded0() {} |
34 | __attribute__((weak)) void discarded1() {} |
35 | |
36 | void external() { puts(s: "external" ); } |
37 | __attribute__((weak)) void weak() { puts(s: "weak" ); } |
38 | static void internal() { puts(s: "internal" ); } |
39 | __attribute__((noinline)) inline void linkonce_odr() { puts(s: "linkonce_odr" ); } |
40 | |
41 | int main() { |
42 | internal(); |
43 | external(); |
44 | weak(); |
45 | linkonce_odr(); |
46 | } |
47 | |