@@ -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;
@@ -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);
@@ -1 +1 @@
-Subproject commit 6597330c45d185381900037f0130712cd326ae59
+Subproject commit d40a48fbfa2a357a6245c59e7bb811f72b5fc94d
@@ -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);
}
Signed-off-by: Alan Maguire <alan.maguire@oracle.com> --- btf_encoder.c | 13 +++++++++++-- btf_encoder.h | 2 +- lib/bpf | 2 +- pahole.c | 12 +++++++++++- 4 files changed, 24 insertions(+), 5 deletions(-)