From patchwork Sat Dec 21 01:22:54 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ihor Solodrai X-Patchwork-Id: 13917572 Received: from mail-10629.protonmail.ch (mail-10629.protonmail.ch [79.135.106.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 135C2558BA for ; Sat, 21 Dec 2024 01:23:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=79.135.106.29 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734744183; cv=none; b=mtPBMVsEouHDj+Swywa/kHrqo/SSnoho/yXpXJZVojcValxN/Ma09BAwLEZmc54BFimcn4uvuc5aXCEUJVeRgHFjLyX9r60jxE3yuAoPrc/ILVYCfHTaiD7MP+2npG8goRj+9TiJPaQamiikqHlnPLYnnfSSzVfVk471nMhsUk8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734744183; c=relaxed/simple; bh=I3oPgmN4K9uxpqEkRMbd+WpJT0xZL+GZFruStITHhkw=; h=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=UHjuwvSpiltnT59QbEfmhxARqjeHQSgtqdZqjf6/Nrv9JLIWQObktb4HWDCcMafcFCsbfNN7ytvwUkUsyzOscSq2WpkPtGtnh8RRPQzgdpbNQp97RL+AJds4snH/WeoTqS6PV2dpz0+WgsVH6j7xwOoyR6gwdraSZyFkRVJ6k+k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=pm.me; spf=pass smtp.mailfrom=pm.me; dkim=pass (2048-bit key) header.d=pm.me header.i=@pm.me header.b=ZMgZ9Ki0; arc=none smtp.client-ip=79.135.106.29 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=pm.me Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pm.me Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=pm.me header.i=@pm.me header.b="ZMgZ9Ki0" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pm.me; s=protonmail3; t=1734744178; x=1735003378; bh=p44UIYEBYYbuvBXm30vj9U/QJpb+uK/8cHiO8HWX4fs=; h=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References: Feedback-ID:From:To:Cc:Date:Subject:Reply-To:Feedback-ID: Message-ID:BIMI-Selector:List-Unsubscribe:List-Unsubscribe-Post; b=ZMgZ9Ki04d1uZ3RTeG0tCsNj1uaCd0I2DPW8vg4UALUH7pQBbZU01vRs7rdM1W+nv 8m22rJ1MKpzpibQ9bKse93PhterWl1WAmcMudJuAJrT2wfcb5KZY2PBPaFKNioF0ES oAN0ZColU9CmQwv05nfOpJHKuBBMTCxuKu36xxeJgHyIGWbeo+mhr4V1ceNjnAbl3X ul9DAbxXwKpH5Qz9DOIEnHHykHl+KDfhAk/2d5YdDESLB8L+CFzscyreb1qE/do6Hj lW20EhAlHFnCeUP33AsoH453COu/5sacQAcqkBQq+YLq+WGlyJ/gC1644P72dtU+4M ozGlGpjXDt+Lw== Date: Sat, 21 Dec 2024 01:22:54 +0000 To: dwarves@vger.kernel.org From: Ihor Solodrai Cc: acme@kernel.org, alan.maguire@oracle.com, eddyz87@gmail.com, andrii@kernel.org, mykolal@fb.com, bpf@vger.kernel.org Subject: [PATCH dwarves v3 1/8] btf_encoder: simplify function encoding Message-ID: <20241221012245.243845-2-ihor.solodrai@pm.me> In-Reply-To: <20241221012245.243845-1-ihor.solodrai@pm.me> References: <20241221012245.243845-1-ihor.solodrai@pm.me> Feedback-ID: 27520582:user:proton X-Pm-Message-ID: 123b4ccd171f934311f1e9aabc31d5e737be48fa Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Alan Maguire 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 Signed-off-by: Ihor Solodrai Acked-by: Eduard Zingerman Acked-by: Jiri Olsa 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 3754884..0835848 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; @@ -2353,6 +2337,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; @@ -2558,7 +2543,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: @@ -2580,15 +2564,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 @@ -2599,7 +2576,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, @@ -2617,10 +2593,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; }