1*4fb3502bSReid Kleckner // Test that the instrumentation puts the right linkage on the profile data for 2*4fb3502bSReid Kleckner // inline functions. 3987d331fSReid Kleckner // RUN: %clang_profgen -g -fcoverage-mapping -c -o %t1.o %s -DOBJECT_1 4987d331fSReid Kleckner // RUN: %clang_profgen -g -fcoverage-mapping -c -o %t2.o %s 5987d331fSReid Kleckner // RUN: %clang_profgen -g -fcoverage-mapping %t1.o %t2.o -o %t.exe 6987d331fSReid Kleckner // RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t.exe 7987d331fSReid Kleckner // RUN: llvm-profdata show %t.profraw -all-functions | FileCheck %s 8987d331fSReid Kleckner 9*4fb3502bSReid Kleckner // Again, with optimizations and inlining. This tests that we use comdats 10*4fb3502bSReid Kleckner // correctly. 11*4fb3502bSReid Kleckner // RUN: %clang_profgen -O2 -g -fcoverage-mapping -c -o %t1.o %s -DOBJECT_1 12*4fb3502bSReid Kleckner // RUN: %clang_profgen -O2 -g -fcoverage-mapping -c -o %t2.o %s 13*4fb3502bSReid Kleckner // RUN: %clang_profgen -g -fcoverage-mapping %t1.o %t2.o -o %t.exe 14*4fb3502bSReid Kleckner // RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t.exe 15*4fb3502bSReid Kleckner // RUN: llvm-profdata show %t.profraw -all-functions | FileCheck %s 16987d331fSReid Kleckner 17987d331fSReid Kleckner // CHECK: {{.*}}foo{{.*}}: 18987d331fSReid Kleckner // CHECK-NEXT: Hash: 19987d331fSReid Kleckner // CHECK-NEXT: Counters: 1 20987d331fSReid Kleckner // CHECK-NEXT: Function count: 1 21987d331fSReid Kleckner // CHECK: {{.*}}inline_wrapper{{.*}}: 22987d331fSReid Kleckner // CHECK-NEXT: Hash: 23987d331fSReid Kleckner // CHECK-NEXT: Counters: 1 24987d331fSReid Kleckner // CHECK-NEXT: Function count: 2 25987d331fSReid Kleckner // CHECK: main: 26987d331fSReid Kleckner // CHECK-NEXT: Hash: 27987d331fSReid Kleckner // CHECK-NEXT: Counters: 1 28987d331fSReid Kleckner // CHECK-NEXT: Function count: 1 29987d331fSReid Kleckner 30987d331fSReid Kleckner extern "C" int puts(const char *); 31987d331fSReid Kleckner inline_wrapper(const char * msg)32987d331fSReid Klecknerinline void inline_wrapper(const char *msg) { 33987d331fSReid Kleckner puts(msg); 34987d331fSReid Kleckner } 35987d331fSReid Kleckner 36987d331fSReid Kleckner void foo(); 37987d331fSReid Kleckner 38987d331fSReid Kleckner #ifdef OBJECT_1 foo()39987d331fSReid Klecknervoid foo() { 40987d331fSReid Kleckner inline_wrapper("foo"); 41987d331fSReid Kleckner } 42987d331fSReid Kleckner #else main()43987d331fSReid Klecknerint main() { 44987d331fSReid Kleckner inline_wrapper("main"); 45987d331fSReid Kleckner foo(); 46987d331fSReid Kleckner } 47987d331fSReid Kleckner #endif 48