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