public inbox for bpf@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH dwarves] bpf_encoder: Fix a verbose output issue
@ 2026-01-15  5:00 Yonghong Song
  2026-01-15  9:41 ` Alan Maguire
  0 siblings, 1 reply; 3+ messages in thread
From: Yonghong Song @ 2026-01-15  5:00 UTC (permalink / raw)
  To: Alan Maguire, Arnaldo Carvalho de Melo, dwarves
  Cc: Alexei Starovoitov, Andrii Nakryiko, bpf, kernel-team

For the following test.c:
  $ cat test.c
  unsigned tar(int a);
  __attribute__((noinline)) static int foo(int a, int b)
  {
    return tar(a) + tar(a + 1);
  }
  __attribute__((noinline)) int bar(int a)
  {
    foo(a, 1);
    return 0;
  }
The llvm compilation:
  $ clang -O2 -g -c test.c
And then
  $ pahole -JV test.o
  btf_encoder__new: 'test.o' doesn't have '.data..percpu' sectio  n
  File test.o:
  [1] INT unsigned int size=4 nr_bits=32 encoding=(none)
  [2] INT int size=4 nr_bits=32 encoding=SIGNED
  search cu 'test.c' for percpu global variables.
  [3] FUNC_PROTO (anon) return=2 args=(2 a, [4] FUNC bar type_id=3
  [5] FUNC_PROTO (anon) return=2 args=(2 a, 2 b, [6] FUNC foo type_id=5

The above confused format is due to btf_encoder__add_func_proto_for_state().
The "is_last = param_idx == nr_params" is always false since param_idx
starts from 0. The below change fixed the issue:
  is_last = param_idx == (nr_params - 1)

With the fix, 'pahole -JV test.o' will produce the following:
  ...
  [3] FUNC_PROTO (anon) return=2 args=(2 a)
  [4] FUNC bar type_id=3
  [5] FUNC_PROTO (anon) return=2 args=(2 a, 2 b)
  [6] FUNC foo type_id=5
  ...

Signed-off-by: Yonghong Song <yonghong.song@linux.dev>
---
 btf_encoder.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/btf_encoder.c b/btf_encoder.c
index b37ee7f..09a5cda 100644
--- a/btf_encoder.c
+++ b/btf_encoder.c
@@ -895,7 +895,7 @@ static int32_t btf_encoder__add_func_proto_for_state(struct btf_encoder *encoder
 	for (param_idx = 0; param_idx < nr_params; param_idx++) {
 		p = &state->parms[param_idx];
 		name = btf__name_by_offset(btf, p->name_off);
-		is_last = param_idx == nr_params;
+		is_last = param_idx == (nr_params - 1);
 
 		/* adding BTF data may result in a move of the
 		 * name string memory, so make a temporary copy.
-- 
2.47.3


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH dwarves] bpf_encoder: Fix a verbose output issue
  2026-01-15  5:00 [PATCH dwarves] bpf_encoder: Fix a verbose output issue Yonghong Song
@ 2026-01-15  9:41 ` Alan Maguire
  2026-01-15 17:09   ` Yonghong Song
  0 siblings, 1 reply; 3+ messages in thread
From: Alan Maguire @ 2026-01-15  9:41 UTC (permalink / raw)
  To: Yonghong Song, Arnaldo Carvalho de Melo, dwarves
  Cc: Alexei Starovoitov, Andrii Nakryiko, bpf, kernel-team

On 15/01/2026 05:00, Yonghong Song wrote:
> For the following test.c:
>   $ cat test.c
>   unsigned tar(int a);
>   __attribute__((noinline)) static int foo(int a, int b)
>   {
>     return tar(a) + tar(a + 1);
>   }
>   __attribute__((noinline)) int bar(int a)
>   {
>     foo(a, 1);
>     return 0;
>   }
> The llvm compilation:
>   $ clang -O2 -g -c test.c
> And then
>   $ pahole -JV test.o
>   btf_encoder__new: 'test.o' doesn't have '.data..percpu' sectio  n
>   File test.o:
>   [1] INT unsigned int size=4 nr_bits=32 encoding=(none)
>   [2] INT int size=4 nr_bits=32 encoding=SIGNED
>   search cu 'test.c' for percpu global variables.
>   [3] FUNC_PROTO (anon) return=2 args=(2 a, [4] FUNC bar type_id=3
>   [5] FUNC_PROTO (anon) return=2 args=(2 a, 2 b, [6] FUNC foo type_id=5
> 
> The above confused format is due to btf_encoder__add_func_proto_for_state().
> The "is_last = param_idx == nr_params" is always false since param_idx
> starts from 0. The below change fixed the issue:
>   is_last = param_idx == (nr_params - 1)
> 
> With the fix, 'pahole -JV test.o' will produce the following:
>   ...
>   [3] FUNC_PROTO (anon) return=2 args=(2 a)
>   [4] FUNC bar type_id=3
>   [5] FUNC_PROTO (anon) return=2 args=(2 a, 2 b)
>   [6] FUNC foo type_id=5
>   ...
> 
> Signed-off-by: Yonghong Song <yonghong.song@linux.dev>

This fix looks good but I _think_ we have another instance of this; see
btf_encoder__add_func_proto_for_ftype()

	ftype__for_each_parameter(ftype, param) {
                name = parameter__name(param);
                type_id = param->tag.type == 0 ? 0 : encoder->type_id_off + param->tag.type;
                ++param_idx;
                if (btf_encoder__add_func_param(encoder, name, type_id, param_idx == nr_params))
                        return -1;
        }

        ++param_idx;
        if (ftype->unspec_parms)
                if (btf_encoder__add_func_param(encoder, NULL, 0, param_idx == nr_params))
                        return -1;

Maybe I'm misreading but that last ++param_idx outside the loop is unneeded
I think? If I'm right would you mind fixing that one too? Thanks!

> ---
>  btf_encoder.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/btf_encoder.c b/btf_encoder.c
> index b37ee7f..09a5cda 100644
> --- a/btf_encoder.c
> +++ b/btf_encoder.c
> @@ -895,7 +895,7 @@ static int32_t btf_encoder__add_func_proto_for_state(struct btf_encoder *encoder
>  	for (param_idx = 0; param_idx < nr_params; param_idx++) {
>  		p = &state->parms[param_idx];
>  		name = btf__name_by_offset(btf, p->name_off);
> -		is_last = param_idx == nr_params;
> +		is_last = param_idx == (nr_params - 1);
>  
>  		/* adding BTF data may result in a move of the
>  		 * name string memory, so make a temporary copy.


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH dwarves] bpf_encoder: Fix a verbose output issue
  2026-01-15  9:41 ` Alan Maguire
