Signed-off-by: Alan Maguire <alan.maguire@xxxxxxxxxx> --- btf_encoder.c | 13 +++++++++++-- btf_encoder.h | 2 +- lib/bpf | 2 +- pahole.c | 12 +++++++++++- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/btf_encoder.c b/btf_encoder.c index 65f6e71..d3d6c67 100644 --- a/btf_encoder.c +++ b/btf_encoder.c @@ -1625,17 +1625,26 @@ out: return err; } -struct btf_encoder *btf_encoder__new(struct cu *cu, const char *detached_filename, struct btf *base_btf, bool skip_encoding_vars, bool force, bool gen_floats, bool verbose) +struct btf_encoder *btf_encoder__new(struct cu *cu, const char *detached_filename, struct btf *base_btf, bool skip_encoding_vars, bool force, bool gen_floats, bool gen_meta, bool verbose) { struct btf_encoder *encoder = zalloc(sizeof(*encoder)); if (encoder) { + LIBBPF_OPTS(btf_new_opts, opts); + char description[128]; + + snprintf(description, sizeof(description), "generated by dwarves v%u.%u", + DWARVES_MAJOR_VERSION, DWARVES_MINOR_VERSION); + opts.base_btf = base_btf; + opts.add_meta = gen_meta; + opts.description = description; + encoder->raw_output = detached_filename != NULL; encoder->filename = strdup(encoder->raw_output ? detached_filename : cu->filename); if (encoder->filename == NULL) goto out_delete; - encoder->btf = btf__new_empty_split(base_btf); + encoder->btf = btf__new_empty_opts(&opts); if (encoder->btf == NULL) goto out_delete; diff --git a/btf_encoder.h b/btf_encoder.h index 34516bb..0c8ea1a 100644 --- a/btf_encoder.h +++ b/btf_encoder.h @@ -16,7 +16,7 @@ struct btf; struct cu; struct list_head; -struct btf_encoder *btf_encoder__new(struct cu *cu, const char *detached_filename, struct btf *base_btf, bool skip_encoding_vars, bool force, bool gen_floats, bool verbose); +struct btf_encoder *btf_encoder__new(struct cu *cu, const char *detached_filename, struct btf *base_btf, bool skip_encoding_vars, bool force, bool gen_floats, bool gen_meta, bool verbose); void btf_encoder__delete(struct btf_encoder *encoder); int btf_encoder__encode(struct btf_encoder *encoder); diff --git a/lib/bpf b/lib/bpf index 6597330..3f591a6 160000 --- a/lib/bpf +++ b/lib/bpf @@ -1 +1 @@ -Subproject commit 6597330c45d185381900037f0130712cd326ae59 +Subproject commit d40a48fbfa2a357a6245c59e7bb811f72b5fc94d diff --git a/pahole.c b/pahole.c index 6fc4ed6..78fa778 100644 --- a/pahole.c +++ b/pahole.c @@ -40,6 +40,7 @@ static bool first_obj_only; static bool skip_encoding_btf_vars; static bool btf_encode_force; static const char *base_btf_file; +static bool btf_gen_meta; static const char *prettify_input_filename; static FILE *prettify_input; @@ -1232,6 +1233,7 @@ ARGP_PROGRAM_VERSION_HOOK_DEF = dwarves_print_version; #define ARGP_skip_emitting_atomic_typedefs 338 #define ARGP_btf_gen_optimized 339 #define ARGP_skip_encoding_btf_inconsistent_proto 340 +#define ARGP_btf_gen_meta 341 static const struct argp_option pahole__options[] = { { @@ -1654,6 +1656,11 @@ static const struct argp_option pahole__options[] = { .key = ARGP_skip_encoding_btf_inconsistent_proto, .doc = "Skip functions that have multiple inconsistent function prototypes sharing the same name, or that use unexpected registers for parameter values." }, + { + .name = "btf_gen_meta", + .key = ARGP_btf_gen_meta, + .doc = "Generate BTF metadata including kinds available." + }, { .name = NULL, } @@ -1829,6 +1836,8 @@ static error_t pahole__options_parser(int key, char *arg, conf_load.btf_gen_optimized = true; break; case ARGP_skip_encoding_btf_inconsistent_proto: conf_load.skip_encoding_btf_inconsistent_proto = true; break; + case ARGP_btf_gen_meta: + btf_gen_meta = true; break; default: return ARGP_ERR_UNKNOWN; } @@ -3064,7 +3073,7 @@ static enum load_steal_kind pahole_stealer(struct cu *cu, * create it. */ btf_encoder = btf_encoder__new(cu, detached_btf_filename, conf_load->base_btf, skip_encoding_btf_vars, - btf_encode_force, btf_gen_floats, global_verbose); + btf_encode_force, btf_gen_floats, btf_gen_meta, global_verbose); if (btf_encoder && thr_data) { struct thread_data *thread = thr_data; @@ -3096,6 +3105,7 @@ static enum load_steal_kind pahole_stealer(struct cu *cu, skip_encoding_btf_vars, btf_encode_force, btf_gen_floats, + btf_gen_meta, global_verbose); thread->btf = btf_encoder__btf(thread->encoder); } -- 2.31.1