tools/testing/selftests/bpf/prog_tests/btf_field_iter.c
Source file repositories/reference/linux-study-clean/tools/testing/selftests/bpf/prog_tests/btf_field_iter.c
File Facts
- System
- Linux kernel
- Corpus path
tools/testing/selftests/bpf/prog_tests/btf_field_iter.c- Extension
.c- Size
- 5889 bytes
- Lines
- 162
- Domain
- Support Tooling And Documentation
- Bucket
- tools
- Inferred role
- Support Tooling And Documentation: implementation source
- Status
- source implementation candidate
Why This File Exists
Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
test_progs.hbpf/btf.hbtf_helpers.hbpf/libbpf_internal.h
Detected Declarations
struct field_datafunction test_btf_field_iter
Annotated Snippet
struct field_data {
__u32 ids[5];
const char *strs[5];
} fields[] = {
{ .ids = {}, .strs = {} },
{ .ids = {}, .strs = { "int" } },
{ .ids = {}, .strs = { "int64" } },
{ .ids = { 1 }, .strs = { "" } },
{ .ids = { 2, 1 }, .strs = { "" } },
{ .ids = { 3, 1 }, .strs = { "s1", "f1", "f2" } },
{ .ids = { 1, 5 }, .strs = { "u1", "f1", "f2" } },
{ .ids = {}, .strs = { "e1", "v1", "v2" } },
{ .ids = {}, .strs = { "fw1" } },
{ .ids = { 1 }, .strs = { "t" } },
{ .ids = { 2 }, .strs = { "" } },
{ .ids = { 1 }, .strs = { "" } },
{ .ids = { 3 }, .strs = { "" } },
{ .ids = { 1, 1, 3 }, .strs = { "", "p1", "p2" } },
{ .ids = { 13 }, .strs = { "func" } },
{ .ids = { 1 }, .strs = { "var1" } },
{ .ids = { 3 }, .strs = { "var2" } },
{ .ids = {}, .strs = { "float" } },
{ .ids = { 11 }, .strs = { "decltag" } },
{ .ids = { 6 }, .strs = { "typetag" } },
{ .ids = {}, .strs = { "e64", "eval1", "eval2", "eval3" } },
{ .ids = { 15, 16 }, .strs = { "datasec1" } }
};
/* Fabricate BTF with various types and check BTF field iteration finds types,
* strings expected.
*/
void test_btf_field_iter(void)
{
struct btf *btf = NULL;
int id;
btf = btf__new_empty();
if (!ASSERT_OK_PTR(btf, "empty_btf"))
return;
btf__add_int(btf, "int", 4, BTF_INT_SIGNED); /* [1] int */
btf__add_int(btf, "int64", 8, BTF_INT_SIGNED); /* [2] int64 */
btf__add_ptr(btf, 1); /* [3] int * */
btf__add_array(btf, 1, 2, 3); /* [4] int64[3] */
btf__add_struct(btf, "s1", 12); /* [5] struct s1 { */
btf__add_field(btf, "f1", 3, 0, 0); /* int *f1; */
btf__add_field(btf, "f2", 1, 0, 0); /* int f2; */
/* } */
btf__add_union(btf, "u1", 12); /* [6] union u1 { */
btf__add_field(btf, "f1", 1, 0, 0); /* int f1; */
btf__add_field(btf, "f2", 5, 0, 0); /* struct s1 f2; */
/* } */
btf__add_enum(btf, "e1", 4); /* [7] enum e1 { */
btf__add_enum_value(btf, "v1", 1); /* v1 = 1; */
btf__add_enum_value(btf, "v2", 2); /* v2 = 2; */
/* } */
btf__add_fwd(btf, "fw1", BTF_FWD_STRUCT); /* [8] struct fw1; */
btf__add_typedef(btf, "t", 1); /* [9] typedef int t; */
btf__add_volatile(btf, 2); /* [10] volatile int64; */
btf__add_const(btf, 1); /* [11] const int; */
btf__add_restrict(btf, 3); /* [12] restrict int *; */
btf__add_func_proto(btf, 1); /* [13] int (*)(int p1, int *p2); */
btf__add_func_param(btf, "p1", 1);
btf__add_func_param(btf, "p2", 3);
btf__add_func(btf, "func", BTF_FUNC_GLOBAL, 13);/* [14] int func(int p1, int *p2); */
btf__add_var(btf, "var1", BTF_VAR_STATIC, 1); /* [15] static int var1; */
btf__add_var(btf, "var2", BTF_VAR_STATIC, 3); /* [16] static int *var2; */
btf__add_float(btf, "float", 4); /* [17] float; */
btf__add_decl_tag(btf, "decltag", 11, -1); /* [18] decltag const int; */
btf__add_type_tag(btf, "typetag", 6); /* [19] typetag union u1; */
btf__add_enum64(btf, "e64", 8, true); /* [20] enum { */
btf__add_enum64_value(btf, "eval1", 1000); /* eval1 = 1000, */
btf__add_enum64_value(btf, "eval2", 2000); /* eval2 = 2000, */
btf__add_enum64_value(btf, "eval3", 3000); /* eval3 = 3000 */
/* } */
btf__add_datasec(btf, "datasec1", 12); /* [21] datasec datasec1 */
btf__add_datasec_var_info(btf, 15, 0, 4);
btf__add_datasec_var_info(btf, 16, 4, 8);
VALIDATE_RAW_BTF(
btf,
"[1] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED",
"[2] INT 'int64' size=8 bits_offset=0 nr_bits=64 encoding=SIGNED",
"[3] PTR '(anon)' type_id=1",
"[4] ARRAY '(anon)' type_id=2 index_type_id=1 nr_elems=3",
"[5] STRUCT 's1' size=12 vlen=2\n"
"\t'f1' type_id=3 bits_offset=0\n"
Annotation
- Immediate include surface: `test_progs.h`, `bpf/btf.h`, `btf_helpers.h`, `bpf/libbpf_internal.h`.
- Detected declarations: `struct field_data`, `function test_btf_field_iter`.
- Atlas domain: Support Tooling And Documentation / tools.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.