From patchwork Thu Nov 28 01:23:49 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ihor Solodrai X-Patchwork-Id: 13887512 Received: from mail-4322.protonmail.ch (mail-4322.protonmail.ch [185.70.43.22]) (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 E5D511DFE1 for ; Thu, 28 Nov 2024 01:24:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.70.43.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732757042; cv=none; b=pZFMwnK1Pzt/+5Bm/Y5PYwDM5A9fdyS0Xt7aSxkGJZInosGzhf82uv7KW7DtgF1gJQeSCrVm1Qzd0Hx8TFtbxM6UFHarPLnPCmn1IrHbszY7Car0DsrlvXgr5oMWsPe0wFOXsEgTmm0omvBAbdtHIA6sw0/30K9E4tu4wS+QUzE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732757042; c=relaxed/simple; bh=vn10ZC0X1OjevH4nhWNJDL+DrspV3cPZ/rPvHGS/gXc=; h=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=NemYRmixA7dZhL+PB4XFkkNMiYcc+kXkgQ8kwJlrK8UP8pTjD22J/rOc2GuOgrYIrxDjx4pkzYvF56yhc4TPNFdOUI7iMfpe3bnFKmNiv8WBIci2HU1bCYxFzasnKf2UZJLfkcu8jIzUCGst9vi9IlqcPjfHOVQmVXp/02rpQkk= 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=h9mVEZpu; arc=none smtp.client-ip=185.70.43.22 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="h9mVEZpu" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pm.me; s=protonmail3; t=1732757032; x=1733016232; bh=6ccyWirVAg8yd7jEH2f2yya9YlDlAHf2+jxVuYEQXeI=; 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=h9mVEZpuMt6N53j60yojuaxwtBM5rDZarfB3PDSwjFKAT6i5scVeqrTPIYmfZU+H3 5e2+iKgI43im6j91fSO7ZtBr12Q83PCwYjORU8dD0GmIWnub1F3OTU/3HFhdbXX4Wv WjTG+Ozc4VpFonHFQdfirMehlalh9Pe12tR2numzJ6KuEXHugiuZR8xqD9TTZORUgm 5IcB/fwwEzVbkBD7lmwXKzm+vFcJmtSXyXUW1TS4vkqq50H0T2w0hJZ6Zp0gNn+4gu X1UA/hRvHNgZZWWV5aALWavZL0+1hd+cJx3t5qDEE217xZ6V/Y7zxz0Kubmwk/Hvdk iLVWRzC0g3yLQ== Date: Thu, 28 Nov 2024 01:23:49 +0000 To: dwarves@vger.kernel.org, acme@kernel.org From: Ihor Solodrai Cc: bpf@vger.kernel.org, alan.maguire@oracle.com, eddyz87@gmail.com, andrii@kernel.org, mykolal@fb.com Subject: [RFC PATCH 1/9] btf_encoder: simplify function encoding Message-ID: <20241128012341.4081072-2-ihor.solodrai@pm.me> In-Reply-To: <20241128012341.4081072-1-ihor.solodrai@pm.me> References: <20241128012341.4081072-1-ihor.solodrai@pm.me> Feedback-ID: 27520582:user:proton X-Pm-Message-ID: 3dcc2cb6c0b2e6bd30a53ce9dc4f50391a0731ce Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-State: RFC 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 --- btf_encoder.c | 79 +++++++++++++++++---------------------------------- 1 file changed, 26 insertions(+), 53 deletions(-) diff --git a/btf_encoder.c b/btf_encoder.c index e1adddf..98e4d7d 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; @@ -2339,6 +2323,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; @@ -2544,7 +2529,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: @@ -2566,15 +2550,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 @@ -2585,7 +2562,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, @@ -2603,10 +2579,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; }