xref: /netbsd-src/sys/external/bsd/compiler_rt/dist/test/profile/instrprof-value-prof-2.c (revision ef84fd3bd8895f4e6be1e38baf19e6dc3255bc64)
1*ef84fd3bSjoerg // RUN: %clang_profgen -O2 -o %t %s
2*ef84fd3bSjoerg // RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t
3*ef84fd3bSjoerg // RUN: llvm-profdata merge -o %t.profdata %t.profraw
4*ef84fd3bSjoerg // RUN: llvm-profdata show --all-functions -ic-targets  %t.profdata |  FileCheck  %s
5*ef84fd3bSjoerg 
6*ef84fd3bSjoerg #include <stdint.h>
7*ef84fd3bSjoerg #include <stdio.h>
8*ef84fd3bSjoerg #include <stdlib.h>
9*ef84fd3bSjoerg typedef struct __llvm_profile_data __llvm_profile_data;
10*ef84fd3bSjoerg const __llvm_profile_data *__llvm_profile_begin_data(void);
11*ef84fd3bSjoerg const __llvm_profile_data *__llvm_profile_end_data(void);
12*ef84fd3bSjoerg void __llvm_profile_set_num_value_sites(__llvm_profile_data *Data,
13*ef84fd3bSjoerg                                         uint32_t ValueKind,
14*ef84fd3bSjoerg                                         uint16_t NumValueSites);
15*ef84fd3bSjoerg __llvm_profile_data *
16*ef84fd3bSjoerg __llvm_profile_iterate_data(const __llvm_profile_data *Data);
17*ef84fd3bSjoerg void *__llvm_get_function_addr(const __llvm_profile_data *Data);
18*ef84fd3bSjoerg void __llvm_profile_instrument_target(uint64_t TargetValue, void *Data,
19*ef84fd3bSjoerg                                       uint32_t CounterIndex);
callee1()20*ef84fd3bSjoerg void callee1() {}
callee2()21*ef84fd3bSjoerg void callee2() {}
22*ef84fd3bSjoerg 
caller_without_value_site1()23*ef84fd3bSjoerg void caller_without_value_site1() {}
caller_with_value_site_never_called1()24*ef84fd3bSjoerg void caller_with_value_site_never_called1() {}
caller_with_vp1()25*ef84fd3bSjoerg void caller_with_vp1() {}
caller_with_value_site_never_called2()26*ef84fd3bSjoerg void caller_with_value_site_never_called2() {}
caller_without_value_site2()27*ef84fd3bSjoerg void caller_without_value_site2() {}
caller_with_vp2()28*ef84fd3bSjoerg void caller_with_vp2() {}
29*ef84fd3bSjoerg 
main(int argc,const char * argv[])30*ef84fd3bSjoerg int main(int argc, const char *argv[]) {
31*ef84fd3bSjoerg   unsigned S, NS = 10, V;
32*ef84fd3bSjoerg   const __llvm_profile_data *Data, *DataEnd;
33*ef84fd3bSjoerg 
34*ef84fd3bSjoerg   Data = __llvm_profile_begin_data();
35*ef84fd3bSjoerg   DataEnd = __llvm_profile_end_data();
36*ef84fd3bSjoerg   for (; Data < DataEnd; Data = __llvm_profile_iterate_data(Data)) {
37*ef84fd3bSjoerg     void *func = __llvm_get_function_addr(Data);
38*ef84fd3bSjoerg     if (func == caller_without_value_site1 ||
39*ef84fd3bSjoerg         func == caller_without_value_site2 ||
40*ef84fd3bSjoerg         func == callee1 || func == callee2 || func == main)
41*ef84fd3bSjoerg       continue;
42*ef84fd3bSjoerg 
43*ef84fd3bSjoerg     __llvm_profile_set_num_value_sites((__llvm_profile_data *)Data,
44*ef84fd3bSjoerg                                        0 /*IPVK_IndirectCallTarget */, 10);
45*ef84fd3bSjoerg 
46*ef84fd3bSjoerg     if (func == caller_with_value_site_never_called1 ||
47*ef84fd3bSjoerg         func == caller_with_value_site_never_called2)
48*ef84fd3bSjoerg       continue;
49*ef84fd3bSjoerg     for (S = 0; S < NS; S++) {
50*ef84fd3bSjoerg       unsigned C;
51*ef84fd3bSjoerg       for (C = 0; C < S + 1; C++) {
52*ef84fd3bSjoerg         __llvm_profile_instrument_target((uint64_t)&callee1, (void *)Data, S);
53*ef84fd3bSjoerg         if (C % 2 == 0)
54*ef84fd3bSjoerg           __llvm_profile_instrument_target((uint64_t)&callee2, (void *)Data, S);
55*ef84fd3bSjoerg       }
56*ef84fd3bSjoerg     }
57*ef84fd3bSjoerg   }
58*ef84fd3bSjoerg }
59*ef84fd3bSjoerg 
60*ef84fd3bSjoerg // CHECK-LABEL:   caller_with_value_site_never_called2:
61*ef84fd3bSjoerg // CHECK-NEXT:    Hash: 0x0000000000000000
62*ef84fd3bSjoerg // CHECK-NEXT:    Counters:
63*ef84fd3bSjoerg // CHECK-NEXT:    Function count
64*ef84fd3bSjoerg // CHECK-NEXT:    Indirect Call Site Count: 10
65*ef84fd3bSjoerg // CHECK-NEXT:    Indirect Target Results:
66*ef84fd3bSjoerg // CHECK-LABEL:   caller_with_vp2:
67*ef84fd3bSjoerg // CHECK-NEXT:    Hash: 0x0000000000000000
68*ef84fd3bSjoerg // CHECK-NEXT:    Counters:
69*ef84fd3bSjoerg // CHECK-NEXT:    Function count:
70*ef84fd3bSjoerg // CHECK-NEXT:    Indirect Call Site Count: 10
71*ef84fd3bSjoerg // CHECK-NEXT:    Indirect Target Results:
72*ef84fd3bSjoerg // CHECK-NEXT:	[ 0, callee1, 1 ]
73*ef84fd3bSjoerg // CHECK-NEXT:	[ 0, callee2, 1 ]
74*ef84fd3bSjoerg // CHECK-NEXT:	[ 1, callee1, 2 ]
75*ef84fd3bSjoerg // CHECK-NEXT:	[ 1, callee2, 1 ]
76*ef84fd3bSjoerg // CHECK-NEXT:	[ 2, callee1, 3 ]
77*ef84fd3bSjoerg // CHECK-NEXT:	[ 2, callee2, 2 ]
78*ef84fd3bSjoerg // CHECK-NEXT:	[ 3, callee1, 4 ]
79*ef84fd3bSjoerg // CHECK-NEXT:	[ 3, callee2, 2 ]
80*ef84fd3bSjoerg // CHECK-NEXT:	[ 4, callee1, 5 ]
81*ef84fd3bSjoerg // CHECK-NEXT:	[ 4, callee2, 3 ]
82*ef84fd3bSjoerg // CHECK-NEXT:	[ 5, callee1, 6 ]
83*ef84fd3bSjoerg // CHECK-NEXT:	[ 5, callee2, 3 ]
84*ef84fd3bSjoerg // CHECK-NEXT:	[ 6, callee1, 7 ]
85*ef84fd3bSjoerg // CHECK-NEXT:	[ 6, callee2, 4 ]
86*ef84fd3bSjoerg // CHECK-NEXT:	[ 7, callee1, 8 ]
87*ef84fd3bSjoerg // CHECK-NEXT:	[ 7, callee2, 4 ]
88*ef84fd3bSjoerg // CHECK-NEXT:	[ 8, callee1, 9 ]
89*ef84fd3bSjoerg // CHECK-NEXT:	[ 8, callee2, 5 ]
90*ef84fd3bSjoerg // CHECK-NEXT:	[ 9, callee1, 10 ]
91*ef84fd3bSjoerg // CHECK-NEXT:	[ 9, callee2, 5 ]
92*ef84fd3bSjoerg // CHECK-LABEL:   caller_with_vp1:
93*ef84fd3bSjoerg // CHECK-NEXT:    Hash: 0x0000000000000000
94*ef84fd3bSjoerg // CHECK-NEXT:    Counters:
95*ef84fd3bSjoerg // CHECK-NEXT:    Function count
96*ef84fd3bSjoerg // CHECK-NEXT:    Indirect Call Site Count: 10
97*ef84fd3bSjoerg // CHECK-NEXT:    Indirect Target Results:
98*ef84fd3bSjoerg // CHECK-NEXT:	[ 0, callee1, 1 ]
99*ef84fd3bSjoerg // CHECK-NEXT:	[ 0, callee2, 1 ]
100*ef84fd3bSjoerg // CHECK-NEXT:	[ 1, callee1, 2 ]
101*ef84fd3bSjoerg // CHECK-NEXT:	[ 1, callee2, 1 ]
102*ef84fd3bSjoerg // CHECK-NEXT:	[ 2, callee1, 3 ]
103*ef84fd3bSjoerg // CHECK-NEXT:	[ 2, callee2, 2 ]
104*ef84fd3bSjoerg // CHECK-NEXT:	[ 3, callee1, 4 ]
105*ef84fd3bSjoerg // CHECK-NEXT:	[ 3, callee2, 2 ]
106*ef84fd3bSjoerg // CHECK-NEXT:	[ 4, callee1, 5 ]
107*ef84fd3bSjoerg // CHECK-NEXT:	[ 4, callee2, 3 ]
108*ef84fd3bSjoerg // CHECK-NEXT:	[ 5, callee1, 6 ]
109*ef84fd3bSjoerg // CHECK-NEXT:	[ 5, callee2, 3 ]
110*ef84fd3bSjoerg // CHECK-NEXT:	[ 6, callee1, 7 ]
111*ef84fd3bSjoerg // CHECK-NEXT:	[ 6, callee2, 4 ]
112*ef84fd3bSjoerg // CHECK-NEXT:	[ 7, callee1, 8 ]
113*ef84fd3bSjoerg // CHECK-NEXT:	[ 7, callee2, 4 ]
114*ef84fd3bSjoerg // CHECK-NEXT:	[ 8, callee1, 9 ]
115*ef84fd3bSjoerg // CHECK-NEXT:	[ 8, callee2, 5 ]
116*ef84fd3bSjoerg // CHECK-NEXT:	[ 9, callee1, 10 ]
117*ef84fd3bSjoerg // CHECK-NEXT:	[ 9, callee2, 5 ]
118*ef84fd3bSjoerg // CHECK-LABEL:   caller_with_value_site_never_called1:
119*ef84fd3bSjoerg // CHECK-NEXT:    Hash: 0x0000000000000000
120*ef84fd3bSjoerg // CHECK-NEXT:    Counters:
121*ef84fd3bSjoerg // CHECK-NEXT:    Function count:
122*ef84fd3bSjoerg // CHECK-NEXT:    Indirect Call Site Count: 10
123*ef84fd3bSjoerg // CHECK-NEXT:    Indirect Target Results:
124*ef84fd3bSjoerg // CHECK-LABEL:   caller_without_value_site2:
125*ef84fd3bSjoerg // CHECK-NEXT:    Hash: 0x0000000000000000
126*ef84fd3bSjoerg // CHECK-NEXT:    Counters:
127*ef84fd3bSjoerg // CHECK-NEXT:    Function count:
128*ef84fd3bSjoerg // CHECK-NEXT:    Indirect Call Site Count: 0
129*ef84fd3bSjoerg // CHECK-NEXT:    Indirect Target Results:
130*ef84fd3bSjoerg // CHECK-LABEL:   caller_without_value_site1:
131*ef84fd3bSjoerg // CHECK-NEXT:    Hash: 0x0000000000000000
132*ef84fd3bSjoerg // CHECK-NEXT:    Counters:
133*ef84fd3bSjoerg // CHECK-NEXT:    Function count:
134*ef84fd3bSjoerg // CHECK-NEXT:    Indirect Call Site Count: 0
135*ef84fd3bSjoerg // CHECK-NEXT:    Indirect Target Results:
136