public inbox for bpf@vger.kernel.org
 help / color / mirror / Atom feed
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: Re: [PATCH dwarves v3 9/9] tests: Add a few clang true signature tests
Date: Mon, 23 Mar 2026 12:58:40 -0700	[thread overview]
Message-ID: <f9ae52c7-af13-4c94-8ca1-0cef5ce280e8@linux.dev> (raw)
In-Reply-To: <0ee4bc7a-692f-46a1-9373-2f405e5305d1@oracle.com>



On 3/23/26 8:41 AM, Alan Maguire wrote:
> On 20/03/2026 19:10, Yonghong Song wrote:
>> Three tests are added.
>>
>> Test 1: VERBOSE=1 ./clang_parm_optimized.sh
>>    BTF:   char * foo(struct t * a, struct t * d);
>>    DWARF: char * foo(struct t * a, int b, struct t * d);
>> where parameber 'b' is unused.
>>
>> Test 2: VERBOSE=1 ./clang_parm_optimized_stack.sh
>>    BTF:   char * foo(struct t * a, struct t * d);
>>    DWARF: char * foo(struct t * a, int b1, int b2, int b3, int b4, int b5, int b6, struct t * d);
>> where parameters 'b1' to 'b6' are unused.
>>
>> Test 3: VERBOSE=1 ./clang_parm_aggregate.sh
>>    BTF:   long foo(long a__f1, struct t b, int i);
>>    DWARF: long foo(struct t a, struct t b, int i);
>> where the 'struct t' definition is 'struct t { long f1; long f2; };', and
>> a.f2 is not used in the function.
>>
>> Signed-off-by: Yonghong Song <yonghong.song@linux.dev>
> thanks for the tests! Ran this through CI [1] and got a failure on aarch64:
>
> 2: clang_parm_aggregate.sh
> Validation of BTF encoding of true_signatures.
>     BTF and DWARF signatures should be different and they are not: BTF: long foo(struct t a, struct t b, int i); ; DWARF long foo(struct t a, struct t b, int i);
> Test ./clang_parm_aggregate.sh failed
> Test data is in /tmp/clang_parm_aggregate.sh.YC44qj

Thanks for spotting this. I forgot to verify it on aarch64.
For x86, we have:

0x00000041:   DW_TAG_subprogram
                 DW_AT_low_pc    (0x0000000000000020)
                 DW_AT_high_pc   (0x000000000000002d)
                 DW_AT_frame_base        (DW_OP_reg7 RSP)
                 DW_AT_call_all_calls    (true)
                 DW_AT_name      ("foo")
                 DW_AT_decl_file ("/home/yhs/tmp/tmp4/t.c")
                 DW_AT_decl_line (2)
                 DW_AT_prototyped        (true)
                 DW_AT_calling_convention        (DW_CC_nocall)
                 DW_AT_type      (0x00000094 "long")
                                  
0x00000051:     DW_TAG_formal_parameter
                   DW_AT_location        (DW_OP_reg5 RDI, DW_OP_piece 0x8)
                   DW_AT_name    ("a")
                   DW_AT_decl_file       ("/home/yhs/tmp/tmp4/t.c")
                   DW_AT_decl_line       (2)
                   DW_AT_type    (0x0000007c "t")
                                  
0x0000005d:     DW_TAG_formal_parameter
                   DW_AT_location        (indexed (0x0) loclist = 0x00000010:
                      [0x0000000000000020, 0x0000000000000023): DW_OP_reg4 RSI, DW_OP_piece 0x8, DW_OP_reg1 RDX, DW_OP_piece 0x8
                      [0x0000000000000023, 0x000000000000002d): DW_OP_piece 0x8, DW_OP_reg1 RDX, DW_OP_piece 0x8)
                   DW_AT_name    ("b")
                   DW_AT_decl_file       ("/home/yhs/tmp/tmp4/t.c")
                   DW_AT_decl_line       (2)
                   DW_AT_type    (0x0000007c "t")
                                                                   
0x00000066:     DW_TAG_formal_parameter
                   DW_AT_location        (DW_OP_reg2 RCX)
                   DW_AT_name    ("i")
                   DW_AT_decl_file       ("/home/yhs/tmp/tmp4/t.c")
                   DW_AT_decl_line       (2)
                   DW_AT_type    (0x00000027 "int")
                                                                   
0x00000070:     NULL

So for x84, we can find true signature.

For aarch64:

