Encode kind layout at time of BTF encoding via --btf_gen_kind_layout and set CRC if --btf_gen_crc is set. Signed-off-by: Alan Maguire <alan.maguire@xxxxxxxxxx> --- btf_encoder.c | 10 ++++++++-- btf_encoder.h | 2 +- dwarves.h | 2 ++ lib/bpf | 2 +- pahole.c | 19 ++++++++++++++++++- 5 files changed, 30 insertions(+), 5 deletions(-) diff --git a/btf_encoder.c b/btf_encoder.c index 65f6e71..19cf003 100644 --- a/btf_encoder.c +++ b/btf_encoder.c @@ -1625,17 +1625,23 @@ 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, struct conf_load *conf_load, bool verbose) { struct btf_encoder *encoder = zalloc(sizeof(*encoder)); if (encoder) { + LIBBPF_OPTS(btf_new_opts, opts); + + opts.base_btf = base_btf; + opts.add_kind_layout = conf_load->btf_gen_kind_layout; + opts.add_crc = conf_load->btf_gen_crc; + 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..fbbf564 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, struct conf_load *conf_load, bool verbose); void btf_encoder__delete(struct btf_encoder *encoder); int btf_encoder__encode(struct btf_encoder *encoder); diff --git a/dwarves.h b/dwarves.h index eb1a6df..0360807 100644 --- a/dwarves.h +++ b/dwarves.h @@ -68,6 +68,8 @@ struct conf_load { bool skip_encoding_btf_enum64; bool btf_gen_optimized; bool skip_encoding_btf_inconsistent_proto; + bool btf_gen_kind_layout; + bool btf_gen_crc; uint8_t hashtable_bits; uint8_t max_hashtable_bits; uint16_t kabi_prefix_len; 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 3f591a66103d49b311956618d440a84cf4d30715 diff --git a/pahole.c b/pahole.c index 6fc4ed6..e7268a3 100644 --- a/pahole.c +++ b/pahole.c @@ -1232,6 +1232,8 @@ 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_kind_layout 341 +#define ARGP_btf_gen_crc 342 static const struct argp_option pahole__options[] = { { @@ -1654,6 +1656,16 @@ 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_kind_layout", + .key = ARGP_btf_gen_kind_layout, + .doc = "Generate BTF kind layout information about kinds available." + }, + { + .name = "btf_gen_crc", + .key = ARGP_btf_gen_crc, + .doc = "Generate CRC in BTF header." + }, { .name = NULL, } @@ -1829,6 +1841,10 @@ 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_kind_layout: + conf_load.btf_gen_kind_layout = true; break; + case ARGP_btf_gen_crc: + conf_load.btf_gen_crc = true; break; default: return ARGP_ERR_UNKNOWN; } @@ -3064,7 +3080,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, conf_load, global_verbose); if (btf_encoder && thr_data) { struct thread_data *thread = thr_data; @@ -3096,6 +3112,7 @@ static enum load_steal_kind pahole_stealer(struct cu *cu, skip_encoding_btf_vars, btf_encode_force, btf_gen_floats, + conf_load, global_verbose); thread->btf = btf_encoder__btf(thread->encoder); } -- 2.31.1