mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-25 05:34:00 +08:00
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
This commit is contained in:
parent
26c79fcbfa
commit
5698a42a73
@ -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();
|
||||
}
|
||||
|
25
tools/testing/selftests/bpf/progs/btf_type_tag.c
Normal file
25
tools/testing/selftests/bpf/progs/btf_type_tag.c
Normal file
@ -0,0 +1,25 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/* Copyright (c) 2021 Facebook */
|
||||
#include "vmlinux.h"
|
||||
#include <bpf/bpf_helpers.h>
|
||||
#include <bpf/bpf_tracing.h>
|
||||
|
||||
#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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user