#!/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 = 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 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