[PATCH v1] pahole: Add --skip_missing option

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Douglas Raillard <douglas.raillard@xxxxxxx>

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.

Signed-off-by: Douglas Raillard <douglas.raillard@xxxxxxx>
---
 dwarves.h |  2 ++
 pahole.c  | 17 +++++++++++++++--
 2 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/dwarves.h b/dwarves.h
index 30d33fa..6be6094 100644
--- a/dwarves.h
+++ b/dwarves.h
@@ -43,6 +43,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,
@@ -59,6 +60,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 80271b5..68e3c8a 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[] = {
 	{
@@ -1500,6 +1501,11 @@ static const struct argp_option pahole__options[] = {
 		.key  = ARGP_skip_encoding_btf_tag,
 		.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");
-- 
2.25.1




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux