#!/bin/bash # # Script that prints information about generated code in TSan runtime. set -e set -u if [[ "$#" != 1 ]]; then echo "Usage: $0 /path/to/binary/built/with/tsan" exit 1 fi get_asm() { grep __tsan_$1.: -A 10000 ${OBJDUMP_CONTENTS} | \ awk "/[^:]$/ {print;} />:/ {c++; if (c == 2) {exit}}" } list="write1 \ write2 \ write4 \ write8 \ read1 \ read2 \ read4 \ read8 \ func_entry \ func_exit" BIN=$1 OUTPUT_DIR=$(mktemp -t -d analyze_libtsan_out.XXXXXXXX) OBJDUMP_CONTENTS=${OUTPUT_DIR}/libtsan_objdump NM_CONTENTS=${OUTPUT_DIR}/libtsan_nm objdump -d $BIN > ${OBJDUMP_CONTENTS} nm -S $BIN | grep "__tsan_" > ${NM_CONTENTS} for f in $list; do file=${OUTPUT_DIR}/asm_$f.s get_asm $f > $file tot=$(wc -l < $file) size=$(grep __tsan_$f$ ${NM_CONTENTS} | awk --non-decimal-data '{print ("0x"$2)+0}') rsp=$(grep '(%rsp)' $file | wc -l) push=$(grep 'push' $file | wc -l) pop=$(grep 'pop' $file | wc -l) call=$(grep 'call' $file | wc -l) load=$(egrep 'mov .*\,.*\(.*\)|cmp .*\,.*\(.*\)' $file | wc -l) store=$(egrep 'mov .*\(.*\),' $file | wc -l) mov=$(grep 'mov' $file | wc -l) lea=$(grep 'lea' $file | wc -l) sh=$(grep 'shr\|shl' $file | wc -l) cmp=$(grep 'cmp\|test' $file | wc -l) printf "%10s tot %3d; size %4d; rsp %d; push %d; pop %d; call %d; load %2d; store %2d; sh %3d; mov %3d; lea %3d; cmp %3d\n" \ $f $tot $size $rsp $push $pop $call $load $store $sh $mov $lea $cmp; done