162306a36Sopenharmony_ci#!/bin/bash
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
362306a36Sopenharmony_ci#
462306a36Sopenharmony_ci# Disassemble a single function.
562306a36Sopenharmony_ci#
662306a36Sopenharmony_ci# usage: objdump-func <file> <func> [<func> ...]
762306a36Sopenharmony_ci
862306a36Sopenharmony_ciset -o errexit
962306a36Sopenharmony_ciset -o nounset
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ciOBJDUMP="${CROSS_COMPILE:-}objdump"
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cicommand -v gawk >/dev/null 2>&1 || die "gawk isn't installed"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ciusage() {
1662306a36Sopenharmony_ci	echo "usage: objdump-func <file> <func> [<func> ...]" >&2
1762306a36Sopenharmony_ci	exit 1
1862306a36Sopenharmony_ci}
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci[[ $# -lt 2 ]] && usage
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ciOBJ=$1; shift
2362306a36Sopenharmony_ciFUNCS=("$@")
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci${OBJDUMP} -wdr $OBJ | gawk -M -v _funcs="${FUNCS[*]}" '
2662306a36Sopenharmony_ci	BEGIN { split(_funcs, funcs); }
2762306a36Sopenharmony_ci	/^$/ { func_match=0; }
2862306a36Sopenharmony_ci	/<.*>:/ {
2962306a36Sopenharmony_ci		f = gensub(/.*<(.*)>:/, "\\1", 1);
3062306a36Sopenharmony_ci		for (i in funcs) {
3162306a36Sopenharmony_ci			# match compiler-added suffixes like ".cold", etc
3262306a36Sopenharmony_ci			if (f ~ "^" funcs[i] "(\\..*)?") {
3362306a36Sopenharmony_ci				func_match = 1;
3462306a36Sopenharmony_ci				base = strtonum("0x" $1);
3562306a36Sopenharmony_ci				break;
3662306a36Sopenharmony_ci			}
3762306a36Sopenharmony_ci		}
3862306a36Sopenharmony_ci	}
3962306a36Sopenharmony_ci	{
4062306a36Sopenharmony_ci		if (func_match) {
4162306a36Sopenharmony_ci			addr = strtonum("0x" $1);
4262306a36Sopenharmony_ci			printf("%04x ", addr - base);
4362306a36Sopenharmony_ci			print;
4462306a36Sopenharmony_ci		}
4562306a36Sopenharmony_ci	}'
46