When using BTF as a source, pfunct should now be able to print btf_decl_tags for programs like below: #define __tag(x) __attribute__((btf_decl_tag(#x))) __tag(a) __tag(b) void foo(void) {} This situation arises after recent kernel changes, where tags 'kfunc' and 'bpf_fastcall' are added to some functions. To avoid dependency on a recent kernel version test this by compiling a small C program using clang with --target=bpf, which would instruct clang to generate .BTF section. Signed-off-by: Eduard Zingerman <eddyz87@xxxxxxxxx> --- tests/pfunct-btf-decl-tags.sh | 65 +++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100755 tests/pfunct-btf-decl-tags.sh diff --git a/tests/pfunct-btf-decl-tags.sh b/tests/pfunct-btf-decl-tags.sh new file mode 100755 index 0000000..7e7f547 --- /dev/null +++ b/tests/pfunct-btf-decl-tags.sh @@ -0,0 +1,65 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0-only + +# Check that pfunct can print btf_decl_tags read from BTF + +tmpobj=$(mktemp /tmp/pfunct-btf-decl-tags.sh.XXXXXX.o) + +cleanup() +{ + rm $tmpobj +} + +trap cleanup EXIT + +CLANG=${CLANG:-clang} +if ! command -v $CLANG > /dev/null; then + echo "Need clang for test $0" + exit 1 +fi + +(cat <<EOF +#define __tag(x) __attribute__((btf_decl_tag(#x))) + +__tag(a) __tag(b) __tag(c) void foo(void) {} +__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 +{ +match(\$0,/^(.*) (void .*)/,tags_and_proto); +tags = tags_and_proto[1]; +proto = tags_and_proto[2]; +split(tags, tags_arr ,/ /); +asort(tags_arr); +for (t in tags_arr) printf "%s ", tags_arr[t]; +print proto; +} +EOF +) + +expected=$(cat <<EOF +a b c void foo(void); +a b void bar(void); +a void buz(void); +EOF +) + +out=$(pfunct -P -F btf $tmpobj | awk "$sort_tags" | sort) +d=$(diff -u <(echo "$expected") <(echo "$out")) + +if [[ "$d" == "" ]]; then + echo "Ok" + exit 0 +else + echo "pfunct output does not match expected:" + echo "$d" + echo + echo "Complete output:" + echo "$out" + exit 1 +fi -- 2.47.0