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