1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
#!/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 <stdlib.h>
#include <string.h>
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 <stdlib.h>
#include <string.h>
__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 <sanitizer/memprof_interface.h>
#include <stdlib.h>
#include <string.h>
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
|