Re: [PAHOLE v4 3/3] tests: Support GCC in pfunct-btf-decl-tags test

Yonghong Song <[email protected]> Wed, 3 Jun 2026 14:52:26 -0700
Newsgroups org.kernel.vger.dwarves,org.kernel.vger.bpf
Message-ID <[email protected]>

On 6/2/26 12:55 PM, Vineet Gupta wrote:
> GCC 16+ supports btf_decl_tag via DW_TAG_GNU_annotation. Update the
> test to run with both GCC (>= 16) and clang when available, instead
> of requiring clang only.
>
> Signed-off-by: Vineet Gupta <[email protected]>

LGTM but missing 'pahole -J' for clang test. See below.

Acked-by: Yonghong Song <[email protected]>

> ---
>   tests/pfunct-btf-decl-tags.sh | 72 +++++++++++++++++++++++++++--------
>   1 file changed, 56 insertions(+), 16 deletions(-)
>
> diff --git a/tests/pfunct-btf-decl-tags.sh b/tests/pfunct-btf-decl-tags.sh
> index 35884b4e8687..a46aa1f3df55 100755
> --- a/tests/pfunct-btf-decl-tags.sh
> +++ b/tests/pfunct-btf-decl-tags.sh
> @@ -6,24 +6,36 @@
>   source test_lib.sh
>   
>   outdir=$(make_tmpdir)
> -tmpobj=$(make_tmpobj)
>   
>   # Comment this out to save test data.
>   trap cleanup EXIT
>   
>   title_log "Check that pfunct can print btf_decl_tags read from BTF."
>   
> -# gcc now also supports decl tags as of gcc commit 43dcea48b8c,
> -# in upstream version 16.
> -# UPTODO: add a check here for that.
> +# gcc 16+ supports decl tags via DW_TAG_GNU_annotation (gcc commit ac7027f180b).
>   
> +GCC=${GCC:-gcc}
>   CLANG=${CLANG:-clang}
> -if ! command -v $CLANG > /dev/null; then
> -	error_log "Need clang for test $0"
> +
> +use_gcc=0
> +if command -v $GCC > /dev/null; then
> +	gcc_ver=$($GCC -dumpversion 2>/dev/null | cut -d. -f1)
> +	if [ "$gcc_ver" -ge 16 ] 2>/dev/null; then
> +		use_gcc=1
> +	fi
> +fi
> +
> +use_clang=0
> +if command -v $CLANG > /dev/null; then
> +	use_clang=1
> +fi
> +
> +if [ "$use_gcc" -eq 0 ] && [ "$use_clang" -eq 0 ]; then
> +	error_log "Need gcc >= 16 or clang for test $0"
>   	test_fail
>   fi
>   
> -(cat <<EOF
> +src=$(cat <<EOF
>   #define __tag(x) __attribute__((btf_decl_tag(#x)))
>   
>   __tag(a) __tag(b) __tag(c) void foo(void) {}
> @@ -31,7 +43,7 @@ __tag(a) __tag(b)          void bar(void) {}
>   __tag(a)                   void buz(void) {}
>   
>   EOF
> -) | $CLANG --target=bpf -c -g -x c -o $tmpobj -
> +)
>   
>   # tags order is not guaranteed
>   sort_tags=$(cat <<EOF
> @@ -54,16 +66,44 @@ a void buz(void);
>   EOF
>   )
>   
> -out=$(pfunct -P -F btf $tmpobj | awk "$sort_tags" | sort)
> -d=$(diff -u <(echo "$expected") <(echo "$out"))
> +run_test() {
> +	local compiler=$1
> +	local tmpobj=$2
> +
> +	info_log "Testing with $compiler"
> +	out=$(pfunct -P -F btf $tmpobj | awk "$sort_tags" | sort)
> +	d=$(diff -u <(echo "$expected") <(echo "$out"))
> +
> +	if [[ "$d" == "" ]]; then
> +		info_log "  passed"
> +		return 0
> +	else
> +		error_log "pfunct output does not match expected ($compiler):"
> +		info_log "$d"
> +		info_log
> +		info_log "Complete output:"
> +		info_log "$out"
> +		return 1
> +	fi
> +}
> +
> +failed=0
> +
> +if [ "$use_gcc" -eq 1 ]; then
> +	tmpobj=$(make_tmpobj)
> +	echo "$src" | $GCC -c -g -x c -o $tmpobj - 2>/dev/null
> +	pahole -J $tmpobj 2>/dev/null
> +	run_test "$GCC (version $gcc_ver)" "$tmpobj" || failed=1
> +fi
> +
> +if [ "$use_clang" -eq 1 ]; then
> +	tmpobj=$(make_tmpobj)
> +	echo "$src" | $CLANG --target=bpf -c -g -x c -o $tmpobj -

missing 'pahole -J $tmpobj 2>/dev/null' here.

> +	run_test "$CLANG" "$tmpobj" || failed=1
> +fi
>   
> -if [[ "$d" == "" ]]; then
> +if [ "$failed" -eq 0 ]; then
>   	test_pass
>   else
> -	error_log "pfunct output does not match expected:"
> -	info_log "$d"
> -	info_log
> -	info_log "Complete output:"
> -	info_log "$out"
>   	test_fail
>   fi