selftests/bpf: Add a C test for btf_type_tag
authorYonghong Song <yhs@fb.com>
Fri, 12 Nov 2021 01:26:46 +0000 (17:26 -0800)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 12 Nov 2021 01:41:11 +0000 (17:41 -0800)
commit5698a42a73a1d9cb7efd31ca1bf35daa87f5e1a9
tree82458b8a12d311d28114ea9fe319889de4a994fe
parent26c79fcbfa64b18ca1407a3be7ac3442aef51073
selftests/bpf: Add a C test for btf_type_tag

The following is the main btf_type_tag usage in the
C test:
  #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@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20211112012646.1508231-1-yhs@fb.com
tools/testing/selftests/bpf/prog_tests/btf_tag.c
tools/testing/selftests/bpf/progs/btf_type_tag.c [new file with mode: 0644]