pahole: Improve error message when not resolving symbolic names in filters
To improve figuring out why this command line fails:
$ pahole -F dwarf -V ~/bin/perf --header=perf_file_header --seek_bytes '$header.data.offset' --size_bytes='$header.data.size' -C 'perf_event_header(sizeof,type,type_enum=perf_event_type,filter=type==PERF_RECORD_MMAP2)' --prettify perf.data
pahole: sizeof_operator for 'perf_event_header' is 'size'
pahole: type member for 'perf_event_header' is 'type'
pahole: type enum for 'perf_event_header' is 'perf_event_type'
pahole: filter for 'perf_event_header' is 'type==PERF_RECORD_MMAP2'
Symbolic right operand in 'type==PERF_RECORD_MMAP2' but no way to resolve it to a number (type_enum empty or hasn't found any so far) at CU 'builtin-annotate.c')
pahole: invalid filter 'type==PERF_RECORD_MMAP2' for 'perf_event_header'
pahole: type 'perf_event_header' not found or arguments not validated
$
In this case we don't have the 'enum perf_event_header' in
builtin-annotate.o, so we must defer trying to parse that
perf_event_header(sizeof,type,type_enum=perf_event_type,filter=type==PERF_RECORD_MMAP2)
class expression to when we find it.
When using BTF it all works as all types are in just one CU:
$ pahole -F btf -V ~/bin/perf --header=perf_file_header --seek_bytes '$header.data.offset' --size_bytes='$header.data.size' -C 'perf_event_header(sizeof,type,type_enum=perf_event_type,filter=type==PERF_RECORD_MMAP2)' --prettify perf.data
pahole: sizeof_operator for 'perf_event_header' is 'size'
pahole: type member for 'perf_event_header' is 'type'
pahole: type enum for 'perf_event_header' is 'perf_event_type'
pahole: filter for 'perf_event_header' is 'type==PERF_RECORD_MMAP2'
pahole: seek bytes evaluated from --seek_bytes=$header.data.offset is 0x3f0
pahole: size bytes evaluated from --size_bytes=$header.data.size is 0xd10
// type=perf_event_header, offset=0xc20, sizeof=8, real_sizeof=112
{
.header = {
.type = PERF_RECORD_MMAP2,
.misc = 2,
.size = 112,
},
.pid =
1533617,
.tid =
1533617,
.start =
94667542700032,
.len = 90112,
.pgoff = 16384,{
.maj = 0,
.min = 33,
.ino =
35914923,
.ino_generation = 26870,
},{
.build_id_size = 0,
.__reserved_1 = 0,
.__reserved_2 = 0,
.build_id = { 33, 0, 0, 0, -85, 4, 36, 2, 0, 0, 0, 0, -10, 104, 0, 0, 0, 0, 0, 0 },
},
.prot = 5,
.flags = 2,
.filename = "/usr/bin/ls",
},
// type=perf_event_header, offset=0xc90, sizeof=8, real_sizeof=128
{
.header = {
.type = PERF_RECORD_MMAP2,
.misc = 2,
.size = 128,
},
.pid =
1533617,
.tid =
1533617,
.start =
140033104936960,
.len = 159744,
.pgoff = 4096,{
.maj = 0,
.min = 33,
.ino =
35909039,
.ino_generation = 26870,
},{
.build_id_size = 0,
.__reserved_1 = 0,
.__reserved_2 = 0,
.build_id = { 33, 0, 0, 0, -81, -19, 35, 2, 0, 0, 0, 0, -10, 104, 0, 0, 0, 0, 0, 0 },
},
.prot = 5,
.flags = 2,
.filename = "/usr/lib64/ld-linux-x86-64.so.2",
},
<SNIP more PERF_RECORD_MMAP2 records>
$
$ pahole --contains_enumerator PERF_RECORD_MMAP2
enum perf_event_type {
PERF_RECORD_MMAP = 1,
PERF_RECORD_LOST = 2,
PERF_RECORD_COMM = 3,
PERF_RECORD_EXIT = 4,
PERF_RECORD_THROTTLE = 5,
PERF_RECORD_UNTHROTTLE = 6,
PERF_RECORD_FORK = 7,
PERF_RECORD_READ = 8,
PERF_RECORD_SAMPLE = 9,
PERF_RECORD_MMAP2 = 10,
PERF_RECORD_AUX = 11,
PERF_RECORD_ITRACE_START = 12,
PERF_RECORD_LOST_SAMPLES = 13,
PERF_RECORD_SWITCH = 14,
PERF_RECORD_SWITCH_CPU_WIDE = 15,
PERF_RECORD_NAMESPACES = 16,
PERF_RECORD_KSYMBOL = 17,
PERF_RECORD_BPF_EVENT = 18,
PERF_RECORD_CGROUP = 19,
PERF_RECORD_TEXT_POKE = 20,
PERF_RECORD_AUX_OUTPUT_HW_ID = 21,
PERF_RECORD_MAX = 22,
}
$
If we replace PERF_RECORD_MMAP2 with its numeric value, then it works
with DWARF as well.
$ pahole -F dwarf -V ~/bin/perf --header=perf_file_header --seek_bytes '$header.data.offset' --size_bytes='$header.data.size' -C 'perf_event_header(sizeof,type,type_enum=perf_event_type,filter=type==10)' --prettify perf.data --count 1
pahole: sizeof_operator for 'perf_event_header' is 'size'
pahole: type member for 'perf_event_header' is 'type'
pahole: type enum for 'perf_event_header' is 'perf_event_type'
pahole: filter for 'perf_event_header' is 'type==10'
pahole: seek bytes evaluated from --seek_bytes=$header.data.offset is 0x3f0
pahole: size bytes evaluated from --size_bytes=$header.data.size is 0xd10
// type=perf_event_header, offset=0xc20, sizeof=8, real_sizeof=112
{
.header = {
.type = PERF_RECORD_MMAP2,
.misc = 2,
.size = 112,
},
.pid =
1533617,
.tid =
1533617,
.start =
94667542700032,
.len = 90112,
.pgoff = 16384,{
.maj = 0,
.min = 33,
.ino =
35914923,
.ino_generation = 26870,
},{
.build_id_size = 0,
.__reserved_1 = 0,
.__reserved_2 = 0,
.build_id = { 33, 0, 0, 0, -85, 4, 36, 2, 0, 0, 0, 0, -10, 104, 0, 0, 0, 0, 0, 0 },
},
.prot = 5,
.flags = 2,
.filename = "/usr/bin/ls",
},
$
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>