aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas Raillard <douglas.raillard@arm.com>2021-10-19 11:42:00 +0100
committerArnaldo Carvalho de Melo <acme@redhat.com>2021-10-26 11:29:55 -0300
commit5282feee6d4d3a88da64f91de282c89b9e4f9673 (patch)
treebb55764e561844d6e7d9fddc37f9c2afcf3e872c
parent6931e393f8f6d81fc88146d8a57339e2a0a2f7ee (diff)
downloadpahole-5282feee6d4d3a88da64f91de282c89b9e4f9673.tar.gz
pahole: Add --skip_missing option
Add a --skip_missing option that allows pahole to keep going in case one of the type passed to -C (e.g. via a file) does not exist. This is useful for intropsection software such as debugging kernel modules that can handle various kernel configurations and versions for which some recently added types are missing. The consumer of the header becomes responsible of gating the uses of the type with #ifdef CONFIG_XXX, rather than pahole bailing out on the first unknown type. Committer testing: Before: $ pahole tcp_splice_state,xxfrm_policy_queue,list_head tcp.o struct tcp_splice_state { struct pipe_inode_info * pipe; /* 0 8 */ size_t len; /* 8 8 */ unsigned int flags; /* 16 4 */ /* size: 24, cachelines: 1, members: 3 */ /* padding: 4 */ /* last cacheline: 24 bytes */ }; pahole: type 'xxfrm_policy_queue' not found $ After: $ pahole --help |& grep skip --skip=COUNT Skip COUNT input records --skip_encoding_btf_tag Do not encode TAGs in BTF. --skip_encoding_btf_vars Do not encode VARs in BTF. --skip_missing skip missing types passed to -C rather than stop $ pahole --skip_missing tcp_splice_state,xxfrm_policy_queue,list_head tcp.o struct tcp_splice_state { struct pipe_inode_info * pipe; /* 0 8 */ size_t len; /* 8 8 */ unsigned int flags; /* 16 4 */ /* size: 24, cachelines: 1, members: 3 */ /* padding: 4 */ /* last cacheline: 24 bytes */ }; struct list_head { struct list_head * next; /* 0 8 */ struct list_head * prev; /* 8 8 */ /* size: 16, cachelines: 1, members: 2 */ /* last cacheline: 16 bytes */ }; pahole: type 'xxfrm_policy_queue' not found $ Signed-off-by: Douglas Raillard <douglas.raillard@arm.com> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: dwarves@vger.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r--dwarves.h2
-rw-r--r--pahole.c17
2 files changed, 17 insertions, 2 deletions
diff --git a/dwarves.h b/dwarves.h
index 9cb8d43b..a43e4326 100644
--- a/dwarves.h
+++ b/dwarves.h
@@ -44,6 +44,7 @@ struct conf_fprintf;
* @get_addr_info - wheter to load DW_AT_location and other addr info
* @nr_jobs - -j argument, number of threads to use
* @ptr_table_stats - print developer oriented ptr_table statistics.
+ * @skip_missing - skip missing types rather than bailing out.
*/
struct conf_load {
enum load_steal_kind (*steal)(struct cu *cu,
@@ -61,6 +62,7 @@ struct conf_load {
bool ignore_labels;
bool ptr_table_stats;
bool skip_encoding_btf_tag;
+ bool skip_missing;
uint8_t hashtable_bits;
uint8_t max_hashtable_bits;
uint16_t kabi_prefix_len;
diff --git a/pahole.c b/pahole.c
index 80271b5e..68e3c8ab 100644
--- a/pahole.c
+++ b/pahole.c
@@ -1125,6 +1125,7 @@ ARGP_PROGRAM_VERSION_HOOK_DEF = dwarves_print_version;
#define ARGP_hashbits 329
#define ARGP_devel_stats 330
#define ARGP_skip_encoding_btf_tag 331
+#define ARGP_skip_missing 332
static const struct argp_option pahole__options[] = {
{
@@ -1501,6 +1502,11 @@ static const struct argp_option pahole__options[] = {
.doc = "Do not encode TAGs in BTF."
},
{
+ .name = "skip_missing",
+ .key = ARGP_skip_missing,
+ .doc = "skip missing types passed to -C rather than stop",
+ },
+ {
.name = NULL,
}
};
@@ -1650,6 +1656,8 @@ static error_t pahole__options_parser(int key, char *arg,
conf_load.ptr_table_stats = true; break;
case ARGP_skip_encoding_btf_tag:
conf_load.skip_encoding_btf_tag = true; break;
+ case ARGP_skip_missing:
+ conf_load.skip_missing = true; break;
default:
return ARGP_ERR_UNKNOWN;
}
@@ -2879,8 +2887,13 @@ out_btf:
static type_id_t class_id;
struct tag *class = cu__find_type_by_name(cu, prototype->name, include_decls, &class_id);
- if (class == NULL)
- return ret; // couldn't find that class name in this CU, continue to the next one.
+ // couldn't find that class name in this CU, continue to the next one.
+ if (class == NULL) {
+ if (conf_load->skip_missing)
+ continue;
+ else
+ return ret;
+ }
if (prototype->nr_args != 0 && !tag__is_struct(class)) {
fprintf(stderr, "pahole: attributes are only supported with 'class' and 'struct' types\n");