xref: /llvm-project/compiler-rt/test/profile/Linux/coverage-linkage.cpp (revision 9788652dd08a1a0ac2e23a3b1e8c4054966a3b94)
1b19c0ac7SFangrui Song /// Test instrumentation can handle various linkages.
27b6b15e0SFangrui Song // REQUIRES: lld-available
3*9788652dSVitaly Buka 
4*9788652dSVitaly Buka // FIXME: Investigate and fix.
5*9788652dSVitaly Buka // XFAIL: powerpc64-target-arch
6*9788652dSVitaly Buka 
7b19c0ac7SFangrui Song // RUN: %clang_profgen -fcoverage-mapping %s -o %t
8b19c0ac7SFangrui Song // RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t
97b6b15e0SFangrui Song // RUN: llvm-profdata show %t.profraw --all-functions | FileCheck %s
10b19c0ac7SFangrui Song 
117b6b15e0SFangrui Song // RUN: %clang_profgen -fcoverage-mapping -ffunction-sections -fuse-ld=lld -Wl,--gc-sections %s -o %t
12b19c0ac7SFangrui Song // RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t
137b6b15e0SFangrui Song // RUN: llvm-profdata show %t.profraw --all-functions | FileCheck %s
147b6b15e0SFangrui Song 
157b6b15e0SFangrui Song // CHECK:      {{.*}}external{{.*}}:
167b6b15e0SFangrui Song // CHECK-NEXT:    Hash:
177b6b15e0SFangrui Song // CHECK-NEXT:    Counters: 1
187b6b15e0SFangrui Song // CHECK-NEXT:    Function count: 1
197b6b15e0SFangrui Song // CHECK:      {{.*}}weak{{.*}}:
207b6b15e0SFangrui Song // CHECK-NEXT:    Hash:
217b6b15e0SFangrui Song // CHECK-NEXT:    Counters: 1
227b6b15e0SFangrui Song // CHECK-NEXT:    Function count: 1
237b6b15e0SFangrui Song // CHECK:      main:
247b6b15e0SFangrui Song // CHECK-NEXT:    Hash:
257b6b15e0SFangrui Song // CHECK-NEXT:    Counters: 1
267b6b15e0SFangrui Song // CHECK-NEXT:    Function count: 1
277b6b15e0SFangrui Song // CHECK:      {{.*}}internal{{.*}}:
287b6b15e0SFangrui Song // CHECK-NEXT:    Hash:
297b6b15e0SFangrui Song // CHECK-NEXT:    Counters: 1
307b6b15e0SFangrui Song // CHECK-NEXT:    Function count: 1
317b6b15e0SFangrui Song // CHECK:      {{.*}}linkonce_odr{{.*}}:
327b6b15e0SFangrui Song // CHECK-NEXT:    Hash:
337b6b15e0SFangrui Song // CHECK-NEXT:    Counters: 1
347b6b15e0SFangrui Song // CHECK-NEXT:    Function count: 1
35b19c0ac7SFangrui Song 
36b19c0ac7SFangrui Song #include <stdio.h>
37b19c0ac7SFangrui Song 
discarded0()38b19c0ac7SFangrui Song void discarded0() {}
discarded1()39b19c0ac7SFangrui Song __attribute__((weak)) void discarded1() {}
40b19c0ac7SFangrui Song 
external()41b19c0ac7SFangrui Song void external() { puts("external"); }
weak()42b19c0ac7SFangrui Song __attribute__((weak)) void weak() { puts("weak"); }
internal()43b19c0ac7SFangrui Song static void internal() { puts("internal"); }
linkonce_odr()44b19c0ac7SFangrui Song __attribute__((noinline)) inline void linkonce_odr() { puts("linkonce_odr"); }
45b19c0ac7SFangrui Song 
main()46b19c0ac7SFangrui Song int main() {
47b19c0ac7SFangrui Song   internal();
48b19c0ac7SFangrui Song   external();
49b19c0ac7SFangrui Song   weak();
50b19c0ac7SFangrui Song   linkonce_odr();
51b19c0ac7SFangrui Song }
52