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