xref: /netbsd-src/sys/external/bsd/compiler_rt/dist/test/profile/instrprof-value-prof.c (revision ef84fd3bd8895f4e6be1e38baf19e6dc3255bc64)
1*ef84fd3bSjoerg // RUN: %clang_profgen -O2 -o %t %s
2*ef84fd3bSjoerg // RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t 1
3*ef84fd3bSjoerg // RUN: env LLVM_PROFILE_FILE=%t-2.profraw %run %t
4*ef84fd3bSjoerg // RUN: llvm-profdata merge -o %t.profdata %t.profraw
5*ef84fd3bSjoerg // RUN: llvm-profdata merge -o %t-2.profdata %t-2.profraw
6*ef84fd3bSjoerg // RUN: llvm-profdata merge -o %t-merged.profdata %t.profraw %t-2.profdata
7*ef84fd3bSjoerg // RUN: llvm-profdata show --all-functions -ic-targets  %t-2.profdata | FileCheck  %s -check-prefix=NO-VALUE
8*ef84fd3bSjoerg // RUN: llvm-profdata show --all-functions -ic-targets  %t.profdata | FileCheck  %s
9*ef84fd3bSjoerg // RUN: llvm-profdata show --all-functions -ic-targets  %t-merged.profdata | FileCheck  %s
10*ef84fd3bSjoerg //
11*ef84fd3bSjoerg // RUN: env LLVM_PROFILE_FILE=%t-3.profraw LLVM_VP_BUFFER_SIZE=1 %run %t 1
12*ef84fd3bSjoerg // RUN: env LLVM_PROFILE_FILE=%t-4.profraw LLVM_VP_BUFFER_SIZE=8 %run %t 1
13*ef84fd3bSjoerg // RUN: env LLVM_PROFILE_FILE=%t-5.profraw LLVM_VP_BUFFER_SIZE=128 %run %t 1
14*ef84fd3bSjoerg // RUN: env LLVM_PROFILE_FILE=%t-6.profraw LLVM_VP_BUFFER_SIZE=1024 %run %t 1
15*ef84fd3bSjoerg // RUN: env LLVM_PROFILE_FILE=%t-7.profraw LLVM_VP_BUFFER_SIZE=102400 %run %t 1
16*ef84fd3bSjoerg // RUN: llvm-profdata merge -o %t-3.profdata %t-3.profraw
17*ef84fd3bSjoerg // RUN: llvm-profdata merge -o %t-4.profdata %t-4.profraw
18*ef84fd3bSjoerg // RUN: llvm-profdata merge -o %t-5.profdata %t-5.profraw
19*ef84fd3bSjoerg // RUN: llvm-profdata merge -o %t-6.profdata %t-6.profraw
20*ef84fd3bSjoerg // RUN: llvm-profdata merge -o %t-7.profdata %t-7.profraw
21*ef84fd3bSjoerg // RUN: llvm-profdata show --all-functions -ic-targets  %t-3.profdata | FileCheck  %s
22*ef84fd3bSjoerg // RUN: llvm-profdata show --all-functions -ic-targets  %t-4.profdata | FileCheck  %s
23*ef84fd3bSjoerg // RUN: llvm-profdata show --all-functions -ic-targets  %t-5.profdata | FileCheck  %s
24*ef84fd3bSjoerg // RUN: llvm-profdata show --all-functions -ic-targets  %t-6.profdata | FileCheck  %s
25*ef84fd3bSjoerg // RUN: llvm-profdata show --all-functions -ic-targets  %t-7.profdata | FileCheck  %s
26*ef84fd3bSjoerg 
27*ef84fd3bSjoerg #include <stdint.h>
28*ef84fd3bSjoerg #include <stdio.h>
29*ef84fd3bSjoerg #include <stdlib.h>
30*ef84fd3bSjoerg typedef struct __llvm_profile_data __llvm_profile_data;
31*ef84fd3bSjoerg const __llvm_profile_data *__llvm_profile_begin_data(void);
32*ef84fd3bSjoerg const __llvm_profile_data *__llvm_profile_end_data(void);
33*ef84fd3bSjoerg void __llvm_profile_set_num_value_sites(__llvm_profile_data *Data,
34*ef84fd3bSjoerg                                         uint32_t ValueKind,
35*ef84fd3bSjoerg                                         uint16_t NumValueSites);
36*ef84fd3bSjoerg __llvm_profile_data *
37*ef84fd3bSjoerg __llvm_profile_iterate_data(const __llvm_profile_data *Data);
38*ef84fd3bSjoerg void *__llvm_get_function_addr(const __llvm_profile_data *Data);
39*ef84fd3bSjoerg void __llvm_profile_instrument_target(uint64_t TargetValue, void *Data,
40*ef84fd3bSjoerg                                       uint32_t CounterIndex);
41*ef84fd3bSjoerg 
42*ef84fd3bSjoerg #define DEF_FUNC(x)                                                            \
43*ef84fd3bSjoerg   void x() {}
44*ef84fd3bSjoerg #define DEF_2_FUNCS(x) DEF_FUNC(x##_1) DEF_FUNC(x##_2)
45*ef84fd3bSjoerg #define DEF_4_FUNCS(x) DEF_2_FUNCS(x##_1) DEF_2_FUNCS(x##_2)
46*ef84fd3bSjoerg #define DEF_8_FUNCS(x) DEF_4_FUNCS(x##_1) DEF_4_FUNCS(x##_2)
47*ef84fd3bSjoerg #define DEF_16_FUNCS(x) DEF_8_FUNCS(x##_1) DEF_8_FUNCS(x##_2)
48*ef84fd3bSjoerg #define DEF_32_FUNCS(x) DEF_16_FUNCS(x##_1) DEF_16_FUNCS(x##_2)
49*ef84fd3bSjoerg #define DEF_64_FUNCS(x) DEF_32_FUNCS(x##_1) DEF_32_FUNCS(x##_2)
50*ef84fd3bSjoerg #define DEF_128_FUNCS(x) DEF_64_FUNCS(x##_1) DEF_64_FUNCS(x##_2)
51*ef84fd3bSjoerg 
52*ef84fd3bSjoerg #define FUNC_ADDR(x) &x,
53*ef84fd3bSjoerg #define FUNC_2_ADDRS(x) FUNC_ADDR(x##_1) FUNC_ADDR(x##_2)
54*ef84fd3bSjoerg #define FUNC_4_ADDRS(x) FUNC_2_ADDRS(x##_1) FUNC_2_ADDRS(x##_2)
55*ef84fd3bSjoerg #define FUNC_8_ADDRS(x) FUNC_4_ADDRS(x##_1) FUNC_4_ADDRS(x##_2)
56*ef84fd3bSjoerg #define FUNC_16_ADDRS(x) FUNC_8_ADDRS(x##_1) FUNC_8_ADDRS(x##_2)
57*ef84fd3bSjoerg #define FUNC_32_ADDRS(x) FUNC_16_ADDRS(x##_1) FUNC_16_ADDRS(x##_2)
58*ef84fd3bSjoerg #define FUNC_64_ADDRS(x) FUNC_32_ADDRS(x##_1) FUNC_32_ADDRS(x##_2)
59*ef84fd3bSjoerg #define FUNC_128_ADDRS(x) FUNC_64_ADDRS(x##_1) FUNC_64_ADDRS(x##_2)
60*ef84fd3bSjoerg 
61*ef84fd3bSjoerg DEF_8_FUNCS(callee)
62*ef84fd3bSjoerg DEF_128_FUNCS(caller)
63*ef84fd3bSjoerg 
64*ef84fd3bSjoerg void *CallerAddrs[] = {FUNC_128_ADDRS(caller)};
65*ef84fd3bSjoerg void *CalleeAddrs[] = {FUNC_8_ADDRS(callee)};
66*ef84fd3bSjoerg typedef struct CallerInfo {
67*ef84fd3bSjoerg     void *CallerAddr;
68*ef84fd3bSjoerg     uint32_t NS; /* Number value sites. */
69*ef84fd3bSjoerg } CallerInfo;
70*ef84fd3bSjoerg 
71*ef84fd3bSjoerg CallerInfo CallerInfos[128];
72*ef84fd3bSjoerg 
cmpaddr(const void * p1,const void * p2)73*ef84fd3bSjoerg int cmpaddr(const void *p1, const void *p2) {
74*ef84fd3bSjoerg   CallerInfo *addr1 = (CallerInfo *)p1;
75*ef84fd3bSjoerg   CallerInfo *addr2 = (CallerInfo *)p2;
76*ef84fd3bSjoerg   return (intptr_t)addr2->CallerAddr - (intptr_t)addr1->CallerAddr;
77*ef84fd3bSjoerg }
78*ef84fd3bSjoerg 
main(int argc,const char * argv[])79*ef84fd3bSjoerg int main(int argc, const char *argv[]) {
80*ef84fd3bSjoerg   unsigned S, NS = 0, I, V, doInstrument = 1;
81*ef84fd3bSjoerg   const __llvm_profile_data *Data, *DataEnd;
82*ef84fd3bSjoerg 
83*ef84fd3bSjoerg   if (argc < 2)
84*ef84fd3bSjoerg     doInstrument = 0;
85*ef84fd3bSjoerg 
86*ef84fd3bSjoerg   for (I = 0; I < 128; I++) {
87*ef84fd3bSjoerg      CallerInfos[I].CallerAddr = CallerAddrs[I];
88*ef84fd3bSjoerg      CallerInfos[I].NS = I;
89*ef84fd3bSjoerg   }
90*ef84fd3bSjoerg   qsort(CallerInfos, sizeof(CallerInfos) / sizeof(CallerInfo), sizeof(CallerInfo),
91*ef84fd3bSjoerg         cmpaddr);
92*ef84fd3bSjoerg 
93*ef84fd3bSjoerg   /* We will synthesis value profile data for 128 callers functions.
94*ef84fd3bSjoerg    * The number of * value sites. The number values for each value site
95*ef84fd3bSjoerg    * ranges from 0 to 8.  */
96*ef84fd3bSjoerg 
97*ef84fd3bSjoerg   Data = __llvm_profile_begin_data();
98*ef84fd3bSjoerg   DataEnd = __llvm_profile_end_data();
99*ef84fd3bSjoerg 
100*ef84fd3bSjoerg   for (; Data < DataEnd; Data = __llvm_profile_iterate_data(Data)) {
101*ef84fd3bSjoerg     void *func = __llvm_get_function_addr(Data);
102*ef84fd3bSjoerg     CallerInfo Key, *Res;
103*ef84fd3bSjoerg     Key.CallerAddr = func;
104*ef84fd3bSjoerg     Res = (CallerInfo *) bsearch(&Key, CallerInfos, sizeof(CallerInfos) / sizeof(CallerInfo),
105*ef84fd3bSjoerg                                  sizeof(CallerInfo), cmpaddr);
106*ef84fd3bSjoerg     if (Res) {
107*ef84fd3bSjoerg       NS = Res->NS;
108*ef84fd3bSjoerg       __llvm_profile_set_num_value_sites((__llvm_profile_data *)Data,
109*ef84fd3bSjoerg                                          0 /*IPVK_IndirectCallTarget */, NS);
110*ef84fd3bSjoerg       if (!doInstrument) {
111*ef84fd3bSjoerg         continue;
112*ef84fd3bSjoerg       }
113*ef84fd3bSjoerg       for (S = 0; S < NS; S++) {
114*ef84fd3bSjoerg         for (V = 0; V < S % 8; V++) {
115*ef84fd3bSjoerg           unsigned C;
116*ef84fd3bSjoerg           for (C = 0; C < V + 1; C++)
117*ef84fd3bSjoerg             __llvm_profile_instrument_target((uint64_t)CalleeAddrs[V],
118*ef84fd3bSjoerg                                              (void *)Data, S);
119*ef84fd3bSjoerg         }
120*ef84fd3bSjoerg       }
121*ef84fd3bSjoerg     }
122*ef84fd3bSjoerg   }
123*ef84fd3bSjoerg }
124*ef84fd3bSjoerg 
125*ef84fd3bSjoerg // NO-VALUE: Indirect Call Site Count: 127
126*ef84fd3bSjoerg // NO-VALUE-NEXT: Indirect Target Results:
127*ef84fd3bSjoerg // CHECK-LABEL: caller_1_1_1_1_2_2_1:
128*ef84fd3bSjoerg // CHECK: Indirect Call Site Count: 6
129*ef84fd3bSjoerg // CHECK-NEXT: Indirect Target Results:
130*ef84fd3bSjoerg // CHECK-NEXT: [ 1, callee_1_1_1, 1 ]
131*ef84fd3bSjoerg // CHECK-NEXT: [ 2, callee_1_1_2, 2 ]
132*ef84fd3bSjoerg // CHECK-NEXT: [ 2, callee_1_1_1, 1 ]
133*ef84fd3bSjoerg // CHECK-NEXT: [ 3, callee_1_2_1, 3 ]
134*ef84fd3bSjoerg // CHECK-NEXT: [ 3, callee_1_1_2, 2 ]
135*ef84fd3bSjoerg // CHECK-NEXT: [ 3, callee_1_1_1, 1 ]
136*ef84fd3bSjoerg // CHECK-NEXT: [ 4, callee_1_2_2, 4 ]
137*ef84fd3bSjoerg // CHECK-NEXT: [ 4, callee_1_2_1, 3 ]
138*ef84fd3bSjoerg // CHECK-NEXT: [ 4, callee_1_1_2, 2 ]
139*ef84fd3bSjoerg // CHECK-NEXT: [ 4, callee_1_1_1, 1 ]
140*ef84fd3bSjoerg // CHECK-NEXT: [ 5, callee_2_1_1, 5 ]
141*ef84fd3bSjoerg // CHECK-NEXT: [ 5, callee_1_2_2, 4 ]
142*ef84fd3bSjoerg // CHECK-NEXT: [ 5, callee_1_2_1, 3 ]
143*ef84fd3bSjoerg // CHECK-NEXT: [ 5, callee_1_1_2, 2 ]
144*ef84fd3bSjoerg // CHECK-NEXT: [ 5, callee_1_1_1, 1 ]
145*ef84fd3bSjoerg // CHECK-LABEL: caller_2_2_2_2_2_2_2:
146*ef84fd3bSjoerg // CHECK: Indirect Call Site Count: 127
147*ef84fd3bSjoerg // CHECK-NEXT: Indirect Target Results:
148*ef84fd3bSjoerg // CHECK-NEXT:  [ 1, callee_1_1_1, 1 ]
149*ef84fd3bSjoerg // CHECK-NEXT:  [ 2, callee_1_1_2, 2 ]
150*ef84fd3bSjoerg // CHECK-NEXT:  [ 2, callee_1_1_1, 1 ]
151*ef84fd3bSjoerg // CHECK-NEXT:  [ 3, callee_1_2_1, 3 ]
152*ef84fd3bSjoerg // CHECK-NEXT:  [ 3, callee_1_1_2, 2 ]
153*ef84fd3bSjoerg // CHECK-NEXT:  [ 3, callee_1_1_1, 1 ]
154*ef84fd3bSjoerg // CHECK-NEXT:  [ 4, callee_1_2_2, 4 ]
155*ef84fd3bSjoerg // CHECK-NEXT:  [ 4, callee_1_2_1, 3 ]
156*ef84fd3bSjoerg // CHECK-NEXT:  [ 4, callee_1_1_2, 2 ]
157*ef84fd3bSjoerg // CHECK-NEXT:  [ 4, callee_1_1_1, 1 ]
158*ef84fd3bSjoerg // CHECK-NEXT:  [ 5, callee_2_1_1, 5 ]
159*ef84fd3bSjoerg // CHECK-NEXT:  [ 5, callee_1_2_2, 4 ]
160*ef84fd3bSjoerg // CHECK-NEXT:  [ 5, callee_1_2_1, 3 ]
161*ef84fd3bSjoerg // CHECK-NEXT:  [ 5, callee_1_1_2, 2 ]
162*ef84fd3bSjoerg // CHECK-NEXT:  [ 5, callee_1_1_1, 1 ]
163*ef84fd3bSjoerg // CHECK-NEXT:  [ 6, callee_2_1_2, 6 ]
164*ef84fd3bSjoerg // CHECK-NEXT:  [ 6, callee_2_1_1, 5 ]
165*ef84fd3bSjoerg // CHECK-NEXT:  [ 6, callee_1_2_2, 4 ]
166*ef84fd3bSjoerg // CHECK-NEXT:  [ 6, callee_1_2_1, 3 ]
167*ef84fd3bSjoerg // CHECK-NEXT:  [ 6, callee_1_1_2, 2 ]
168*ef84fd3bSjoerg // CHECK-NEXT:  [ 6, callee_1_1_1, 1 ]
169*ef84fd3bSjoerg // CHECK-NEXT:  [ 7, callee_2_2_1, 7 ]
170*ef84fd3bSjoerg // CHECK-NEXT:  [ 7, callee_2_1_2, 6 ]
171*ef84fd3bSjoerg // CHECK-NEXT:  [ 7, callee_2_1_1, 5 ]
172*ef84fd3bSjoerg // CHECK-NEXT:  [ 7, callee_1_2_2, 4 ]
173*ef84fd3bSjoerg // CHECK-NEXT:  [ 7, callee_1_2_1, 3 ]
174*ef84fd3bSjoerg // CHECK-NEXT:  [ 7, callee_1_1_2, 2 ]
175*ef84fd3bSjoerg // CHECK-NEXT:  [ 7, callee_1_1_1, 1 ]
176*ef84fd3bSjoerg // CHECK-NEXT:  [ 9, callee_1_1_1, 1 ]
177*ef84fd3bSjoerg // CHECK-NEXT:  [ 10, callee_1_1_2, 2 ]
178*ef84fd3bSjoerg // CHECK-NEXT:  [ 10, callee_1_1_1, 1 ]
179*ef84fd3bSjoerg // CHECK-NEXT:  [ 11, callee_1_2_1, 3 ]
180*ef84fd3bSjoerg // CHECK-NEXT:  [ 11, callee_1_1_2, 2 ]
181*ef84fd3bSjoerg // CHECK-NEXT:  [ 11, callee_1_1_1, 1 ]
182*ef84fd3bSjoerg // CHECK-NEXT:  [ 12, callee_1_2_2, 4 ]
183*ef84fd3bSjoerg // CHECK-NEXT:  [ 12, callee_1_2_1, 3 ]
184*ef84fd3bSjoerg // CHECK-NEXT:  [ 12, callee_1_1_2, 2 ]
185*ef84fd3bSjoerg // CHECK-NEXT:  [ 12, callee_1_1_1, 1 ]
186*ef84fd3bSjoerg // CHECK-NEXT:  [ 13, callee_2_1_1, 5 ]
187*ef84fd3bSjoerg // CHECK-NEXT:  [ 13, callee_1_2_2, 4 ]
188*ef84fd3bSjoerg // CHECK-NEXT:  [ 13, callee_1_2_1, 3 ]
189*ef84fd3bSjoerg // CHECK-NEXT:  [ 13, callee_1_1_2, 2 ]
190*ef84fd3bSjoerg // CHECK-NEXT:  [ 13, callee_1_1_1, 1 ]
191*ef84fd3bSjoerg // CHECK-NEXT:  [ 14, callee_2_1_2, 6 ]
192*ef84fd3bSjoerg // CHECK-NEXT:  [ 14, callee_2_1_1, 5 ]
193*ef84fd3bSjoerg // CHECK-NEXT:  [ 14, callee_1_2_2, 4 ]
194*ef84fd3bSjoerg // CHECK-NEXT:  [ 14, callee_1_2_1, 3 ]
195*ef84fd3bSjoerg // CHECK-NEXT:  [ 14, callee_1_1_2, 2 ]
196*ef84fd3bSjoerg // CHECK-NEXT:  [ 14, callee_1_1_1, 1 ]
197*ef84fd3bSjoerg // CHECK-NEXT:  [ 15, callee_2_2_1, 7 ]
198*ef84fd3bSjoerg // CHECK-NEXT:  [ 15, callee_2_1_2, 6 ]
199*ef84fd3bSjoerg // CHECK-NEXT:  [ 15, callee_2_1_1, 5 ]
200*ef84fd3bSjoerg // CHECK-NEXT:  [ 15, callee_1_2_2, 4 ]
201*ef84fd3bSjoerg // CHECK-NEXT:  [ 15, callee_1_2_1, 3 ]
202*ef84fd3bSjoerg // CHECK-NEXT:  [ 15, callee_1_1_2, 2 ]
203*ef84fd3bSjoerg // CHECK-NEXT:  [ 15, callee_1_1_1, 1 ]
204*ef84fd3bSjoerg // CHECK-NEXT:  [ 17, callee_1_1_1, 1 ]
205*ef84fd3bSjoerg // CHECK-NEXT:  [ 18, callee_1_1_2, 2 ]
206*ef84fd3bSjoerg // CHECK-NEXT:  [ 18, callee_1_1_1, 1 ]
207*ef84fd3bSjoerg // CHECK-NEXT:  [ 19, callee_1_2_1, 3 ]
208*ef84fd3bSjoerg // CHECK-NEXT:  [ 19, callee_1_1_2, 2 ]
209*ef84fd3bSjoerg // CHECK-NEXT:  [ 19, callee_1_1_1, 1 ]
210*ef84fd3bSjoerg // CHECK-NEXT:  [ 20, callee_1_2_2, 4 ]
211*ef84fd3bSjoerg // CHECK-NEXT:  [ 20, callee_1_2_1, 3 ]
212*ef84fd3bSjoerg // CHECK-NEXT:  [ 20, callee_1_1_2, 2 ]
213*ef84fd3bSjoerg // CHECK-NEXT:  [ 20, callee_1_1_1, 1 ]
214*ef84fd3bSjoerg // CHECK-NEXT:  [ 21, callee_2_1_1, 5 ]
215*ef84fd3bSjoerg // CHECK-NEXT:  [ 21, callee_1_2_2, 4 ]
216*ef84fd3bSjoerg // CHECK-NEXT:  [ 21, callee_1_2_1, 3 ]
217*ef84fd3bSjoerg // CHECK-NEXT:  [ 21, callee_1_1_2, 2 ]
218*ef84fd3bSjoerg // CHECK-NEXT:  [ 21, callee_1_1_1, 1 ]
219*ef84fd3bSjoerg // CHECK-NEXT:  [ 22, callee_2_1_2, 6 ]
220*ef84fd3bSjoerg // CHECK-NEXT:  [ 22, callee_2_1_1, 5 ]
221*ef84fd3bSjoerg // CHECK-NEXT:  [ 22, callee_1_2_2, 4 ]
222*ef84fd3bSjoerg // CHECK-NEXT:  [ 22, callee_1_2_1, 3 ]
223*ef84fd3bSjoerg // CHECK-NEXT:  [ 22, callee_1_1_2, 2 ]
224*ef84fd3bSjoerg // CHECK-NEXT:  [ 22, callee_1_1_1, 1 ]
225*ef84fd3bSjoerg 
226