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 9/9] tests: Add a few clang true signature tests
Date: Thu, 19 Mar 2026 21:52:35 -0700 [thread overview]
Message-ID: <7a30f200-9f70-4091-a770-8b9f31810c9a@linux.dev> (raw)
In-Reply-To: <e2096d0a-5c78-496e-a269-1daf2a3784b5@oracle.com>
On 3/19/26 11:48 AM, Alan Maguire wrote:
> On 05/03/2026 22:55, Yonghong Song wrote:
>> Three tests are added.
>>
>> Test 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: 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: 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>
> tests look good but we need to ensure they are run by the ./tests script
> so that they will be run in CI. also take a look at Bruce's work to
> add common test functions [1], will probably simplify aspects of the tests.
Okay. The [1] is recently added. I will follow the convention in the next revision.
>
> Thanks!
>
> Alan
>
> [1] https://lore.kernel.org/dwarves/20260309205643.1985134-2-bruce.mcculloch@oracle.com/
>
>> ---
>> tests/true_signatures/clang_parm_aggregate.sh | 83 ++++++++++++++++
>> tests/true_signatures/clang_parm_optimized.sh | 95 +++++++++++++++++++
>> .../clang_parm_optimized_stack.sh | 95 +++++++++++++++++++
>> .../gcc_true_signatures.sh | 0
>> 4 files changed, 273 insertions(+)
>> create mode 100755 tests/true_signatures/clang_parm_aggregate.sh
>> create mode 100755 tests/true_signatures/clang_parm_optimized.sh
>> create mode 100755 tests/true_signatures/clang_parm_optimized_stack.sh
>> rename tests/{ => true_signatures}/gcc_true_signatures.sh (100%)
>>
>> diff --git a/tests/true_signatures/clang_parm_aggregate.sh b/tests/true_signatures/clang_parm_aggregate.sh
>> new file mode 100755
>> index 0000000..6d92701
>> --- /dev/null
>> +++ b/tests/true_signatures/clang_parm_aggregate.sh
>> @@ -0,0 +1,83 @@
>> +#!/bin/bash
>> +# SPDX-License-Identifier: GPL-2.0-only
>> +
>> +outdir=
>> +
>> +fail()
>> +{
>> + # Do not remove test dir; might be useful for analysis
>> + trap - EXIT
>> + if [[ -d "$outdir" ]]; then
>> + echo "Test data is in $outdir"
>> + fi
>> + exit 1
>> +}
>> +
>> +cleanup()
>> +{
>> + rm ${outdir}/*
>> + rmdir $outdir
>> +}
>> +
>> +outdir=$(mktemp -d /tmp/clang_true.sh.XXXXXX)
>> +
>> +trap cleanup EXIT
>> +
>> +echo -n "Validation of BTF encoding of true_signatures: "
>> +
>> +clang_true="${outdir}/clang_true"
>> +CC=$(which clang 2>/dev/null)
>> +
>> +if [[ -z "$CC" ]]; then
>> + echo "skip: clang not available"
>> + exit 2
>> +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
>> + echo "Could not compile ${clang_true}.c" >& 2
>> + exit 1
>> +fi
>> +LLVM_OBJCOPY=objcopy pahole -J --btf_features=+true_signature $clang_true
>> +if [[ $? -ne 0 ]]; then
>> + echo "Could not encode BTF for $clang_true"
>> + exit 1
>> +fi
>> +
>> +btf_optimized=$(pfunct --all --format_path=btf $clang_true |grep "foo")
>> +if [[ -z "$btf_optimized" ]]; then
>> + echo "skip: no optimizations applied."
>> + exit 2
>> +fi
>> +
>> +btf_cmp=$btf_optimized
>> +dwarf=$(pfunct --all $clang_true |grep "foo")
>> +
>> +test -n "$VERBOSE" && printf "\nBTF: $btf_optimized DWARF: $dwarf \n"
>> +
>> +if [[ "$btf_cmp" == "$dwarf" ]]; then
>> + echo "BTF and DWARF signatures should be different and they are not: BTF: $btf_optimized ; DWARF $dwarf"
>> + exit 1
>> +else
>> + echo ""
>> + echo " BTF: $btf_optimized"
>> + echo " DWARF: $dwarf"
>> +fi
>> +echo "Ok"
>> +exit 0
>> diff --git a/tests/true_signatures/clang_parm_optimized.sh b/tests/true_signatures/clang_parm_optimized.sh
>> new file mode 100755
>> index 0000000..3022e2b
>> --- /dev/null
>> +++ b/tests/true_signatures/clang_parm_optimized.sh
>> @@ -0,0 +1,95 @@
>> +#!/bin/bash
>> +# SPDX-License-Identifier: GPL-2.0-only
>> +
>> +outdir=
>> +
>> +fail()
>> +{
>> + # Do not remove test dir; might be useful for analysis
>> + trap - EXIT
>> + if [[ -d "$outdir" ]]; then
>> + echo "Test data is in $outdir"
>> + fi
>> + exit 1
>> +}
>> +
>> +cleanup()
>> +{
>> + rm ${outdir}/*
>> + rmdir $outdir
>> +}
>> +
>> +outdir=$(mktemp -d /tmp/clang_true.sh.XXXXXX)
>> +
>> +trap cleanup EXIT
>> +
>> +echo -n "Validation of BTF encoding of true_signatures: "
>> +
>> +clang_true="${outdir}/clang_true"
>> +CC=$(which clang 2>/dev/null)
>> +
>> +if [[ -z "$CC" ]]; then
>> + echo "skip: clang not available"
>> + exit 2
>> +fi
>> +
>> +cat > ${clang_true}.c << EOF
>> +struct t { int a; };
>> +__attribute__((noinline)) char *tar(struct t *a, struct t *d)
>> +{
>> + if (a->a == d->a)
>> + return (char *)10;
>> + else
>> + return (char *)0;
>> +}
>> +
>> +__attribute__((noinline)) static char * foo(struct t *a, int b, struct t *d)
>> +{
>> + return tar(a, d);
>> +}
>> +
>> +__attribute__((noinline)) char *bar(struct t *a, struct t *d)
>> +{
>> + return foo(a, 1, d);
>> +}
>> +
>> +struct t p1, p2;
>> +int main()
>> +{
>> + return !!bar(&p1, &p2);
>> +}
>> +EOF
>> +
>> +CFLAGS="$CFLAGS -g -O2"
>> +${CC} ${CFLAGS} -o $clang_true ${clang_true}.c
>> +if [[ $? -ne 0 ]]; then
>> + echo "Could not compile ${clang_true}.c" >& 2
>> + exit 1
>> +fi
>> +LLVM_OBJCOPY=objcopy pahole -J --btf_features=+true_signature $clang_true
>> +if [[ $? -ne 0 ]]; then
>> + echo "Could not encode BTF for $clang_true"
>> + exit 1
>> +fi
>> +
>> +btf_optimized=$(pfunct --all --format_path=btf $clang_true |grep "foo")
>> +if [[ -z "$btf_optimized" ]]; then
>> + echo "skip: no optimizations applied."
>> + exit 2
>> +fi
>> +
>> +btf_cmp=$btf_optimized
>> +dwarf=$(pfunct --all $clang_true |grep "foo")
>> +
>> +test -n "$VERBOSE" && printf "\nBTF: $btf_optimized DWARF: $dwarf \n"
>> +
>> +if [[ "$btf_cmp" == "$dwarf" ]]; then
>> + echo "BTF and DWARF signatures should be different and they are not: BTF: $btf_optimized ; DWARF $dwarf"
>> + exit 1
>> +else
>> + echo ""
>> + echo " BTF: $btf_optimized"
>> + echo " DWARF: $dwarf"
>> +fi
>> +echo "Ok"
>> +exit 0
>> diff --git a/tests/true_signatures/clang_parm_optimized_stack.sh b/tests/true_signatures/clang_parm_optimized_stack.sh
>> new file mode 100755
>> index 0000000..1abb96d
>> --- /dev/null
>> +++ b/tests/true_signatures/clang_parm_optimized_stack.sh
>> @@ -0,0 +1,95 @@
>> +#!/bin/bash
>> +# SPDX-License-Identifier: GPL-2.0-only
>> +
>> +outdir=
>> +
>> +fail()
>> +{
>> + # Do not remove test dir; might be useful for analysis
>> + trap - EXIT
>> + if [[ -d "$outdir" ]]; then
>> + echo "Test data is in $outdir"
>> + fi
>> + exit 1
>> +}
>> +
>> +cleanup()
>> +{
>> + rm ${outdir}/*
>> + rmdir $outdir
>> +}
>> +
>> +outdir=$(mktemp -d /tmp/clang_true.sh.XXXXXX)
>> +
>> +trap cleanup EXIT
>> +
>> +echo -n "Validation of BTF encoding of true_signatures: "
>> +
>> +clang_true="${outdir}/clang_true"
>> +CC=$(which clang 2>/dev/null)
>> +
>> +if [[ -z "$CC" ]]; then
>> + echo "skip: clang not available"
>> + exit 2
>> +fi
>> +
>> +cat > ${clang_true}.c << EOF
>> +struct t { int a; };
>> +__attribute__((noinline)) char *tar(struct t *a, struct t *d)
>> +{
>> + if (a->a == d->a)
>> + return (char *)10;
>> + else
>> + return (char *)0;
>> +}
>> +
>> +__attribute__((noinline)) static char * foo(struct t *a, int b1, int b2, int b3, int b4, int b5, int b6, struct t *d)
>> +{
>> + return tar(a, d);
>> +}
>> +
>> +__attribute__((noinline)) char *bar(struct t *a, struct t *d)
>> +{
>> + return foo(a, 1, 2, 3, 4, 5, 6, d);
>> +}
>> +
>> +struct t p1, p2;
>> +int main()
>> +{
>> + return !!bar(&p1, &p2);
>> +}
>> +EOF
>> +
>> +CFLAGS="$CFLAGS -g -O2"
>> +${CC} ${CFLAGS} -o $clang_true ${clang_true}.c
>> +if [[ $? -ne 0 ]]; then
>> + echo "Could not compile ${clang_true}.c" >& 2
>> + exit 1
>> +fi
>> +LLVM_OBJCOPY=objcopy pahole -J --btf_features=+true_signature $clang_true
>> +if [[ $? -ne 0 ]]; then
>> + echo "Could not encode BTF for $clang_true"
>> + exit 1
>> +fi
>> +
>> +btf_optimized=$(pfunct --all --format_path=btf $clang_true |grep "foo")
>> +if [[ -z "$btf_optimized" ]]; then
>> + echo "skip: no optimizations applied."
>> + exit 2
>> +fi
>> +
>> +btf_cmp=$btf_optimized
>> +dwarf=$(pfunct --all $clang_true |grep "foo")
>> +
>> +test -n "$VERBOSE" && printf "\nBTF: $btf_optimized DWARF: $dwarf \n"
>> +
>> +if [[ "$btf_cmp" == "$dwarf" ]]; then
>> + echo "BTF and DWARF signatures should be different and they are not: BTF: $btf_optimized ; DWARF $dwarf"
>> + exit 1
>> +else
>> + echo ""
>> + echo " BTF: $btf_optimized"
>> + echo " DWARF: $dwarf"
>> +fi
>> +echo "Ok"
>> +exit 0
>> diff --git a/tests/gcc_true_signatures.sh b/tests/true_signatures/gcc_true_signatures.sh
>> similarity index 100%
>> rename from tests/gcc_true_signatures.sh
>> rename to tests/true_signatures/gcc_true_signatures.sh
prev parent reply other threads:[~2026-03-20 4:52 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-05 22:54 [PATCH dwarves 0/9] pahole: Encode true signatures in kernel BTF Yonghong Song
2026-03-05 22:55 ` [PATCH dwarves 1/9] dwarf_loader: Reduce parameter checking with clang DW_AT_calling_convention attr Yonghong Song
2026-03-19 12:32 ` Jiri Olsa
2026-03-19 17:31 ` Yonghong Song
2026-03-05 22:55 ` [PATCH dwarves 2/9] dwarf_loader: Handle signatures with dead arguments Yonghong Song
2026-03-19 18:55 ` Alan Maguire
2026-03-20 5:00 ` Yonghong Song
2026-03-20 19:20 ` Yonghong Song
2026-03-05 22:55 ` [PATCH dwarves 3/9] dwarf_loader: Refactor initial ret -1 to be macro PARM_DEFAULT_FAIL Yonghong Song
2026-03-05 22:55 ` [PATCH dwarves 4/9] dwarf_laoder: Handle locations with DW_OP_fbreg Yonghong Song
2026-03-05 22:55 ` [PATCH dwarves 5/9] dwarf_loader: Change exprlen checking condition in parameter__reg() Yonghong Song
2026-03-05 22:55 ` [PATCH dwarves 6/9] dwarf_loader: Detect optimized parameters with locations having constant values Yonghong Song
2026-03-05 22:55 ` [PATCH dwarves 7/9] dwarf_loader: Handle expression lists Yonghong Song
2026-03-05 22:55 ` [PATCH dwarves 8/9] btf_encoder: Handle optimized parameter properly Yonghong Song
2026-03-05 22:55 ` [PATCH dwarves 9/9] tests: Add a few clang true signature tests Yonghong Song
2026-03-19 18:48 ` Alan Maguire
2026-03-20 4:52 ` 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=7a30f200-9f70-4091-a770-8b9f31810c9a@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