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