--btf_features is used to specify the list of requested features for BTF encoding. However, it is not strict in rejecting requests with unknown features; this allows us to use the same parameters regardless of pahole version. --btf_features_strict carries out the same encoding with the same feature set, but will fail if an unrecognized feature is specified. So pahole -J --btf_features=enum64,foo will succeed, while pahole -J --btf_features_strict=enum64,foo will not. Suggested-by: Andrii Nakryiko <andrii@xxxxxxxxxx> Signed-off-by: Alan Maguire <alan.maguire@xxxxxxxxxx> --- man-pages/pahole.1 | 4 ++++ pahole.c | 20 +++++++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/man-pages/pahole.1 b/man-pages/pahole.1 index 6148915..ea9045c 100644 --- a/man-pages/pahole.1 +++ b/man-pages/pahole.1 @@ -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. diff --git a/pahole.c b/pahole.c index 816525a..e2a2440 100644 --- a/pahole.c +++ b/pahole.c @@ -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. @@ -1288,7 +1289,7 @@ bool set_btf_features_defaults; * 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 f[BTF_MAX_FEATURE_STR]; @@ -1325,6 +1326,11 @@ static void parse_btf_features(const char *features) break; } } + if (strict && !match) { + fprintf(stderr, "Feature in '%s' is not supported. 'pahole --supported_btf_features' shows the list of features supported.\n", + features); + exit(EXIT_FAILURE); + } } /* switch "default-off" features on, and "default-on" features * off; i.e. negate the default value. @@ -1779,6 +1785,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, } @@ -1924,7 +1936,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: @@ -1955,9 +1967,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(); exit(0); + case ARGP_btf_features_strict: + parse_btf_features(arg, true); break; default: return ARGP_ERR_UNKNOWN; } -- 2.31.1