#!/bin/bash # test addr2line inline unwinding # SPDX-License-Identifier: GPL-2.0 set -e err=0 test_dir=$(mktemp -d /tmp/perf-test-inline-addr2line.XXXXXXXXXX) perf_data="${test_dir}/perf.data" perf_script_txt="${test_dir}/perf_script.txt" cleanup() { rm -rf "${test_dir}" trap - EXIT TERM INT } trap_cleanup() { echo "Unexpected signal in ${FUNCNAME[1]}" cleanup exit 1 } trap trap_cleanup EXIT TERM INT test_fp() { echo "Inline unwinding fp verification test" # Record data. Currently only dwarf callchains support inlined functions. perf record --call-graph fp -e task-clock:u -o "${perf_data}" -- perf test -w inlineloop 1 # Check output with inline (default) and srcline perf script -i "${perf_data}" --fields +srcline > "${perf_script_txt}" # Expect the leaf and middle functions to occur on lines in the 20s, with # the non-inlined parent function on a line in the 30s. if grep -q "inlineloop.c:2. (inlined)" "${perf_script_txt}" && grep -q "inlineloop.c:3.$" "${perf_script_txt}" then echo "Inline unwinding fp verification test [Success]" else echo "Inline unwinding fp verification test [Failed missing inlined functions]" err=1 fi } test_dwarf() { echo "Inline unwinding dwarf verification test" # Record data. Currently only dwarf callchains support inlined functions. perf record --call-graph dwarf -e task-clock:u -o "${perf_data}" -- perf test -w inlineloop 1 # Check output with inline (default) and srcline perf script -i "${perf_data}" --fields +srcline > "${perf_script_txt}" # Expect the leaf and middle functions to occur on lines in the 20s, with # the non-inlined parent function on a line in the 30s. if grep -q "inlineloop.c:2. (inlined)" "${perf_script_txt}" && grep -q "inlineloop.c:3.$" "${perf_script_txt}" then echo "Inline unwinding dwarf verification test [Success]" else echo "Inline unwinding dwarf verification test [Failed missing inlined functions]" err=1 fi } test_lbr() { echo "Inline unwinding LBR verification test" if [ ! -f /sys/bus/event_source/devices/cpu/caps/branches ] && [ ! -f /sys/bus/event_source/devices/cpu_core/caps/branches ] then echo "Skip: only x86 CPUs support LBR" return fi # Record data. Currently only dwarf callchains support inlined functions. perf record --call-graph lbr -e cycles:u -o "${perf_data}" -- perf test -w inlineloop 1 # Check output with inline (default) and srcline perf script -i "${perf_data}" --fields +srcline > "${perf_script_txt}" # Expect the leaf and middle functions to occur on lines in the 20s, with # the non-inlined parent function on a line in the 30s. if grep -q "inlineloop.c:2. (inlined)" "${perf_script_txt}" && grep -q "inlineloop.c:3.$" "${perf_script_txt}" then echo "Inline unwinding lbr verification test [Success]" else echo "Inline unwinding lbr verification test [Failed missing inlined functions]" err=1 fi } test_fp test_dwarf test_lbr cleanup exit $err