[PATCH v3 dwarves 1/2] pahole: Add "layout" BTF encoding feature
Alan Maguire <[email protected]>
| Newsgroups | org.kernel.vger.dwarves,org.kernel.vger.bpf |
|---|---|
| Message-ID | <[email protected]> |
Add support to pahole to add BTF kind layout info which describes the BTF kinds supported at encoding time. Since an older libbpf can be used to build pahole add declaration for btf_new_opts and add a feature test to check for the btf__new_empty_opts() function. Also skip adding layout information for split BTF; it is redundant as the base BTF will have the same information, and would just waste space. Signed-off-by: Alan Maguire <[email protected]> --- btf_encoder.c | 21 ++++++++++++++++++++- dwarves.h | 4 ++++ pahole.c | 6 ++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/btf_encoder.c b/btf_encoder.c index aa7cd1c..99298e3 100644 --- a/btf_encoder.c +++ b/btf_encoder.c @@ -2679,6 +2679,16 @@ out: return err; } +/* Needed for older libbpf to support weak declaration of btf__new_empty_opts() */ +#ifndef btf_new_opts__last_field +struct btf_new_opts { + size_t sz; + struct btf *base_btf; + bool add_layout; + size_t:0; +}; +#endif + struct btf_encoder *btf_encoder__new(struct cu *cu, const char *detached_filename, struct btf *base_btf, bool verbose, struct conf_load *conf_load) { struct btf_encoder *encoder = zalloc(sizeof(*encoder)); @@ -2692,7 +2702,16 @@ struct btf_encoder *btf_encoder__new(struct cu *cu, const char *detached_filenam if (encoder->source_filename == NULL || encoder->filename == NULL) goto out_delete; - encoder->btf = btf__new_empty_split(base_btf); + if (btf__new_empty_opts) { + LIBBPF_OPTS(btf_new_opts, opts); + + /* only add layout to base BTF; no need to repeat for split. */ + opts.add_layout = !base_btf && conf_load->btf_gen_layout; + opts.base_btf = base_btf; + encoder->btf = btf__new_empty_opts(&opts); + } else { + encoder->btf = btf__new_empty_split(base_btf); + } if (encoder->btf == NULL) goto out_delete; diff --git a/dwarves.h b/dwarves.h index d7c6474..5ec16e7 100644 --- a/dwarves.h +++ b/dwarves.h @@ -46,6 +46,8 @@ enum load_steal_kind { LSK__ABORT, }; +struct btf_new_opts; + /* * Weak declarations of libbpf APIs that are version-dependent */ @@ -55,6 +57,7 @@ __weak extern int btf__add_enum64(struct btf *btf, const char *name, __u32 byte_ __weak extern int btf__add_enum64_value(struct btf *btf, const char *name, __u64 value); __weak extern int btf__add_type_attr(struct btf *btf, const char *value, int ref_type_id); __weak extern int btf__distill_base(const struct btf *src_btf, struct btf **new_base_btf, struct btf **new_split_btf); +__weak extern struct btf *btf__new_empty_opts(struct btf_new_opts *opts); /* * BTF combines all the types into one big CU using btf_dedup(), so for something @@ -95,6 +98,7 @@ struct conf_load { bool skip_encoding_btf_inconsistent_proto; bool skip_encoding_btf_vars; bool encode_btf_global_vars; + bool btf_gen_layout; bool btf_gen_floats; bool btf_encode_force; bool reproducible_build; diff --git a/pahole.c b/pahole.c index 02a0d19..7eafc88 100644 --- a/pahole.c +++ b/pahole.c @@ -1209,6 +1209,11 @@ static bool attributes_check(void) return btf__add_type_attr != NULL; } +static bool layout_check(void) +{ + return btf__new_empty_opts != NULL; +} + struct btf_feature { const char *name; const char *option_alias; @@ -1235,6 +1240,7 @@ struct btf_feature { BTF_NON_DEFAULT_FEATURE_CHECK(attributes, btf_attributes, false, attributes_check), BTF_NON_DEFAULT_FEATURE(true_signature, true_signature, false), + BTF_NON_DEFAULT_FEATURE_CHECK(layout, btf_gen_layout, false, layout_check) }; #define BTF_MAX_FEATURE_STR 1024 -- 2.39.3