Adds compile time flag -mllvm -memprof-histogram and runtime flag histogram=true|false to turn Histogram collection on and off. The -memprof-histogram flag relies on -memprof-use-callbacks=true to work. Updates shadow mapping logic in histogram mode from having one 8 byte counter for 64 bytes, to 1 byte for 8 bytes, capped at 255. Only supports this granularity as of now. Updates the RawMemprofReader and serializing MemoryInfoBlocks to binary format, including changing to a new version of the raw binary format from version 3 to version 4. Updates creating MemoryInfoBlocks with and without Histograms. When two MemoryInfoBlocks are merged, AccessCounts are summed up and the shorter Histogram is removed. Adds a memprof_histogram test case. Initial commit for adding AccessCountHistograms up until RawProfile for memprof
284 lines
4.9 KiB
Bash
Executable File
284 lines
4.9 KiB
Bash
Executable File
#!/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 = (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 <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
|
|
|
|
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 |