xref: /llvm-project/llvm/test/tools/llvm-profdata/Inputs/update_memprof_inputs.sh (revision 30b93db5476e3ae2efdaba25fb53fcc3c081da77)
1#!/bin/bash
2
3if [ -z $1 ]; then
4  echo "Path to clang required!"
5  echo "Usage: update_memprof_inputs.sh /path/to/updated/clang"
6  exit 1
7else
8  CLANG=$1
9fi
10
11# Allows the script to be invoked from other directories.
12OUTDIR=$(dirname $(realpath -s $0))
13
14read -r -d '' BASIC << EOF
15#include <stdlib.h>
16#include <string.h>
17int main(int argc, char **argv) {
18  char *x = (char *)malloc(10);
19  memset(x, 0, 10);
20  free(x);
21  x = (char *)malloc(10);
22  memset(x, 0, 10);
23  free(x);
24  return 0;
25}
26EOF
27
28read -r -d '' INLINE << EOF
29#include <stdlib.h>
30#include <string.h>
31
32__attribute__((always_inline))
33void qux(int x) {
34  char *ptr = (char*) malloc(x);
35  memset(ptr, 0, x);
36  free(ptr);
37}
38
39__attribute__((noinline))
40void foo(int x){ qux(x); }
41
42__attribute__((noinline))
43void bar(int x) { foo(x); }
44
45int main(int argc, char **argv) {
46  bar(argc);
47  return 0;
48}
49EOF
50
51read -r -d '' MULTI << EOF
52#include <sanitizer/memprof_interface.h>
53#include <stdlib.h>
54#include <string.h>
55int main(int argc, char **argv) {
56  char *x = (char *)malloc(10);
57  memset(x, 0, 10);
58  free(x);
59  __memprof_profile_dump();
60  x = (char *)malloc(10);
61  memset(x, 0, 10);
62  free(x);
63  return 0;
64}
65EOF
66
67read -r -d '' BASIC_HISTOGRAM << EOF
68struct A {
69  long int a;
70  long int b;
71  long int c;
72  long int d;
73  long int e;
74  long int f;
75  long int g;
76  long int h;
77  A() {};
78};
79
80void foo() {
81  long int acc = 0;
82  A *a = new A();
83  acc += a->a;
84  acc += a->b;
85  acc += a->c;
86  acc += a->d;
87  acc += a->e;
88  acc += a->f;
89  acc += a->g;
90  acc += a->h;
91  delete a;
92}
93void bar() {
94  long int acc = 0;
95  A *a = new A();
96  acc += a->a;
97  acc += a->a;
98  acc += a->a;
99  acc += a->a;
100  acc += a->a;
101  acc += a->a;
102  acc += a->a;
103  acc += a->a;
104  acc += a->b;
105  acc += a->b;
106  acc += a->b;
107  acc += a->b;
108  acc += a->b;
109  acc += a->b;
110  acc += a->b;
111  acc += a->c;
112  acc += a->c;
113  acc += a->c;
114  acc += a->c;
115  acc += a->c;
116  acc += a->c;
117  acc += a->d;
118  acc += a->d;
119  acc += a->d;
120  acc += a->d;
121  acc += a->d;
122  acc += a->e;
123  acc += a->e;
124  acc += a->e;
125  acc += a->e;
126  acc += a->f;
127  acc += a->f;
128  acc += a->f;
129  acc += a->g;
130  acc += a->g;
131  acc += a->h;
132
133  delete a;
134}
135
136int main(int argc, char **argv) {
137  long int acc = 0;
138  A *a = new A();
139  acc += a->a;
140  acc += a->b;
141  acc += a->c;
142  acc += a->d;
143  acc += a->e;
144  acc += a->f;
145  acc += a->g;
146  acc += a->h;
147
148  delete a;
149
150  A *b = new A();
151  acc += b->a;
152  acc += b->a;
153  acc += b->a;
154  acc += b->a;
155  acc += b->a;
156  acc += b->a;
157  acc += b->a;
158  acc += b->a;
159  acc += b->b;
160  acc += b->b;
161  acc += b->b;
162  acc += b->b;
163  acc += b->b;
164  acc += b->b;
165  acc += b->b;
166  acc += b->c;
167  acc += b->c;
168  acc += b->c;
169  acc += b->c;
170  acc += b->c;
171  acc += b->c;
172  acc += b->d;
173  acc += b->d;
174  acc += b->d;
175  acc += b->d;
176  acc += b->d;
177  acc += b->e;
178  acc += b->e;
179  acc += b->e;
180  acc += b->e;
181  acc += b->f;
182  acc += b->f;
183  acc += b->f;
184  acc += b->g;
185  acc += b->g;
186  acc += b->h;
187
188  delete b;
189
190  A *c = new A();
191  acc += c->a;
192
193  for (int i = 0; i < 21; ++i) {
194
195    foo();
196  }
197
198  for (int i = 0; i < 21; ++i) {
199
200    bar();
201  }
202
203  return 0;
204}
205EOF
206
207read -r -d '' PADDING_HISTOGRAM << EOF
208struct A {
209  char a;
210  char b;
211  long int c;
212  char d;
213  int e;
214  A() {};
215};
216
217struct B {
218  double x;
219  double y;
220  B() {};
221};
222
223struct C {
224  A a;
225  char z;
226  B b;
227  C() {};
228};
229
230int main(int argc, char **argv) {
231  long int acc = 0;
232
233  A *a = new A();
234  acc += a->a;
235  acc += a->b;
236  acc += a->c;
237  acc += a->d;
238  acc += a->e;
239
240  C *c = new C();
241  acc += c->a.a;
242  acc += c->a.a;
243  acc += c->b.x;
244  acc += c->b.y;
245
246  return 0;
247}
248EOF
249
250
251DEFAULT_MEMPROF_FLAGS="-fuse-ld=lld -Wl,--no-rosegment -gmlt -fdebug-info-for-profiling -fmemory-profile -mno-omit-leaf-frame-pointer -fno-omit-frame-pointer -fno-optimize-sibling-calls -m64 -Wl,-build-id -no-pie"
252
253# Map each test to their source and any additional flags separated by ;
254declare -A INPUTS
255INPUTS["basic"]="BASIC"
256INPUTS["inline"]="INLINE"
257INPUTS["multi"]="MULTI"
258INPUTS["pic"]="BASIC;-pie"
259INPUTS["buildid"]="BASIC;-Wl,-build-id=sha1"
260
261for name in "${!INPUTS[@]}"; do
262  IFS=";" read -r src flags <<< "${INPUTS[$name]}"
263  echo "${!src}" > ${OUTDIR}/${name}.c
264  ${CLANG} ${DEFAULT_MEMPROF_FLAGS} ${flags} ${OUTDIR}/${name}.c -o ${OUTDIR}/${name}.memprofexe
265  env MEMPROF_OPTIONS=log_path=stdout ${OUTDIR}/${name}.memprofexe > ${OUTDIR}/${name}.memprofraw
266  rm ${OUTDIR}/${name}.c
267done
268
269
270DEFAULT_HIST_FLAGS="${DEFAULT_MEMPROF_FLAGS} -mllvm -memprof-use-callbacks=true -mllvm -memprof-histogram"
271
272
273# Map each test to their source and any additional flags separated by ;
274declare -A HISTOGRAM_INPUTS
275HISTOGRAM_INPUTS["basic-histogram"]="BASIC_HISTOGRAM"
276HISTOGRAM_INPUTS["padding-histogram"]="PADDING_HISTOGRAM"
277
278for name in "${!HISTOGRAM_INPUTS[@]}"; do
279  IFS=";" read -r src flags <<< "${HISTOGRAM_INPUTS[$name]}"
280  echo "${!src}" > ${OUTDIR}/${name}.c
281  ${CLANG} ${DEFAULT_HIST_FLAGS} ${flags} ${OUTDIR}/${name}.c -o ${OUTDIR}/${name}.memprofexe
282  env MEMPROF_OPTIONS=log_path=stdout ${OUTDIR}/${name}.memprofexe > ${OUTDIR}/${name}.memprofraw
283  rm ${OUTDIR}/${name}.c
284done