From: Ihor Solodrai <ihor.solodrai@pm.me>
To: dwarves@vger.kernel.org
Cc: bpf@vger.kernel.org, acme@kernel.org, alan.maguire@oracle.com,
eddyz87@gmail.com, andrii@kernel.org, mykolal@fb.com,
olsajiri@gmail.com
Subject: [PATCH dwarves v4 01/10] btf_encoder: simplify function encoding
Date: Tue, 07 Jan 2025 19:09:03 +0000 [thread overview]
Message-ID: <20250107190855.2312210-2-ihor.solodrai@pm.me> (raw)
In-Reply-To: <20250107190855.2312210-1-ihor.solodrai@pm.me>
From: Alan Maguire <alan.maguire@oracle.com>
Currently we have two modes of function encoding; one adds functions
based upon the first instance found and ignores inconsistent
representations. The second saves function representations and later
finds inconsistencies. The mode chosen is determined by
conf_load->skip_encoding_btf_inconsistent_proto.
The knock-on effect is that we need to support two modes in
btf_encoder__add_func(); one for each case. Simplify by using
the "save function" approach for both cases; only difference is
that we allow inconsistent representations if
skip_encoding_btf_inconsistent_proto is not set (it is set by default
for upstream kernels and has been for a while).
Signed-off-by: Alan Maguire <alan.maguire@oracle.com>
Signed-off-by: Ihor Solodrai <ihor.solodrai@pm.me>
Acked-by: Eduard Zingerman <eddyz87@gmail.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Link: https://lore.kernel.org/dwarves/20241128012341.4081072-2-ihor.solodrai@pm.me/
---
btf_encoder.c | 79 +++++++++++++++++----------------------------------
1 file changed, 26 insertions(+), 53 deletions(-)
diff --git a/btf_encoder.c b/btf_encoder.c
index fbc9509..2e51afd 100644
--- a/btf_encoder.c
+++ b/btf_encoder.c
@@ -88,7 +88,6 @@ struct btf_encoder_func_state {
struct elf_function {
const char *name;
char *alias;
- bool generated;
size_t prefixlen;
struct btf_encoder_func_state state;
};
@@ -120,6 +119,7 @@ struct btf_encoder {
force,
gen_floats,
skip_encoding_decl_tag,
+ skip_encoding_inconsistent_proto,
tag_kfuncs,
gen_distilled_base;
uint32_t array_index_id;
@@ -1165,18 +1165,18 @@ out:
return err;
}
-static int32_t btf_encoder__add_func(struct btf_encoder *encoder, struct function *fn,
+static int32_t btf_encoder__add_func(struct btf_encoder *encoder,
struct elf_function *func)
{
+ struct btf_encoder_func_state *state = &func->state;
int btf_fnproto_id, btf_fn_id, tag_type_id = 0;
int16_t component_idx = -1;
const char *name;
const char *value;
char tmp_value[KSYM_NAME_LEN];
+ uint16_t idx;
- assert(fn != NULL || func != NULL);
-
- btf_fnproto_id = btf_encoder__add_func_proto(encoder, fn ? &fn->proto : NULL, func);
+ btf_fnproto_id = btf_encoder__add_func_proto(encoder, NULL, func);
name = func->alias ?: func->name;
if (btf_fnproto_id >= 0)
btf_fn_id = btf_encoder__add_ref_type(encoder, BTF_KIND_FUNC, btf_fnproto_id,
@@ -1186,40 +1186,23 @@ static int32_t btf_encoder__add_func(struct btf_encoder *encoder, struct functio
name, btf_fnproto_id < 0 ? "proto" : "func");
return -1;
}
- if (!fn) {
- struct btf_encoder_func_state *state = &func->state;
- uint16_t idx;
-
- if (state->nr_annots == 0)
- return 0;
+ if (state->nr_annots == 0)
+ return 0;
- for (idx = 0; idx < state->nr_annots; idx++) {
- struct btf_encoder_func_annot *a = &state->annots[idx];
+ for (idx = 0; idx < state->nr_annots; idx++) {
+ struct btf_encoder_func_annot *a = &state->annots[idx];
- value = btf__str_by_offset(encoder->btf, a->value);
- /* adding BTF data may result in a mode of the
- * value string memory, so make a temporary copy.
- */
- strncpy(tmp_value, value, sizeof(tmp_value) - 1);
- component_idx = a->component_idx;
-
- tag_type_id = btf_encoder__add_decl_tag(encoder, tmp_value,
- btf_fn_id, component_idx);
- if (tag_type_id < 0)
- break;
- }
- } else {
- struct llvm_annotation *annot;
-
- list_for_each_entry(annot, &fn->annots, node) {
- value = annot->value;
- component_idx = annot->component_idx;
+ value = btf__str_by_offset(encoder->btf, a->value);
+ /* adding BTF data may result in a mode of the
+ * value string memory, so make a temporary copy.
+ */
+ strncpy(tmp_value, value, sizeof(tmp_value) - 1);
+ component_idx = a->component_idx;
- tag_type_id = btf_encoder__add_decl_tag(encoder, value, btf_fn_id,
- component_idx);
- if (tag_type_id < 0)
- break;
- }
+ tag_type_id = btf_encoder__add_decl_tag(encoder, tmp_value,
+ btf_fn_id, component_idx);
+ if (tag_type_id < 0)
+ break;
}
if (tag_type_id < 0) {
fprintf(stderr,
@@ -1277,8 +1260,9 @@ static int btf_encoder__add_saved_funcs(struct btf_encoder *encoder)
* just do not _use_ them. Only exclude functions with
* unexpected register use or multiple inconsistent prototypes.
*/
- if (!state->unexpected_reg && !state->inconsistent_proto) {
- if (btf_encoder__add_func(encoder, NULL, func))
+ if (!encoder->skip_encoding_inconsistent_proto ||
+ (!state->unexpected_reg && !state->inconsistent_proto)) {
+ if (btf_encoder__add_func(encoder, func))
return -1;
}
state->processed = 1;
@@ -2359,6 +2343,7 @@ struct btf_encoder *btf_encoder__new(struct cu *cu, const char *detached_filenam
encoder->force = conf_load->btf_encode_force;
encoder->gen_floats = conf_load->btf_gen_floats;
encoder->skip_encoding_decl_tag = conf_load->skip_encoding_btf_decl_tag;
+ encoder->skip_encoding_inconsistent_proto = conf_load->skip_encoding_btf_inconsistent_proto;
encoder->tag_kfuncs = conf_load->btf_decl_tag_kfuncs;
encoder->gen_distilled_base = conf_load->btf_gen_distilled_base;
encoder->verbose = verbose;
@@ -2564,7 +2549,6 @@ int btf_encoder__encode_cu(struct btf_encoder *encoder, struct cu *cu, struct co
cu__for_each_function(cu, core_id, fn) {
struct elf_function *func = NULL;
- bool save = false;
/*
* Skip functions that:
@@ -2586,15 +2570,8 @@ int btf_encoder__encode_cu(struct btf_encoder *encoder, struct cu *cu, struct co
/* prefer exact function name match... */
func = btf_encoder__find_function(encoder, name, 0);
- if (func) {
- if (func->generated)
- continue;
- if (conf_load->skip_encoding_btf_inconsistent_proto)
- save = true;
- else
- func->generated = true;
- } else if (encoder->functions.suffix_cnt &&
- conf_load->btf_gen_optimized) {
+ if (!func && encoder->functions.suffix_cnt &&
+ conf_load->btf_gen_optimized) {
/* falling back to name.isra.0 match if no exact
* match is found; only bother if we found any
* .suffix function names. The function
@@ -2605,7 +2582,6 @@ int btf_encoder__encode_cu(struct btf_encoder *encoder, struct cu *cu, struct co
func = btf_encoder__find_function(encoder, name,
strlen(name));
if (func) {
- save = true;
if (encoder->verbose)
printf("matched function '%s' with '%s'%s\n",
name, func->name,
@@ -2624,10 +2600,7 @@ int btf_encoder__encode_cu(struct btf_encoder *encoder, struct cu *cu, struct co
if (!func)
continue;
- if (save)
- err = btf_encoder__save_func(encoder, fn, func);
- else
- err = btf_encoder__add_func(encoder, fn, func);
+ err = btf_encoder__save_func(encoder, fn, func);
if (err)
goto out;
}
--
2.47.1
next prev parent reply other threads:[~2025-01-07 19:09 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-07 19:08 [PATCH dwarves v4 00/10] pahole: faster reproducible BTF encoding Ihor Solodrai
2025-01-07 19:09 ` Ihor Solodrai [this message]
2025-01-07 19:09 ` [PATCH dwarves v4 02/10] btf_encoder: free encoder->secinfo in btf_encoder__delete Ihor Solodrai
2025-01-09 16:54 ` Alan Maguire
2025-01-09 21:36 ` Arnaldo Carvalho de Melo
2025-01-07 19:09 ` [PATCH dwarves v4 03/10] btf_encoder: separate elf function, saved function representations Ihor Solodrai
2025-01-07 19:09 ` [PATCH dwarves v4 04/10] btf_encoder: introduce elf_functions struct type Ihor Solodrai
2025-01-07 19:09 ` [PATCH dwarves v4 05/10] btf_encoder: introduce elf_functions_list Ihor Solodrai
2025-01-07 19:09 ` [PATCH dwarves v4 06/10] btf_encoder: remove skip_encoding_inconsistent_proto Ihor Solodrai
2025-01-07 19:09 ` [PATCH dwarves v4 07/10] dwarf_loader: introduce cu->id Ihor Solodrai
2025-01-07 19:09 ` [PATCH dwarves v4] dwarf_loader: multithreading with a job/worker model Ihor Solodrai
2025-01-07 19:09 ` [PATCH dwarves v4 09/10] btf_encoder: clean up global encoders list Ihor Solodrai
2025-01-07 19:09 ` [PATCH dwarves v4] btf_encoder: switch func_states from a list to an array Ihor Solodrai
2025-01-07 20:35 ` [PATCH dwarves v4 00/10] pahole: faster reproducible BTF encoding Ihor Solodrai
2025-01-09 18:32 ` Arnaldo Carvalho de Melo
2025-01-09 18:38 ` Ihor Solodrai
2025-01-09 21:21 ` Arnaldo Carvalho de Melo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250107190855.2312210-2-ihor.solodrai@pm.me \
--to=ihor.solodrai@pm.me \
--cc=acme@kernel.org \
--cc=alan.maguire@oracle.com \
--cc=andrii@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=dwarves@vger.kernel.org \
--cc=eddyz87@gmail.com \
--cc=mykolal@fb.com \
--cc=olsajiri@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox