#!/bin/bash if [ -z $1 ]; then echo "Path to clang required!" echo "Usage: update_memprof_inputs.sh /path/to/updated/clang" exit 1 else CLANG=$1 fi # Allows the script to be invoked from other directories. OUTDIR=$(dirname $(realpath -s $0)) read -r -d '' BASIC << EOF #include #include int main(int argc, char **argv) { char *x = (char *)malloc(10); memset(x, 0, 10); free(x); x = (char *)malloc(10); memset(x, 0, 10); free(x); return 0; } EOF read -r -d '' INLINE << EOF #include #include __attribute__((always_inline)) void qux(int x) { char *ptr = (char*) malloc(x); memset(ptr, 0, x); free(ptr); } __attribute__((noinline)) void foo(int x){ qux(x); } __attribute__((noinline)) void bar(int x) { foo(x); } int main(int argc, char **argv) { bar(argc); return 0; } EOF read -r -d '' MULTI << EOF #include #include #include int main(int argc, char **argv) { char *x = (char *)malloc(10); memset(x, 0, 10); free(x); __memprof_profile_dump(); x = (char *)malloc(10); memset(x, 0, 10); free(x); return 0; } EOF read -r -d '' BASIC_HISTOGRAM << EOF struct A { long int a; long int b; long int c; long int d; long int e; long int f; long int g; long int h; A() {}; }; void foo() { long int acc = 0; A *a = new A(); acc += a->a; acc += a->b; acc += a->c; acc += a->d; acc += a->e; acc += a->f; acc += a->g; acc += a->h; delete a; } void bar() { long int acc = 0; A *a = new A(); acc += a->a; acc += a->a; acc += a->a; acc += a->a; acc += a->a; acc += a->a; acc += a->a; acc += a->a; acc += a->b; acc += a->b; acc += a->b; acc += a->b; acc += a->b; acc += a->b; acc += a->b; acc += a->c; acc += a->c; acc += a->c; acc += a->c; acc += a->c; acc += a->c; acc += a->d; acc += a->d; acc += a->d; acc += a->d; acc += a->d; acc += a->e; acc += a->e; acc += a->e; acc += a->e; acc += a->f; acc += a->f; acc += a->f; acc += a->g; acc += a->g; acc += a->h; delete a; } int main(int argc, char **argv) { long int acc = 0; A *a = new A(); acc += a->a; acc += a->b; acc += a->c; acc += a->d; acc += a->e; acc += a->f; acc += a->g; acc += a->h; delete a; A *b = new A(); acc += b->a; acc += b->a; acc += b->a; acc += b->a; acc += b->a; acc += b->a; acc += b->a; acc += b->a; acc += b->b; acc += b->b; acc += b->b; acc += b->b; acc += b->b; acc += b->b; acc += b->b; acc += b->c; acc += b->c; acc += b->c; acc += b->c; acc += b->c; acc += b->c; acc += b->d; acc += b->d; acc += b->d; acc += b->d; acc += b->d; acc += b->e; acc += b->e; acc += b->e; acc += b->e; acc += b->f; acc += b->f; acc += b->f; acc += b->g; acc += b->g; acc += b->h; delete b; A *c = new A(); acc += c->a; for (int i = 0; i < 21; ++i) { foo(); } for (int i = 0; i < 21; ++i) { bar(); } return 0; } EOF read -r -d '' PADDING_HISTOGRAM << EOF struct A { char a; char b; long int c; char d; int e; A() {}; }; struct B { double x; double y; B() {}; }; struct C { A a; char z; B b; C() {}; }; int main(int argc, char **argv) { long int acc = 0; A *a = new A(); acc += a->a; acc += a->b; acc += a->c; acc += a->d; acc += a->e; C *c = new C(); acc += c->a.a; acc += c->a.a; acc += c->b.x; acc += c->b.y; return 0; } EOF DEFAULT_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" # Map each test to their source and any additional flags separated by ; declare -A INPUTS INPUTS["basic"]="BASIC" INPUTS["inline"]="INLINE" INPUTS["multi"]="MULTI" INPUTS["pic"]="BASIC;-pie" INPUTS["buildid"]="BASIC;-Wl,-build-id=sha1" for name in "${!INPUTS[@]}"; do IFS=";" read -r src flags <<< "${INPUTS[$name]}" echo "${!src}" > ${OUTDIR}/${name}.c ${CLANG} ${DEFAULT_MEMPROF_FLAGS} ${flags} ${OUTDIR}/${name}.c -o ${OUTDIR}/${name}.memprofexe env MEMPROF_OPTIONS=log_path=stdout ${OUTDIR}/${name}.memprofexe > ${OUTDIR}/${name}.memprofraw rm ${OUTDIR}/${name}.c done DEFAULT_HIST_FLAGS="${DEFAULT_MEMPROF_FLAGS} -mllvm -memprof-use-callbacks=true -mllvm -memprof-histogram" # Map each test to their source and any additional flags separated by ; declare -A HISTOGRAM_INPUTS HISTOGRAM_INPUTS["basic-histogram"]="BASIC_HISTOGRAM" HISTOGRAM_INPUTS["padding-histogram"]="PADDING_HISTOGRAM" for name in "${!HISTOGRAM_INPUTS[@]}"; do IFS=";" read -r src flags <<< "${HISTOGRAM_INPUTS[$name]}" echo "${!src}" > ${OUTDIR}/${name}.c ${CLANG} ${DEFAULT_HIST_FLAGS} ${flags} ${OUTDIR}/${name}.c -o ${OUTDIR}/${name}.memprofexe env MEMPROF_OPTIONS=log_path=stdout ${OUTDIR}/${name}.memprofexe > ${OUTDIR}/${name}.memprofraw rm ${OUTDIR}/${name}.c done