@ 2026-01-15 17:09   ` Yonghong Song
  0 siblings, 0 replies; 3+ messages in thread
From: Yonghong Song @ 2026-01-15 17:09 UTC (permalink / raw)
  To: Alan Maguire, Arnaldo Carvalho de Melo, dwarves
  Cc: Alexei Starovoitov, Andrii Nakryiko, bpf, kernel-team



On 1/15/26 1:41 AM, Alan Maguire wrote:
> On 15/01/2026 05:00, Yonghong Song wrote:
>> For the following test.c:
>>    $ cat test.c
>>    unsigned tar(int a);
>>    __attribute__((noinline)) static int foo(int a, int b)
>>    {
>>      return tar(a) + tar(a + 1);
>>    }
>>    __attribute__((noinline)) int bar(int a)
>>    {
>>      foo(a, 1);
>>      return 0;
>>    }
>> The llvm compilation:
>>    $ clang -O2 -g -c test.c
>> And then
>>    $ pahole -JV test.o
>>    btf_encoder__new: 'test.o' doesn't have '.data..percpu' sectio  n
>>    File test.o:
>>    [1] INT unsigned int size=4 nr_bits=32 encoding=(none)
>>    [2] INT int size=4 nr_bits=32 encoding=SIGNED
>>    search cu 'test.c' for percpu global variables.
>>    [3] FUNC_PROTO (anon) return=2 args=(2 a, [4] FUNC bar type_id=3
>>    [5] FUNC_PROTO (anon) return=2 args=(2 a, 2 b, [6] FUNC foo type_id=5
>>
>> The above confused format is due to btf_encoder__add_func_proto_for_state().
>> The "is_last = param_idx == nr_params" is always false since param_idx
>> starts from 0. The below change fixed the issue:
>>    is_last = param_idx == (nr_params - 1)
>>
>> With the fix, 'pahole -JV test.o' will produce the following:
>>    ...
>>    [3] FUNC_PROTO (anon) return=2 args=(2 a)
>>    [4] FUNC bar type_id=3
>>    [5] FUNC_PROTO (anon) return=2 args=(2 a, 2 b)
>>    [6] FUNC foo type_id=5
>>    ...
>>
>> Signed-off-by: Yonghong Song <yonghong.song@linux.dev>
> This fix looks good but I _think_ we have another instance of this; see
> btf_encoder__add_func_proto_for_ftype()
>
> 	ftype__for_each_parameter(ftype, param) {
>                  name = parameter__name(param);
>                  type_id = param->tag.type == 0 ? 0 : encoder->type_id_off + param->tag.type;
>                  ++param_idx;
>                  if (btf_encoder__add_func_param(encoder, name, type_id, param_idx == nr_params))
>                          return -1;
>          }
>
>          ++param_idx;
>          if (ftype->unspec_parms)
>                  if (btf_encoder__add_func_param(encoder, NULL, 0, param_idx == nr_params))
>                          return -1;
>
> Maybe I'm misreading but that last ++param_idx outside the loop is unneeded
> I think? If I'm right would you mind fixing that one too? Thanks!

Sure. Will take a look.

>
>> ---
>>   btf_encoder.c | 2 +-
>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/btf_encoder.c b/btf_encoder.c
>> index b37ee7f..09a5cda 100644
>> --- a/btf_encoder.c
>> +++ b/btf_encoder.c
>> @@ -895,7 +895,7 @@ static int32_t btf_encoder__add_func_proto_for_state(struct btf_encoder *encoder
>>   	for (param_idx = 0; param_idx < nr_params; param_idx++) {
>>   		p = &state->parms[param_idx];
>>   		name = btf__name_by_offset(btf, p->name_off);
>> -		is_last = param_idx == nr_params;
>> +		is_last = param_idx == (nr_params - 1);
>>   
>>   		/* adding BTF data may result in a move of the
>>   		 * name string memory, so make a temporary copy.


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-01-15 17:09 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-15  5:00 [PATCH dwarves] bpf_encoder: Fix a verbose output issue Yonghong Song
2026-01-15  9:41 ` Alan Maguire
2026-01-15 17:09   ` Yonghong Song

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox