xref: /aosp_15_r20/external/mesa3d/src/gallium/tools/addr2line.sh (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker#!/usr/bin/env bash
2*61046927SAndroid Build Coastguard Worker# This script processes symbols output by Gallium using glibc to human-readable function names
3*61046927SAndroid Build Coastguard Worker
4*61046927SAndroid Build Coastguard Workerlastbin=
5*61046927SAndroid Build Coastguard Workeri=-1
6*61046927SAndroid Build Coastguard Workerdir="$(mktemp -d)"
7*61046927SAndroid Build Coastguard Workerinput="$1"
8*61046927SAndroid Build Coastguard Worker
9*61046927SAndroid Build Coastguard Worker# Gather all unique addresses for each binary
10*61046927SAndroid Build Coastguard Workersed -nre 's|([^ ]*/[^ ]*)\(\+0x([^)]*).*|\1 \2|p' "$input"|sort|uniq|while read bin addr; do
11*61046927SAndroid Build Coastguard Worker	if test "$lastbin" != "$bin"; then
12*61046927SAndroid Build Coastguard Worker		((++i))
13*61046927SAndroid Build Coastguard Worker		lastbin="$bin"
14*61046927SAndroid Build Coastguard Worker		echo "$bin" > "$dir/$i.addrs.bin"
15*61046927SAndroid Build Coastguard Worker	fi
16*61046927SAndroid Build Coastguard Worker	echo "$addr" >> "$dir/$i.addrs"
17*61046927SAndroid Build Coastguard Workerdone
18*61046927SAndroid Build Coastguard Worker
19*61046927SAndroid Build Coastguard Worker# Construct a sed script to convert hex address to human readable form, and apply it
20*61046927SAndroid Build Coastguard Workerfor i in "$dir"/*.addrs; do
21*61046927SAndroid Build Coastguard Worker	bin="$(<"$i.bin")"
22*61046927SAndroid Build Coastguard Worker	addr2line -p -e "$bin" -a -f < "$i"|sed -nre 's@^0x0*([^:]*): ([^?]*)$@s|'"$bin"'(+0x\1)|\2|g@gp'
23*61046927SAndroid Build Coastguard Worker	rm -f "$i" "$i.bin"
24*61046927SAndroid Build Coastguard Workerdone|sed -f - "$input"
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard Workerrmdir "$dir"
27