284 lines · bash
1#!/bin/bash2 3if [ -z $1 ]; then4 echo "Path to clang required!"5 echo "Usage: update_memprof_inputs.sh /path/to/updated/clang"6 exit 17else8 CLANG=$19fi10 11# Allows the script to be invoked from other directories.12OUTDIR=$(dirname $(realpath -s $0))13 14read -r -d '' BASIC << EOF15#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}26EOF27 28read -r -d '' INLINE << EOF29#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}49EOF50 51read -r -d '' MULTI << EOF52#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}65EOF66 67read -r -d '' BASIC_HISTOGRAM << EOF68struct 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}205EOF206 207read -r -d '' PADDING_HISTOGRAM << EOF208struct 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}248EOF249 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 INPUTS255INPUTS["basic"]="BASIC"256INPUTS["inline"]="INLINE"257INPUTS["multi"]="MULTI"258INPUTS["pic"]="BASIC;-pie"259INPUTS["buildid"]="BASIC;-Wl,-build-id=sha1"260 261for name in "${!INPUTS[@]}"; do262 IFS=";" read -r src flags <<< "${INPUTS[$name]}"263 echo "${!src}" > ${OUTDIR}/${name}.c264 ${CLANG} ${DEFAULT_MEMPROF_FLAGS} ${flags} ${OUTDIR}/${name}.c -o ${OUTDIR}/${name}.memprofexe265 env MEMPROF_OPTIONS=log_path=stdout ${OUTDIR}/${name}.memprofexe > ${OUTDIR}/${name}.memprofraw266 rm ${OUTDIR}/${name}.c267done268 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_INPUTS275HISTOGRAM_INPUTS["basic-histogram"]="BASIC_HISTOGRAM"276HISTOGRAM_INPUTS["padding-histogram"]="PADDING_HISTOGRAM"277 278for name in "${!HISTOGRAM_INPUTS[@]}"; do279 IFS=";" read -r src flags <<< "${HISTOGRAM_INPUTS[$name]}"280 echo "${!src}" > ${OUTDIR}/${name}.c281 ${CLANG} ${DEFAULT_HIST_FLAGS} ${flags} ${OUTDIR}/${name}.c -o ${OUTDIR}/${name}.memprofexe282 env MEMPROF_OPTIONS=log_path=stdout ${OUTDIR}/${name}.memprofexe > ${OUTDIR}/${name}.memprofraw283 rm ${OUTDIR}/${name}.c284done