0x00000041:   DW_TAG_subprogram
                 DW_AT_low_pc    (0x0000000000000034)
                 DW_AT_high_pc   (0x0000000000000044)
                 DW_AT_frame_base        (DW_OP_reg31 WSP)
                 DW_AT_call_all_calls    (true)
                 DW_AT_name      ("foo")
                 DW_AT_decl_file ("/home/yhs/tmp/t.c")
                 DW_AT_decl_line (2)
                 DW_AT_prototyped        (true)
                 DW_AT_type      (0x00000090 "long")
                                                                          
0x00000050:     DW_TAG_formal_parameter
                   DW_AT_location        (indexed (0x0) loclist = 0x00000014:
                      [0x0000000000000034, 0x0000000000000040): DW_OP_reg0 W0, DW_OP_piece 0x8)
                   DW_AT_name    ("a")
                   DW_AT_decl_file       ("/home/yhs/tmp/t.c")
                   DW_AT_decl_line       (2)
                   DW_AT_type    (0x00000078 "t")
                                                                          
0x00000059:     DW_TAG_formal_parameter
                   DW_AT_location        (indexed (0x1) loclist = 0x0000001c:
                      [0x0000000000000034, 0x0000000000000044): DW_OP_reg2 W2, DW_OP_piece 0x8, DW_OP_reg3 W3, DW_OP_piece 0x8)
                   DW_AT_name    ("b")
                   DW_AT_decl_file       ("/home/yhs/tmp/t.c")
                   DW_AT_decl_line       (2)
                   DW_AT_type    (0x00000078 "t")
                                                                          
0x00000062:     DW_TAG_formal_parameter
                   DW_AT_location        (DW_OP_reg4 W4)
                   DW_AT_name    ("i")
                   DW_AT_decl_file       ("/home/yhs/tmp/t.c")
                   DW_AT_decl_line       (2)
                   DW_AT_type    (0x00000027 "int")
                                     
0x0000006c:     NULL

In this case, the parameter 'a' only uses the first 8 byte which encoded into W0. The argument 'b'
uses W2/W3. For this particular case, the original signature should be used. I will try to find a
way to resolve this.

> ---
>
> And for a kernel LLVM build (enabled with [2]) we also see:
>
> 1: btf_functions.sh
> Validation of BTF encoding of functions.
>     This may take some time.
>     ERROR: mismatch : BTF 'bool __scm_recv_common(struct sock *, struct msghdr *, struct scm_cookie *);' not found; DWARF ''
> Test ./btf_functions.sh failed
> Test data is in /tmp/btf_functions.sh.P23ipZ
>
> This test compares BTF and DWARF representations, trying to ensure we see matches
> between DWARF function signatures reported by pfunct for both BTF and DWARF. It might
> be worth looking to see if we can refine the test here to handle functions with changed
> signatures in DWARF, skipping those that have DW_CC_nocall say.
>
> In the above case pfunct is reporting a signature with the flags field omitted. The
> original signature looks like this:
>
> static bool __scm_recv_common(struct sock *sk, struct msghdr *msg, struct scm_cookie *scm, int flags);
>
> ...so we don't find an equivalent match in DWARF as a result.

Currently, without +true_signature flag, clang may still generate true signatures
by filtering the dead arguments which are at the end of function parameters.
I think we should require +true_signagure flag to do this.
I will fix this. Thanks for spotting.

