Re: [PATCH dwarves 9/9] tests: Add a few clang true signature tests
Alan Maguire <[email protected]> Thu, 19 Mar 2026 18:48:34 +0000
| Newsgroups | org.kernel.vger.dwarves,org.kernel.vger.bpf |
|---|---|
| Message-ID | <[email protected]> |
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 <[email protected]>
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.
Thanks!
Alan
[1] https://lore.kernel.org/dwarves/[email protected]/
> ---
> 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