Skip to content

Commit 6e665da

Browse files
committed
pahole: Wait to find a DWARF CU with both the class and the type_enum
Otherwise this doesn't work: $ 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 --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==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 $ Because in this case 'struct perf_event_header' and 'struct perf_event_type' aren't both present in builtin-annotate.o, so wait for another .o with both. With that in place: $ 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 --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==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", }, $ And continues to work with BTF: ⬢[acme@toolbox pahole]$ 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 --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==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", }, ⬢[acme@toolbox pahole]$ Now to find some data structures in vmlinux to use in pretty printing something in vmlinux to try with both BTF and DWARF so that we test this functionality in 'btfdiff' and keep testing this codebase. Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
1 parent be63836 commit 6e665da

File tree

1 file changed

+3
-1
lines changed

1 file changed

+3
-1
lines changed

pahole.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3397,8 +3397,10 @@ static enum load_steal_kind pahole_stealer(struct cu *cu,
33973397
}
33983398
}
33993399

3400-
if (prototype->type_enum) {
3400+
if (prototype->type_enum && !prototype->type_enum_resolved) {
34013401
prototype->type_enum_resolved = type__find_type_enum(type, cu, prototype->type_enum) == 0;
3402+
if (!prototype->type_enum_resolved)
3403+
return ret;
34023404
}
34033405

34043406
if (prototype->filter) {

0 commit comments

Comments
 (0)