>
> [1] https://github.com/alan-maguire/dwarves/actions/runs/23443008554/job/68198951034
> [2] https://lore.kernel.org/dwarves/20260323130503.857217-1-alan.maguire@oracle.com/
>
>> ---
>>   tests/clang_parm_aggregate.sh       | 63 +++++++++++++++++++++++
>>   tests/clang_parm_optimized.sh       | 77 +++++++++++++++++++++++++++++
>>   tests/clang_parm_optimized_stack.sh | 77 +++++++++++++++++++++++++++++
>>   3 files changed, 217 insertions(+)
>>   create mode 100755 tests/clang_parm_aggregate.sh
>>   create mode 100755 tests/clang_parm_optimized.sh
>>   create mode 100755 tests/clang_parm_optimized_stack.sh
>>
>> diff --git a/tests/clang_parm_aggregate.sh b/tests/clang_parm_aggregate.sh
>> new file mode 100755
>> index 0000000..bf47c8c
>> --- /dev/null
>> +++ b/tests/clang_parm_aggregate.sh
>> @@ -0,0 +1,63 @@
>> +#!/bin/bash
>> +# SPDX-License-Identifier: GPL-2.0-only
>> +
>> +source test_lib.sh
>> +
>> +outdir=$(make_tmpdir)
>> +
>> +# Comment this out to save test data.
>> +trap cleanup EXIT
>> +
>> +title_log "Validation of BTF encoding of true_signatures."
>> +
>> +clang_true="${outdir}/clang_true"
>> +CC=$(which clang 2>/dev/null)
>> +
>> +if [[ -z "$CC" ]]; then
>> +	info_log "skip: clang not available"
>> +	test_skip
>> +fi
>> +
>> +cat > ${clang_true}.c << EOF
>> +struct t { long f1; long f2; };
>> +__attribute__((noinline)) static long foo(struct t a, struct t b, int i)
>> +{
>> +        return a.f1 + b.f1 + b.f2 + i;
>> +}
>> +
>> +struct t p1, p2;
>> +int i;
>> +int main()
>> +{
>> +        return (int)foo(p1, p2, i);
>> +}
>> +EOF
>> +
>> +CFLAGS="$CFLAGS -g -O2"
>> +${CC} ${CFLAGS} -o $clang_true ${clang_true}.c
>> +if [[ $? -ne 0 ]]; then
>> +	error_log "Could not compile ${clang_true}.c"
>> +	test_fail
>> +fi
>> +LLVM_OBJCOPY=objcopy pahole -J --btf_features=+true_signature $clang_true
>> +if [[ $? -ne 0 ]]; then
>> +	error_log "Could not encode BTF for $clang_true"
>> +	test_fail
>> +fi
>> +
>> +btf_optimized=$(pfunct --all --format_path=btf $clang_true |grep "foo")
>> +if [[ -z "$btf_optimized" ]]; then
>> +	info_log "skip: no optimizations applied."
>> +	test_skip
>> +fi
>> +
>> +btf_cmp=$btf_optimized
>> +dwarf=$(pfunct --all $clang_true |grep "foo")
>> +
>> +verbose_log "BTF: $btf_optimized  DWARF: $dwarf"
>> +
>> +if [[ "$btf_cmp" == "$dwarf" ]]; then
>> +	error_log "BTF and DWARF signatures should be different and they are not: BTF: $btf_optimized ; DWARF $dwarf"
>> +	test_fail
>> +fi
>> +test_pass

[...]


      reply	other threads:[~2026-03-23 19:58 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-20 19:09 [PATCH dwarves v3 0/9] pahole: Encode true signatures in kernel BTF Yonghong Song
2026-03-20 19:09 ` [PATCH dwarves v3 1/9] dwarf_loader: Reduce parameter checking with clang DW_AT_calling_convention attr Yonghong Song
2026-03-21 23:10   ` Jiri Olsa
2026-03-22 17:36     ` Yonghong Song
2026-03-23 12:56       ` Alan Maguire
2026-03-23 18:32         ` Yonghong Song
2026-03-20 19:09 ` [PATCH dwarves v3 2/9] dwarf_loader: Handle signatures with dead arguments Yonghong Song
2026-03-21 23:10   ` Jiri Olsa
2026-03-22 18:03     ` Yonghong Song
2026-03-20 19:09 ` [PATCH dwarves v3 3/9] dwarf_loader: Refactor initial ret -1 to be macro PARM_DEFAULT_FAIL Yonghong Song
2026-03-20 19:09 ` [PATCH dwarves v3 4/9] dwarf_laoder: Handle locations with DW_OP_fbreg Yonghong Song
2026-03-20 19:09 ` [PATCH dwarves v3 5/9] dwarf_loader: Change exprlen checking condition in parameter__reg() Yonghong Song
2026-03-20 19:09 ` [PATCH dwarves v3 6/9] dwarf_loader: Detect optimized parameters with locations having constant values Yonghong Song
2026-03-20 19:09 ` [PATCH dwarves v3 7/9] dwarf_loader: Handle expression lists Yonghong Song
2026-03-21 23:10   ` Jiri Olsa
2026-03-22 18:33     ` Yonghong Song
2026-03-20 19:09 ` [PATCH dwarves v3 8/9] btf_encoder: Handle optimized parameter properly Yonghong Song
2026-03-20 19:10 ` [PATCH dwarves v3 9/9] tests: Add a few clang true signature tests Yonghong Song
2026-03-23 15:41   ` Alan Maguire
2026-03-23 19:58     ` Yonghong Song [this message]

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=f9ae52c7-af13-4c94-8ca1-0cef5ce280e8@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