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