@@ -297,6 +297,10 @@ Encode BTF using the specified feature list, or specify 'all' for all features s
So for example, specifying \-\-btf_encode=var,enum64 will result in a BTF encoding that (as well as encoding basic BTF information) will contain variables and enum64 values.
+.TP
+.B \-\-btf_features_strict
+Identical to \-\-btf_features above, but pahole will exit if it encounters an unrecognized feature.
+
.TP
.B \-\-supported_btf_features
Show set of BTF features supported by \-\-btf_features option and exit. Useful for checking which features are supported since \-\-btf_features will not emit an error if an unrecognized feature is specified.
@@ -1231,6 +1231,7 @@ ARGP_PROGRAM_VERSION_HOOK_DEF = dwarves_print_version;
#define ARGP_skip_encoding_btf_inconsistent_proto 340
#define ARGP_btf_features 341
#define ARGP_supported_btf_features 342
+#define ARGP_btf_features_strict 343
/* --btf_features=feature1[,feature2,..] allows us to specify
* a list of requested BTF features or "all" to enable all features.
@@ -1335,7 +1336,7 @@ static void show_supported_btf_features(FILE *output)
* Explicitly ignores unrecognized features to allow future specification
* of new opt-in features.
*/
-static void parse_btf_features(const char *features)
+static void parse_btf_features(const char *features, bool strict)
{
char *feature_list[BTF_MAX_FEATURES] = {};
char *saveptr = NULL, *s, *t;
@@ -1361,6 +1362,12 @@ static void parse_btf_features(const char *features)
struct btf_feature *feature = find_btf_feature(feature_list[i]);
if (!feature) {
+ if (strict) {
+ fprintf(stderr, "Feature '%s' in '%s' is not supported. Supported BTF features are:\n",
+ feature_list[i], features);
+ show_supported_btf_features(stderr);
+ exit(EXIT_FAILURE);
+ }
if (global_verbose)
fprintf(stderr, "Ignoring unsupported feature '%s'\n",
feature_list[i]);
@@ -1802,6 +1809,12 @@ static const struct argp_option pahole__options[] = {
.key = ARGP_supported_btf_features,
.doc = "Show list of btf_features supported by pahole and exit."
},
+ {
+ .name = "btf_features_strict",
+ .key = ARGP_btf_features_strict,
+ .arg = "FEATURE_LIST_STRICT",
+ .doc = "Specify supported BTF features in FEATURE_LIST or 'all' for all supported features. Unlike --btf_features, unrecognized features will trigger an error."
+ },
{
.name = NULL,
}
@@ -1947,7 +1960,7 @@ static error_t pahole__options_parser(int key, char *arg,
case ARGP_btf_gen_floats:
conf_load.btf_gen_floats = true; break;
case ARGP_btf_gen_all:
- parse_btf_features("all"); break;
+ parse_btf_features("all", false); break;
case ARGP_with_flexible_array:
show_with_flexible_array = true; break;
case ARGP_prettify_input_filename:
@@ -1978,9 +1991,11 @@ static error_t pahole__options_parser(int key, char *arg,
case ARGP_skip_encoding_btf_inconsistent_proto:
conf_load.skip_encoding_btf_inconsistent_proto = true; break;
case ARGP_btf_features:
- parse_btf_features(arg); break;
+ parse_btf_features(arg, false); break;
case ARGP_supported_btf_features:
show_supported_btf_features(stdout); exit(0);
+ case ARGP_btf_features_strict:
+ parse_btf_features(arg, true); break;
default:
return ARGP_ERR_UNKNOWN;
}