| #!/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 |