On Tue, Nov 9, 2021 at 9:21 PM Yonghong Song <yhs@xxxxxx> wrote: > > For the C test, compiler the kernel and selftest with clang compiler > by adding LLVM=1 to the make command line since btf_type_tag is > only supported by clang compiler now. I'm confused. Why does kernel compilation matter at all? And then for progs/*.c we always compile with Clang anyway (except for unused gcc_bpf flavor, but that's separate). So what am I missing? > > The following is the key btf_type_tag usage: > #define __tag1 __attribute__((btf_type_tag("tag1"))) > #define __tag2 __attribute__((btf_type_tag("tag2"))) > struct btf_type_tag_test { > int __tag1 * __tag1 __tag2 *p; > } g; > > The bpftool raw dump with related types: > [4] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED > [11] STRUCT 'btf_type_tag_test' size=8 vlen=1 > 'p' type_id=14 bits_offset=0 > [12] TYPE_TAG 'tag1' type_id=16 > [13] TYPE_TAG 'tag2' type_id=12 > [14] PTR '(anon)' type_id=13 > [15] TYPE_TAG 'tag1' type_id=4 > [16] PTR '(anon)' type_id=15 > [17] VAR 'g' type_id=11, linkage=global > > With format C dump, we have > struct btf_type_tag_test { > int __attribute__((btf_type_tag("tag1"))) * __attribute__((btf_type_tag("tag1"))) __attribute__((btf_type_tag("tag2"))) *p; > }; > The result C code is identical to the original definition except macro's are gone. > > Signed-off-by: Yonghong Song <yhs@xxxxxx> > --- > .../selftests/bpf/prog_tests/btf_tag.c | 24 +++++++++++++++ > .../selftests/bpf/progs/btf_type_tag.c | 29 +++++++++++++++++++ > 2 files changed, 53 insertions(+) > create mode 100644 tools/testing/selftests/bpf/progs/btf_type_tag.c > > diff --git a/tools/testing/selftests/bpf/prog_tests/btf_tag.c b/tools/testing/selftests/bpf/prog_tests/btf_tag.c > index d15cc7a88182..88d63e23e35f 100644 > --- a/tools/testing/selftests/bpf/prog_tests/btf_tag.c > +++ b/tools/testing/selftests/bpf/prog_tests/btf_tag.c > @@ -3,6 +3,12 @@ > #include <test_progs.h> > #include "btf_decl_tag.skel.h" > > +/* struct btf_type_tag_test is referenced in btf_type_tag.skel.h */ > +struct btf_type_tag_test { > + int **p; > +}; > +#include "btf_type_tag.skel.h" > + > static void test_btf_decl_tag(void) > { > struct btf_decl_tag *skel; > @@ -19,8 +25,26 @@ static void test_btf_decl_tag(void) > btf_decl_tag__destroy(skel); > } > > +static void test_btf_type_tag(void) > +{ > + struct btf_type_tag *skel; > + > + skel = btf_type_tag__open_and_load(); > + if (!ASSERT_OK_PTR(skel, "btf_type_tag")) > + return; > + > + if (skel->rodata->skip_tests) { > + printf("%s:SKIP: btf_type_tag attribute not supported", __func__); > + test__skip(); > + } > + > + btf_type_tag__destroy(skel); > +} > + > void test_btf_tag(void) > { > if (test__start_subtest("btf_decl_tag")) > test_btf_decl_tag(); > + if (test__start_subtest("btf_type_tag")) > + test_btf_type_tag(); > } > diff --git a/tools/testing/selftests/bpf/progs/btf_type_tag.c b/tools/testing/selftests/bpf/progs/btf_type_tag.c > new file mode 100644 > index 000000000000..0e18c777862c > --- /dev/null > +++ b/tools/testing/selftests/bpf/progs/btf_type_tag.c > @@ -0,0 +1,29 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* Copyright (c) 2021 Facebook */ > +#include "vmlinux.h" > +#include <bpf/bpf_helpers.h> > +#include <bpf/bpf_tracing.h> > + > +#ifndef __has_attribute > +#define __has_attribute(x) 0 > +#endif is this necessary, doesn't the minimum Clang/GCC version that we support have __has_attribute already? > + > +#if __has_attribute(btf_type_tag) > +#define __tag1 __attribute__((btf_type_tag("tag1"))) > +#define __tag2 __attribute__((btf_type_tag("tag2"))) > +volatile const bool skip_tests = false; > +#else > +#define __tag1 > +#define __tag2 > +volatile const bool skip_tests = true; > +#endif > + > +struct btf_type_tag_test { > + int __tag1 * __tag1 __tag2 *p; > +} g; > + > +SEC("fentry/bpf_fentry_test1") > +int BPF_PROG(sub, int x) > +{ > + return 0; > +} > -- > 2.30.2 >