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 Kleckner inline 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 Kleckner void foo() {
40987d331fSReid Kleckner   inline_wrapper("foo");
41987d331fSReid Kleckner }
42987d331fSReid Kleckner #else
main()43987d331fSReid Kleckner int main() {
44987d331fSReid Kleckner   inline_wrapper("main");
45987d331fSReid Kleckner   foo();
46987d331fSReid Kleckner }
47987d331fSReid Kleckner #endif
48