2 if [[ $# -le 1 ]]; then
3 echo "Usage: $0 <executable> [<addresses>] REFS..."
10 if [[ -e "$1" ]]; then
16 # readlink -f, but more portable:
17 dirname=$
(perl
-e 'use Cwd "abs_path";print abs_path(shift)' "$(dirname "$0")")
19 # http://stackoverflow.com/a/2358432/472927
22 pushd "$dirname" > /dev
/null
23 # if the user has some local changes, preserve them
24 nstashed
=$
(git stash list |
wc -l)
25 echo "==> Stashing any local modifications"
26 git stash
--keep-index > /dev
/null
28 # http://stackoverflow.com/q/24520791/472927
29 if [[ "$(git stash list | wc -l)" -ne "$nstashed" ]]; then
30 echo "==> Restoring stashed state"
31 git stash pop
> /dev
/null
34 # if the user has added stuff to the index, abort
35 if ! git diff-index
--quiet HEAD
--; then
36 echo "Refusing to overwrite outstanding git changes"
40 current
=$
(git symbolic-ref
--short HEAD
)
42 echo "==> Compiling $ref"
43 git checkout
-q "$ref"
44 commit
=$
(git rev-parse HEAD
)
45 fn
="target/release/addr2line-$commit"
46 if [[ ! -e "$fn" ]]; then
47 cargo build
--release --example addr2line
48 cp target
/release
/examples
/addr2line
"$fn"
50 if [[ "$ref" != "$commit" ]]; then
51 ln -sfn "addr2line-$commit" target
/release
/addr2line-
"$ref"
54 git checkout
-q "$current"
58 # get us some addresses to look up
59 if [[ -z "$addresses" ]]; then
60 echo "==> Looking for benchmarking addresses (this may take a while)"
61 addresses
=$
(mktemp tmp.XXXXXXXXXX
)
62 objdump
-C -x --disassemble -l "$target" \
67 echo " -> Addresses stored in $addresses; you should re-use it next time"
75 printf "%s\t%s\t" "$name" "$func"
76 if [[ "$cmd" =~ llvm-symbolizer
]]; then
77 /usr
/bin
/time -f '%e\t%M' "$cmd" $args -obj="$target" < "$addresses" 2>&1 >/dev
/null
79 /usr
/bin
/time -f '%e\t%M' "$cmd" $args -e "$target" < "$addresses" 2>&1 >/dev
/null
83 # run without functions
84 log1
=$
(mktemp tmp.XXXXXXXXXX
)
85 echo "==> Benchmarking"
86 run nofunc binutils addr2line
>> "$log1"
87 #run nofunc elfutils eu-addr2line >> "$log1"
88 run nofunc llvm-sym llvm-symbolizer
-functions=none
>> "$log1"
90 run nofunc
"$ref" "$dirname/target/release/addr2line-$ref" >> "$log1"
92 cat "$log1" |
column -t
95 log2
=$
(mktemp tmp.XXXXXXXXXX
)
96 echo "==> Benchmarking with -f"
97 run func binutils addr2line
"-f -i" >> "$log2"
98 #run func elfutils eu-addr2line "-f -i" >> "$log2"
99 run func llvm-sym llvm-symbolizer
"-functions=linkage -demangle=0" >> "$log2"
101 run func
"$ref" "$dirname/target/release/addr2line-$ref" "-f -i" >> "$log2"
103 cat "$log2" |
column -t
104 cat "$log2" >> "$log1"; rm "$log2"
107 Rscript
--no-readline --no-restore --no-save "$dirname/bench.plot.r" < "$log1"
109 echo "==> Cleaning up"