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