From: Yonghong Song <yonghong.song@linux.dev>
To: Alan Maguire <alan.maguire@oracle.com>,
Arnaldo Carvalho de Melo <arnaldo.melo@gmail.com>,
dwarves@vger.kernel.org
Cc: Alexei Starovoitov <ast@kernel.org>,
Andrii Nakryiko <andrii@kernel.org>,
bpf@vger.kernel.org, kernel-team@fb.com
Subject: [PATCH dwarves v2 8/9] btf_encoder: Handle optimized parameter properly
Date: Mon, 9 Mar 2026 08:32:56 -0700 [thread overview]
Message-ID: <20260309153256.1921729-1-yonghong.song@linux.dev> (raw)
In-Reply-To: <20260309153215.1917033-1-yonghong.song@linux.dev>
Ensure to skip optimized parameter so btf can generate
proper true signatures.
In the first patch of the patch set, with DW_CC_nocall filtering, 875 functions
have signature changed. With a series of improvement, eventually only 17 functions
remain and unfortunately these functions cannot be converted to true signatures
due to locations. For example,
0x0242f1f7: DW_TAG_subprogram
DW_AT_name ("memblock_find_in_range")
DW_AT_calling_convention (DW_CC_nocall)
DW_AT_type (0x0242decc "phys_addr_t")
...
0x0242f22e: DW_TAG_formal_parameter
DW_AT_location (indexed (0x14a) loclist = 0x005595bc:
[0xffffffff87a000f9, 0xffffffff87a00178): DW_OP_reg5 RDI
[0xffffffff87a00178, 0xffffffff87a001be): DW_OP_reg14 R14
[0xffffffff87a001be, 0xffffffff87a001c7): DW_OP_entry_value(DW_OP_reg5 RDI), DW_OP_stack_value
[0xffffffff87a001c7, 0xffffffff87a00214): DW_OP_reg14 R14)
DW_AT_name ("start")
DW_AT_type (0x0242decc "phys_addr_t")
...
0x0242f239: DW_TAG_formal_parameter
DW_AT_location (indexed (0x14b) loclist = 0x005595e6:
[0xffffffff87a000f9, 0xffffffff87a00175): DW_OP_reg4 RSI
[0xffffffff87a00175, 0xffffffff87a001b8): DW_OP_reg3 RBX
[0xffffffff87a001b8, 0xffffffff87a001c7): DW_OP_entry_value(DW_OP_reg4 RSI), DW_OP_stack_value
[0xffffffff87a001c7, 0xffffffff87a00214): DW_OP_reg3 RBX)
DW_AT_name ("end")
DW_AT_type (0x0242decc "phys_addr_t")
...
0x0242f245: DW_TAG_formal_parameter
DW_AT_location (indexed (0x14c) loclist = 0x00559610:
[0xffffffff87a001e3, 0xffffffff87a001ef): DW_OP_breg4 RSI+0)
DW_AT_name ("size")
DW_AT_type (0x0242decc "phys_addr_t")
...
0x0242f250: DW_TAG_formal_parameter
DW_AT_const_value (4096)
DW_AT_name ("align")
DW_AT_type (0x0242decc "phys_addr_t")
...
The third parameter 'size' is not from RDX. Hence, true signature is not possible for this function.
I also did some experiments on arm64. The number of signature-changed funcitons
is 863 and finally there are 79 functions cannot be converted to true signatures.
Through dwarf comparison of x86_64 vs. arm64, llvm arm64 backend looks like having
more relaxation to compute parameter values for those signature-changed functions.
Signed-off-by: Yonghong Song <yonghong.song@linux.dev>
---
btf_encoder.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/btf_encoder.c b/btf_encoder.c
index aa7cd1c..0cd4124 100644
--- a/btf_encoder.c
+++ b/btf_encoder.c
@@ -1257,15 +1257,21 @@ static int32_t btf_encoder__save_func(struct btf_encoder *encoder, struct functi
struct btf *btf = encoder->btf;
struct llvm_annotation *annot;
struct parameter *param;
- uint8_t param_idx = 0;
+ uint8_t param_idx = 0, skip_idx = 0;
int str_off, err = 0;
if (!state)
return -ENOMEM;
+ if (encoder->cu->producer_clang) {
+ ftype__for_each_parameter(ftype, param) {
+ if (param->optimized) skip_idx++;
+ }
+ }
+
state->addr = function__addr(fn);
state->elf = func;
- state->nr_parms = ftype->nr_parms + (ftype->unspec_parms ? 1 : 0);
+ state->nr_parms = ftype->nr_parms - skip_idx + (ftype->unspec_parms ? 1 : 0);
state->ret_type_id = ftype->tag.type == 0 ? 0 : encoder->type_id_off + ftype->tag.type;
if (state->nr_parms > 0) {
state->parms = zalloc(state->nr_parms * sizeof(*state->parms));
@@ -1303,6 +1309,9 @@ static int32_t btf_encoder__save_func(struct btf_encoder *encoder, struct functi
state->nr_parms--;
continue;
}
+ if (encoder->cu->producer_clang && param->optimized)
+ continue;
+
name = parameter__name(param) ?: "";
str_off = btf__add_str(btf, name);
if (str_off < 0) {
--
2.47.3
next prev parent reply other threads:[~2026-03-09 15:33 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-09 15:32 [PATCH dwarves v2 0/9] pahole: Encode true signatures in kernel BTF Yonghong Song
2026-03-09 15:32 ` [PATCH dwarves v2 1/9] dwarf_loader: Reduce parameter checking with clang DW_AT_calling_convention attr Yonghong Song
2026-03-09 15:32 ` [PATCH dwarves v2 2/9] dwarf_loader: Handle signatures with dead arguments Yonghong Song
2026-03-09 15:32 ` [PATCH dwarves v2 3/9] dwarf_loader: Refactor initial ret -1 to be macro PARM_DEFAULT_FAIL Yonghong Song
2026-03-09 15:32 ` [PATCH dwarves v2 4/9] dwarf_laoder: Handle locations with DW_OP_fbreg Yonghong Song
2026-03-09 15:32 ` [PATCH dwarves v2 5/9] dwarf_loader: Change exprlen checking condition in parameter__reg() Yonghong Song
2026-03-09 15:32 ` [PATCH dwarves v2 6/9] dwarf_loader: Detect optimized parameters with locations having constant values Yonghong Song
2026-03-09 15:32 ` [PATCH dwarves v2 7/9] dwarf_loader: Handle expression lists Yonghong Song
2026-03-09 15:32 ` Yonghong Song [this message]
2026-03-09 15:33 ` [PATCH dwarves v2 9/9] tests: Add a few clang true signature tests Yonghong Song
2026-03-09 18:39 ` [PATCH dwarves v2 0/9] pahole: Encode true signatures in kernel BTF Alan Maguire
2026-03-09 19:25 ` Yonghong Song
2026-03-19 16:23 ` Yonghong Song
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=20260309153256.1921729-1-yonghong.song@linux.dev \
--to=yonghong.song@linux.dev \
--cc=alan.maguire@oracle.com \
--cc=andrii@kernel.org \
--cc=arnaldo.melo@gmail.com \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=dwarves@vger.kernel.org \
--cc=kernel-team@fb.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