xref: /aosp_15_r20/external/libbpf/src/btf.h (revision f7c14bbac8cf49633f2740db462ea43457973ec4)
1*f7c14bbaSAndroid Build Coastguard Worker /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
2*f7c14bbaSAndroid Build Coastguard Worker /* Copyright (c) 2018 Facebook */
3*f7c14bbaSAndroid Build Coastguard Worker /*! \file */
4*f7c14bbaSAndroid Build Coastguard Worker 
5*f7c14bbaSAndroid Build Coastguard Worker #ifndef __LIBBPF_BTF_H
6*f7c14bbaSAndroid Build Coastguard Worker #define __LIBBPF_BTF_H
7*f7c14bbaSAndroid Build Coastguard Worker 
8*f7c14bbaSAndroid Build Coastguard Worker #include <stdarg.h>
9*f7c14bbaSAndroid Build Coastguard Worker #include <stdbool.h>
10*f7c14bbaSAndroid Build Coastguard Worker #include <linux/btf.h>
11*f7c14bbaSAndroid Build Coastguard Worker #include <linux/types.h>
12*f7c14bbaSAndroid Build Coastguard Worker 
13*f7c14bbaSAndroid Build Coastguard Worker #include "libbpf_common.h"
14*f7c14bbaSAndroid Build Coastguard Worker 
15*f7c14bbaSAndroid Build Coastguard Worker #ifdef __cplusplus
16*f7c14bbaSAndroid Build Coastguard Worker extern "C" {
17*f7c14bbaSAndroid Build Coastguard Worker #endif
18*f7c14bbaSAndroid Build Coastguard Worker 
19*f7c14bbaSAndroid Build Coastguard Worker #define BTF_ELF_SEC ".BTF"
20*f7c14bbaSAndroid Build Coastguard Worker #define BTF_EXT_ELF_SEC ".BTF.ext"
21*f7c14bbaSAndroid Build Coastguard Worker #define MAPS_ELF_SEC ".maps"
22*f7c14bbaSAndroid Build Coastguard Worker 
23*f7c14bbaSAndroid Build Coastguard Worker struct btf;
24*f7c14bbaSAndroid Build Coastguard Worker struct btf_ext;
25*f7c14bbaSAndroid Build Coastguard Worker struct btf_type;
26*f7c14bbaSAndroid Build Coastguard Worker 
27*f7c14bbaSAndroid Build Coastguard Worker struct bpf_object;
28*f7c14bbaSAndroid Build Coastguard Worker 
29*f7c14bbaSAndroid Build Coastguard Worker enum btf_endianness {
30*f7c14bbaSAndroid Build Coastguard Worker 	BTF_LITTLE_ENDIAN = 0,
31*f7c14bbaSAndroid Build Coastguard Worker 	BTF_BIG_ENDIAN = 1,
32*f7c14bbaSAndroid Build Coastguard Worker };
33*f7c14bbaSAndroid Build Coastguard Worker 
34*f7c14bbaSAndroid Build Coastguard Worker /**
35*f7c14bbaSAndroid Build Coastguard Worker  * @brief **btf__free()** frees all data of a BTF object
36*f7c14bbaSAndroid Build Coastguard Worker  * @param btf BTF object to free
37*f7c14bbaSAndroid Build Coastguard Worker  */
38*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API void btf__free(struct btf *btf);
39*f7c14bbaSAndroid Build Coastguard Worker 
40*f7c14bbaSAndroid Build Coastguard Worker /**
41*f7c14bbaSAndroid Build Coastguard Worker  * @brief **btf__new()** creates a new instance of a BTF object from the raw
42*f7c14bbaSAndroid Build Coastguard Worker  * bytes of an ELF's BTF section
43*f7c14bbaSAndroid Build Coastguard Worker  * @param data raw bytes
44*f7c14bbaSAndroid Build Coastguard Worker  * @param size number of bytes passed in `data`
45*f7c14bbaSAndroid Build Coastguard Worker  * @return new BTF object instance which has to be eventually freed with
46*f7c14bbaSAndroid Build Coastguard Worker  * **btf__free()**
47*f7c14bbaSAndroid Build Coastguard Worker  *
48*f7c14bbaSAndroid Build Coastguard Worker  * On error, error-code-encoded-as-pointer is returned, not a NULL. To extract
49*f7c14bbaSAndroid Build Coastguard Worker  * error code from such a pointer `libbpf_get_error()` should be used. If
50*f7c14bbaSAndroid Build Coastguard Worker  * `libbpf_set_strict_mode(LIBBPF_STRICT_CLEAN_PTRS)` is enabled, NULL is
51*f7c14bbaSAndroid Build Coastguard Worker  * returned on error instead. In both cases thread-local `errno` variable is
52*f7c14bbaSAndroid Build Coastguard Worker  * always set to error code as well.
53*f7c14bbaSAndroid Build Coastguard Worker  */
54*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API struct btf *btf__new(const void *data, __u32 size);
55*f7c14bbaSAndroid Build Coastguard Worker 
56*f7c14bbaSAndroid Build Coastguard Worker /**
57*f7c14bbaSAndroid Build Coastguard Worker  * @brief **btf__new_split()** create a new instance of a BTF object from the
58*f7c14bbaSAndroid Build Coastguard Worker  * provided raw data bytes. It takes another BTF instance, **base_btf**, which
59*f7c14bbaSAndroid Build Coastguard Worker  * serves as a base BTF, which is extended by types in a newly created BTF
60*f7c14bbaSAndroid Build Coastguard Worker  * instance
61*f7c14bbaSAndroid Build Coastguard Worker  * @param data raw bytes
62*f7c14bbaSAndroid Build Coastguard Worker  * @param size length of raw bytes
63*f7c14bbaSAndroid Build Coastguard Worker  * @param base_btf the base BTF object
64*f7c14bbaSAndroid Build Coastguard Worker  * @return new BTF object instance which has to be eventually freed with
65*f7c14bbaSAndroid Build Coastguard Worker  * **btf__free()**
66*f7c14bbaSAndroid Build Coastguard Worker  *
67*f7c14bbaSAndroid Build Coastguard Worker  * If *base_btf* is NULL, `btf__new_split()` is equivalent to `btf__new()` and
68*f7c14bbaSAndroid Build Coastguard Worker  * creates non-split BTF.
69*f7c14bbaSAndroid Build Coastguard Worker  *
70*f7c14bbaSAndroid Build Coastguard Worker  * On error, error-code-encoded-as-pointer is returned, not a NULL. To extract
71*f7c14bbaSAndroid Build Coastguard Worker  * error code from such a pointer `libbpf_get_error()` should be used. If
72*f7c14bbaSAndroid Build Coastguard Worker  * `libbpf_set_strict_mode(LIBBPF_STRICT_CLEAN_PTRS)` is enabled, NULL is
73*f7c14bbaSAndroid Build Coastguard Worker  * returned on error instead. In both cases thread-local `errno` variable is
74*f7c14bbaSAndroid Build Coastguard Worker  * always set to error code as well.
75*f7c14bbaSAndroid Build Coastguard Worker  */
76*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API struct btf *btf__new_split(const void *data, __u32 size, struct btf *base_btf);
77*f7c14bbaSAndroid Build Coastguard Worker 
78*f7c14bbaSAndroid Build Coastguard Worker /**
79*f7c14bbaSAndroid Build Coastguard Worker  * @brief **btf__new_empty()** creates an empty BTF object.  Use
80*f7c14bbaSAndroid Build Coastguard Worker  * `btf__add_*()` to populate such BTF object.
81*f7c14bbaSAndroid Build Coastguard Worker  * @return new BTF object instance which has to be eventually freed with
82*f7c14bbaSAndroid Build Coastguard Worker  * **btf__free()**
83*f7c14bbaSAndroid Build Coastguard Worker  *
84*f7c14bbaSAndroid Build Coastguard Worker  * On error, error-code-encoded-as-pointer is returned, not a NULL. To extract
85*f7c14bbaSAndroid Build Coastguard Worker  * error code from such a pointer `libbpf_get_error()` should be used. If
86*f7c14bbaSAndroid Build Coastguard Worker  * `libbpf_set_strict_mode(LIBBPF_STRICT_CLEAN_PTRS)` is enabled, NULL is
87*f7c14bbaSAndroid Build Coastguard Worker  * returned on error instead. In both cases thread-local `errno` variable is
88*f7c14bbaSAndroid Build Coastguard Worker  * always set to error code as well.
89*f7c14bbaSAndroid Build Coastguard Worker  */
90*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API struct btf *btf__new_empty(void);
91*f7c14bbaSAndroid Build Coastguard Worker 
92*f7c14bbaSAndroid Build Coastguard Worker /**
93*f7c14bbaSAndroid Build Coastguard Worker  * @brief **btf__new_empty_split()** creates an unpopulated BTF object from an
94*f7c14bbaSAndroid Build Coastguard Worker  * ELF BTF section except with a base BTF on top of which split BTF should be
95*f7c14bbaSAndroid Build Coastguard Worker  * based
96*f7c14bbaSAndroid Build Coastguard Worker  * @return new BTF object instance which has to be eventually freed with
97*f7c14bbaSAndroid Build Coastguard Worker  * **btf__free()**
98*f7c14bbaSAndroid Build Coastguard Worker  *
99*f7c14bbaSAndroid Build Coastguard Worker  * If *base_btf* is NULL, `btf__new_empty_split()` is equivalent to
100*f7c14bbaSAndroid Build Coastguard Worker  * `btf__new_empty()` and creates non-split BTF.
101*f7c14bbaSAndroid Build Coastguard Worker  *
102*f7c14bbaSAndroid Build Coastguard Worker  * On error, error-code-encoded-as-pointer is returned, not a NULL. To extract
103*f7c14bbaSAndroid Build Coastguard Worker  * error code from such a pointer `libbpf_get_error()` should be used. If
104*f7c14bbaSAndroid Build Coastguard Worker  * `libbpf_set_strict_mode(LIBBPF_STRICT_CLEAN_PTRS)` is enabled, NULL is
105*f7c14bbaSAndroid Build Coastguard Worker  * returned on error instead. In both cases thread-local `errno` variable is
106*f7c14bbaSAndroid Build Coastguard Worker  * always set to error code as well.
107*f7c14bbaSAndroid Build Coastguard Worker  */
108*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API struct btf *btf__new_empty_split(struct btf *base_btf);
109*f7c14bbaSAndroid Build Coastguard Worker 
110*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API struct btf *btf__parse(const char *path, struct btf_ext **btf_ext);
111*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API struct btf *btf__parse_split(const char *path, struct btf *base_btf);
112*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API struct btf *btf__parse_elf(const char *path, struct btf_ext **btf_ext);
113*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API struct btf *btf__parse_elf_split(const char *path, struct btf *base_btf);
114*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API struct btf *btf__parse_raw(const char *path);
115*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API struct btf *btf__parse_raw_split(const char *path, struct btf *base_btf);
116*f7c14bbaSAndroid Build Coastguard Worker 
117*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API struct btf *btf__load_vmlinux_btf(void);
118*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API struct btf *btf__load_module_btf(const char *module_name, struct btf *vmlinux_btf);
119*f7c14bbaSAndroid Build Coastguard Worker 
120*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API struct btf *btf__load_from_kernel_by_id(__u32 id);
121*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API struct btf *btf__load_from_kernel_by_id_split(__u32 id, struct btf *base_btf);
122*f7c14bbaSAndroid Build Coastguard Worker 
123*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__load_into_kernel(struct btf *btf);
124*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API __s32 btf__find_by_name(const struct btf *btf,
125*f7c14bbaSAndroid Build Coastguard Worker 				   const char *type_name);
126*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API __s32 btf__find_by_name_kind(const struct btf *btf,
127*f7c14bbaSAndroid Build Coastguard Worker 					const char *type_name, __u32 kind);
128*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API __u32 btf__type_cnt(const struct btf *btf);
129*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API const struct btf *btf__base_btf(const struct btf *btf);
130*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API const struct btf_type *btf__type_by_id(const struct btf *btf,
131*f7c14bbaSAndroid Build Coastguard Worker 						  __u32 id);
132*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API size_t btf__pointer_size(const struct btf *btf);
133*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__set_pointer_size(struct btf *btf, size_t ptr_sz);
134*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API enum btf_endianness btf__endianness(const struct btf *btf);
135*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__set_endianness(struct btf *btf, enum btf_endianness endian);
136*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API __s64 btf__resolve_size(const struct btf *btf, __u32 type_id);
137*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__resolve_type(const struct btf *btf, __u32 type_id);
138*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__align_of(const struct btf *btf, __u32 id);
139*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__fd(const struct btf *btf);
140*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API void btf__set_fd(struct btf *btf, int fd);
141*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API const void *btf__raw_data(const struct btf *btf, __u32 *size);
142*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API const char *btf__name_by_offset(const struct btf *btf, __u32 offset);
143*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API const char *btf__str_by_offset(const struct btf *btf, __u32 offset);
144*f7c14bbaSAndroid Build Coastguard Worker 
145*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API struct btf_ext *btf_ext__new(const __u8 *data, __u32 size);
146*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API void btf_ext__free(struct btf_ext *btf_ext);
147*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API const void *btf_ext__raw_data(const struct btf_ext *btf_ext, __u32 *size);
148*f7c14bbaSAndroid Build Coastguard Worker 
149*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__find_str(struct btf *btf, const char *s);
150*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_str(struct btf *btf, const char *s);
151*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_type(struct btf *btf, const struct btf *src_btf,
152*f7c14bbaSAndroid Build Coastguard Worker 			     const struct btf_type *src_type);
153*f7c14bbaSAndroid Build Coastguard Worker /**
154*f7c14bbaSAndroid Build Coastguard Worker  * @brief **btf__add_btf()** appends all the BTF types from *src_btf* into *btf*
155*f7c14bbaSAndroid Build Coastguard Worker  * @param btf BTF object which all the BTF types and strings are added to
156*f7c14bbaSAndroid Build Coastguard Worker  * @param src_btf BTF object which all BTF types and referenced strings are copied from
157*f7c14bbaSAndroid Build Coastguard Worker  * @return BTF type ID of the first appended BTF type, or negative error code
158*f7c14bbaSAndroid Build Coastguard Worker  *
159*f7c14bbaSAndroid Build Coastguard Worker  * **btf__add_btf()** can be used to simply and efficiently append the entire
160*f7c14bbaSAndroid Build Coastguard Worker  * contents of one BTF object to another one. All the BTF type data is copied
161*f7c14bbaSAndroid Build Coastguard Worker  * over, all referenced type IDs are adjusted by adding a necessary ID offset.
162*f7c14bbaSAndroid Build Coastguard Worker  * Only strings referenced from BTF types are copied over and deduplicated, so
163*f7c14bbaSAndroid Build Coastguard Worker  * if there were some unused strings in *src_btf*, those won't be copied over,
164*f7c14bbaSAndroid Build Coastguard Worker  * which is consistent with the general string deduplication semantics of BTF
165*f7c14bbaSAndroid Build Coastguard Worker  * writing APIs.
166*f7c14bbaSAndroid Build Coastguard Worker  *
167*f7c14bbaSAndroid Build Coastguard Worker  * If any error is encountered during this process, the contents of *btf* is
168*f7c14bbaSAndroid Build Coastguard Worker  * left intact, which means that **btf__add_btf()** follows the transactional
169*f7c14bbaSAndroid Build Coastguard Worker  * semantics and the operation as a whole is all-or-nothing.
170*f7c14bbaSAndroid Build Coastguard Worker  *
171*f7c14bbaSAndroid Build Coastguard Worker  * *src_btf* has to be non-split BTF, as of now copying types from split BTF
172*f7c14bbaSAndroid Build Coastguard Worker  * is not supported and will result in -ENOTSUP error code returned.
173*f7c14bbaSAndroid Build Coastguard Worker  */
174*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_btf(struct btf *btf, const struct btf *src_btf);
175*f7c14bbaSAndroid Build Coastguard Worker 
176*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_int(struct btf *btf, const char *name, size_t byte_sz, int encoding);
177*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_float(struct btf *btf, const char *name, size_t byte_sz);
178*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_ptr(struct btf *btf, int ref_type_id);
179*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_array(struct btf *btf,
180*f7c14bbaSAndroid Build Coastguard Worker 			      int index_type_id, int elem_type_id, __u32 nr_elems);
181*f7c14bbaSAndroid Build Coastguard Worker /* struct/union construction APIs */
182*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_struct(struct btf *btf, const char *name, __u32 sz);
183*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_union(struct btf *btf, const char *name, __u32 sz);
184*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_field(struct btf *btf, const char *name, int field_type_id,
185*f7c14bbaSAndroid Build Coastguard Worker 			      __u32 bit_offset, __u32 bit_size);
186*f7c14bbaSAndroid Build Coastguard Worker 
187*f7c14bbaSAndroid Build Coastguard Worker /* enum construction APIs */
188*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_enum(struct btf *btf, const char *name, __u32 bytes_sz);
189*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_enum_value(struct btf *btf, const char *name, __s64 value);
190*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_enum64(struct btf *btf, const char *name, __u32 bytes_sz, bool is_signed);
191*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_enum64_value(struct btf *btf, const char *name, __u64 value);
192*f7c14bbaSAndroid Build Coastguard Worker 
193*f7c14bbaSAndroid Build Coastguard Worker enum btf_fwd_kind {
194*f7c14bbaSAndroid Build Coastguard Worker 	BTF_FWD_STRUCT = 0,
195*f7c14bbaSAndroid Build Coastguard Worker 	BTF_FWD_UNION = 1,
196*f7c14bbaSAndroid Build Coastguard Worker 	BTF_FWD_ENUM = 2,
197*f7c14bbaSAndroid Build Coastguard Worker };
198*f7c14bbaSAndroid Build Coastguard Worker 
199*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_fwd(struct btf *btf, const char *name, enum btf_fwd_kind fwd_kind);
200*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_typedef(struct btf *btf, const char *name, int ref_type_id);
201*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_volatile(struct btf *btf, int ref_type_id);
202*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_const(struct btf *btf, int ref_type_id);
203*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_restrict(struct btf *btf, int ref_type_id);
204*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_type_tag(struct btf *btf, const char *value, int ref_type_id);
205*f7c14bbaSAndroid Build Coastguard Worker 
206*f7c14bbaSAndroid Build Coastguard Worker /* func and func_proto construction APIs */
207*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_func(struct btf *btf, const char *name,
208*f7c14bbaSAndroid Build Coastguard Worker 			     enum btf_func_linkage linkage, int proto_type_id);
209*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_func_proto(struct btf *btf, int ret_type_id);
210*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_func_param(struct btf *btf, const char *name, int type_id);
211*f7c14bbaSAndroid Build Coastguard Worker 
212*f7c14bbaSAndroid Build Coastguard Worker /* var & datasec construction APIs */
213*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_var(struct btf *btf, const char *name, int linkage, int type_id);
214*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_datasec(struct btf *btf, const char *name, __u32 byte_sz);
215*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_datasec_var_info(struct btf *btf, int var_type_id,
216*f7c14bbaSAndroid Build Coastguard Worker 					 __u32 offset, __u32 byte_sz);
217*f7c14bbaSAndroid Build Coastguard Worker 
218*f7c14bbaSAndroid Build Coastguard Worker /* tag construction API */
219*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__add_decl_tag(struct btf *btf, const char *value, int ref_type_id,
220*f7c14bbaSAndroid Build Coastguard Worker 			    int component_idx);
221*f7c14bbaSAndroid Build Coastguard Worker 
222*f7c14bbaSAndroid Build Coastguard Worker struct btf_dedup_opts {
223*f7c14bbaSAndroid Build Coastguard Worker 	size_t sz;
224*f7c14bbaSAndroid Build Coastguard Worker 	/* optional .BTF.ext info to dedup along the main BTF info */
225*f7c14bbaSAndroid Build Coastguard Worker 	struct btf_ext *btf_ext;
226*f7c14bbaSAndroid Build Coastguard Worker 	/* force hash collisions (used for testing) */
227*f7c14bbaSAndroid Build Coastguard Worker 	bool force_collisions;
228*f7c14bbaSAndroid Build Coastguard Worker 	size_t :0;
229*f7c14bbaSAndroid Build Coastguard Worker };
230*f7c14bbaSAndroid Build Coastguard Worker #define btf_dedup_opts__last_field force_collisions
231*f7c14bbaSAndroid Build Coastguard Worker 
232*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf__dedup(struct btf *btf, const struct btf_dedup_opts *opts);
233*f7c14bbaSAndroid Build Coastguard Worker 
234*f7c14bbaSAndroid Build Coastguard Worker struct btf_dump;
235*f7c14bbaSAndroid Build Coastguard Worker 
236*f7c14bbaSAndroid Build Coastguard Worker struct btf_dump_opts {
237*f7c14bbaSAndroid Build Coastguard Worker 	size_t sz;
238*f7c14bbaSAndroid Build Coastguard Worker };
239*f7c14bbaSAndroid Build Coastguard Worker #define btf_dump_opts__last_field sz
240*f7c14bbaSAndroid Build Coastguard Worker 
241*f7c14bbaSAndroid Build Coastguard Worker typedef void (*btf_dump_printf_fn_t)(void *ctx, const char *fmt, va_list args);
242*f7c14bbaSAndroid Build Coastguard Worker 
243*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API struct btf_dump *btf_dump__new(const struct btf *btf,
244*f7c14bbaSAndroid Build Coastguard Worker 					  btf_dump_printf_fn_t printf_fn,
245*f7c14bbaSAndroid Build Coastguard Worker 					  void *ctx,
246*f7c14bbaSAndroid Build Coastguard Worker 					  const struct btf_dump_opts *opts);
247*f7c14bbaSAndroid Build Coastguard Worker 
248*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API void btf_dump__free(struct btf_dump *d);
249*f7c14bbaSAndroid Build Coastguard Worker 
250*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int btf_dump__dump_type(struct btf_dump *d, __u32 id);
251*f7c14bbaSAndroid Build Coastguard Worker 
252*f7c14bbaSAndroid Build Coastguard Worker struct btf_dump_emit_type_decl_opts {
253*f7c14bbaSAndroid Build Coastguard Worker 	/* size of this struct, for forward/backward compatiblity */
254*f7c14bbaSAndroid Build Coastguard Worker 	size_t sz;
255*f7c14bbaSAndroid Build Coastguard Worker 	/* optional field name for type declaration, e.g.:
256*f7c14bbaSAndroid Build Coastguard Worker 	 * - struct my_struct <FNAME>
257*f7c14bbaSAndroid Build Coastguard Worker 	 * - void (*<FNAME>)(int)
258*f7c14bbaSAndroid Build Coastguard Worker 	 * - char (*<FNAME>)[123]
259*f7c14bbaSAndroid Build Coastguard Worker 	 */
260*f7c14bbaSAndroid Build Coastguard Worker 	const char *field_name;
261*f7c14bbaSAndroid Build Coastguard Worker 	/* extra indentation level (in number of tabs) to emit for multi-line
262*f7c14bbaSAndroid Build Coastguard Worker 	 * type declarations (e.g., anonymous struct); applies for lines
263*f7c14bbaSAndroid Build Coastguard Worker 	 * starting from the second one (first line is assumed to have
264*f7c14bbaSAndroid Build Coastguard Worker 	 * necessary indentation already
265*f7c14bbaSAndroid Build Coastguard Worker 	 */
266*f7c14bbaSAndroid Build Coastguard Worker 	int indent_level;
267*f7c14bbaSAndroid Build Coastguard Worker 	/* strip all the const/volatile/restrict mods */
268*f7c14bbaSAndroid Build Coastguard Worker 	bool strip_mods;
269*f7c14bbaSAndroid Build Coastguard Worker 	size_t :0;
270*f7c14bbaSAndroid Build Coastguard Worker };
271*f7c14bbaSAndroid Build Coastguard Worker #define btf_dump_emit_type_decl_opts__last_field strip_mods
272*f7c14bbaSAndroid Build Coastguard Worker 
273*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int
274*f7c14bbaSAndroid Build Coastguard Worker btf_dump__emit_type_decl(struct btf_dump *d, __u32 id,
275*f7c14bbaSAndroid Build Coastguard Worker 			 const struct btf_dump_emit_type_decl_opts *opts);
276*f7c14bbaSAndroid Build Coastguard Worker 
277*f7c14bbaSAndroid Build Coastguard Worker 
278*f7c14bbaSAndroid Build Coastguard Worker struct btf_dump_type_data_opts {
279*f7c14bbaSAndroid Build Coastguard Worker 	/* size of this struct, for forward/backward compatibility */
280*f7c14bbaSAndroid Build Coastguard Worker 	size_t sz;
281*f7c14bbaSAndroid Build Coastguard Worker 	const char *indent_str;
282*f7c14bbaSAndroid Build Coastguard Worker 	int indent_level;
283*f7c14bbaSAndroid Build Coastguard Worker 	/* below match "show" flags for bpf_show_snprintf() */
284*f7c14bbaSAndroid Build Coastguard Worker 	bool compact;		/* no newlines/indentation */
285*f7c14bbaSAndroid Build Coastguard Worker 	bool skip_names;	/* skip member/type names */
286*f7c14bbaSAndroid Build Coastguard Worker 	bool emit_zeroes;	/* show 0-valued fields */
287*f7c14bbaSAndroid Build Coastguard Worker 	size_t :0;
288*f7c14bbaSAndroid Build Coastguard Worker };
289*f7c14bbaSAndroid Build Coastguard Worker #define btf_dump_type_data_opts__last_field emit_zeroes
290*f7c14bbaSAndroid Build Coastguard Worker 
291*f7c14bbaSAndroid Build Coastguard Worker LIBBPF_API int
292*f7c14bbaSAndroid Build Coastguard Worker btf_dump__dump_type_data(struct btf_dump *d, __u32 id,
293*f7c14bbaSAndroid Build Coastguard Worker 			 const void *data, size_t data_sz,
294*f7c14bbaSAndroid Build Coastguard Worker 			 const struct btf_dump_type_data_opts *opts);
295*f7c14bbaSAndroid Build Coastguard Worker 
296*f7c14bbaSAndroid Build Coastguard Worker /*
297*f7c14bbaSAndroid Build Coastguard Worker  * A set of helpers for easier BTF types handling.
298*f7c14bbaSAndroid Build Coastguard Worker  *
299*f7c14bbaSAndroid Build Coastguard Worker  * The inline functions below rely on constants from the kernel headers which
300*f7c14bbaSAndroid Build Coastguard Worker  * may not be available for applications including this header file. To avoid
301*f7c14bbaSAndroid Build Coastguard Worker  * compilation errors, we define all the constants here that were added after
302*f7c14bbaSAndroid Build Coastguard Worker  * the initial introduction of the BTF_KIND* constants.
303*f7c14bbaSAndroid Build Coastguard Worker  */
304*f7c14bbaSAndroid Build Coastguard Worker #ifndef BTF_KIND_FUNC
305*f7c14bbaSAndroid Build Coastguard Worker #define BTF_KIND_FUNC		12	/* Function	*/
306*f7c14bbaSAndroid Build Coastguard Worker #define BTF_KIND_FUNC_PROTO	13	/* Function Proto	*/
307*f7c14bbaSAndroid Build Coastguard Worker #endif
308*f7c14bbaSAndroid Build Coastguard Worker #ifndef BTF_KIND_VAR
309*f7c14bbaSAndroid Build Coastguard Worker #define BTF_KIND_VAR		14	/* Variable	*/
310*f7c14bbaSAndroid Build Coastguard Worker #define BTF_KIND_DATASEC	15	/* Section	*/
311*f7c14bbaSAndroid Build Coastguard Worker #endif
312*f7c14bbaSAndroid Build Coastguard Worker #ifndef BTF_KIND_FLOAT
313*f7c14bbaSAndroid Build Coastguard Worker #define BTF_KIND_FLOAT		16	/* Floating point	*/
314*f7c14bbaSAndroid Build Coastguard Worker #endif
315*f7c14bbaSAndroid Build Coastguard Worker /* The kernel header switched to enums, so the following were never #defined */
316*f7c14bbaSAndroid Build Coastguard Worker #define BTF_KIND_DECL_TAG	17	/* Decl Tag */
317*f7c14bbaSAndroid Build Coastguard Worker #define BTF_KIND_TYPE_TAG	18	/* Type Tag */
318*f7c14bbaSAndroid Build Coastguard Worker #define BTF_KIND_ENUM64		19	/* Enum for up-to 64bit values */
319*f7c14bbaSAndroid Build Coastguard Worker 
btf_kind(const struct btf_type * t)320*f7c14bbaSAndroid Build Coastguard Worker static inline __u16 btf_kind(const struct btf_type *t)
321*f7c14bbaSAndroid Build Coastguard Worker {
322*f7c14bbaSAndroid Build Coastguard Worker 	return BTF_INFO_KIND(t->info);
323*f7c14bbaSAndroid Build Coastguard Worker }
324*f7c14bbaSAndroid Build Coastguard Worker 
btf_vlen(const struct btf_type * t)325*f7c14bbaSAndroid Build Coastguard Worker static inline __u16 btf_vlen(const struct btf_type *t)
326*f7c14bbaSAndroid Build Coastguard Worker {
327*f7c14bbaSAndroid Build Coastguard Worker 	return BTF_INFO_VLEN(t->info);
328*f7c14bbaSAndroid Build Coastguard Worker }
329*f7c14bbaSAndroid Build Coastguard Worker 
btf_kflag(const struct btf_type * t)330*f7c14bbaSAndroid Build Coastguard Worker static inline bool btf_kflag(const struct btf_type *t)
331*f7c14bbaSAndroid Build Coastguard Worker {
332*f7c14bbaSAndroid Build Coastguard Worker 	return BTF_INFO_KFLAG(t->info);
333*f7c14bbaSAndroid Build Coastguard Worker }
334*f7c14bbaSAndroid Build Coastguard Worker 
btf_is_void(const struct btf_type * t)335*f7c14bbaSAndroid Build Coastguard Worker static inline bool btf_is_void(const struct btf_type *t)
336*f7c14bbaSAndroid Build Coastguard Worker {
337*f7c14bbaSAndroid Build Coastguard Worker 	return btf_kind(t) == BTF_KIND_UNKN;
338*f7c14bbaSAndroid Build Coastguard Worker }
339*f7c14bbaSAndroid Build Coastguard Worker 
btf_is_int(const struct btf_type * t)340*f7c14bbaSAndroid Build Coastguard Worker static inline bool btf_is_int(const struct btf_type *t)
341*f7c14bbaSAndroid Build Coastguard Worker {
342*f7c14bbaSAndroid Build Coastguard Worker 	return btf_kind(t) == BTF_KIND_INT;
343*f7c14bbaSAndroid Build Coastguard Worker }
344*f7c14bbaSAndroid Build Coastguard Worker 
btf_is_ptr(const struct btf_type * t)345*f7c14bbaSAndroid Build Coastguard Worker static inline bool btf_is_ptr(const struct btf_type *t)
346*f7c14bbaSAndroid Build Coastguard Worker {
347*f7c14bbaSAndroid Build Coastguard Worker 	return btf_kind(t) == BTF_KIND_PTR;
348*f7c14bbaSAndroid Build Coastguard Worker }
349*f7c14bbaSAndroid Build Coastguard Worker 
btf_is_array(const struct btf_type * t)350*f7c14bbaSAndroid Build Coastguard Worker static inline bool btf_is_array(const struct btf_type *t)
351*f7c14bbaSAndroid Build Coastguard Worker {
352*f7c14bbaSAndroid Build Coastguard Worker 	return btf_kind(t) == BTF_KIND_ARRAY;
353*f7c14bbaSAndroid Build Coastguard Worker }
354*f7c14bbaSAndroid Build Coastguard Worker 
btf_is_struct(const struct btf_type * t)355*f7c14bbaSAndroid Build Coastguard Worker static inline bool btf_is_struct(const struct btf_type *t)
356*f7c14bbaSAndroid Build Coastguard Worker {
357*f7c14bbaSAndroid Build Coastguard Worker 	return btf_kind(t) == BTF_KIND_STRUCT;
358*f7c14bbaSAndroid Build Coastguard Worker }
359*f7c14bbaSAndroid Build Coastguard Worker 
btf_is_union(const struct btf_type * t)360*f7c14bbaSAndroid Build Coastguard Worker static inline bool btf_is_union(const struct btf_type *t)
361*f7c14bbaSAndroid Build Coastguard Worker {
362*f7c14bbaSAndroid Build Coastguard Worker 	return btf_kind(t) == BTF_KIND_UNION;
363*f7c14bbaSAndroid Build Coastguard Worker }
364*f7c14bbaSAndroid Build Coastguard Worker 
btf_is_composite(const struct btf_type * t)365*f7c14bbaSAndroid Build Coastguard Worker static inline bool btf_is_composite(const struct btf_type *t)
366*f7c14bbaSAndroid Build Coastguard Worker {
367*f7c14bbaSAndroid Build Coastguard Worker 	__u16 kind = btf_kind(t);
368*f7c14bbaSAndroid Build Coastguard Worker 
369*f7c14bbaSAndroid Build Coastguard Worker 	return kind == BTF_KIND_STRUCT || kind == BTF_KIND_UNION;
370*f7c14bbaSAndroid Build Coastguard Worker }
371*f7c14bbaSAndroid Build Coastguard Worker 
btf_is_enum(const struct btf_type * t)372*f7c14bbaSAndroid Build Coastguard Worker static inline bool btf_is_enum(const struct btf_type *t)
373*f7c14bbaSAndroid Build Coastguard Worker {
374*f7c14bbaSAndroid Build Coastguard Worker 	return btf_kind(t) == BTF_KIND_ENUM;
375*f7c14bbaSAndroid Build Coastguard Worker }
376*f7c14bbaSAndroid Build Coastguard Worker 
btf_is_enum64(const struct btf_type * t)377*f7c14bbaSAndroid Build Coastguard Worker static inline bool btf_is_enum64(const struct btf_type *t)
378*f7c14bbaSAndroid Build Coastguard Worker {
379*f7c14bbaSAndroid Build Coastguard Worker 	return btf_kind(t) == BTF_KIND_ENUM64;
380*f7c14bbaSAndroid Build Coastguard Worker }
381*f7c14bbaSAndroid Build Coastguard Worker 
btf_is_fwd(const struct btf_type * t)382*f7c14bbaSAndroid Build Coastguard Worker static inline bool btf_is_fwd(const struct btf_type *t)
383*f7c14bbaSAndroid Build Coastguard Worker {
384*f7c14bbaSAndroid Build Coastguard Worker 	return btf_kind(t) == BTF_KIND_FWD;
385*f7c14bbaSAndroid Build Coastguard Worker }
386*f7c14bbaSAndroid Build Coastguard Worker 
btf_is_typedef(const struct btf_type * t)387*f7c14bbaSAndroid Build Coastguard Worker static inline bool btf_is_typedef(const struct btf_type *t)
388*f7c14bbaSAndroid Build Coastguard Worker {
389*f7c14bbaSAndroid Build Coastguard Worker 	return btf_kind(t) == BTF_KIND_TYPEDEF;
390*f7c14bbaSAndroid Build Coastguard Worker }
391*f7c14bbaSAndroid Build Coastguard Worker 
btf_is_volatile(const struct btf_type * t)392*f7c14bbaSAndroid Build Coastguard Worker static inline bool btf_is_volatile(const struct btf_type *t)
393*f7c14bbaSAndroid Build Coastguard Worker {
394*f7c14bbaSAndroid Build Coastguard Worker 	return btf_kind(t) == BTF_KIND_VOLATILE;
395*f7c14bbaSAndroid Build Coastguard Worker }
396*f7c14bbaSAndroid Build Coastguard Worker 
btf_is_const(const struct btf_type * t)397*f7c14bbaSAndroid Build Coastguard Worker static inline bool btf_is_const(const struct btf_type *t)
398*f7c14bbaSAndroid Build Coastguard Worker {
399*f7c14bbaSAndroid Build Coastguard Worker 	return btf_kind(t) == BTF_KIND_CONST;
400*f7c14bbaSAndroid Build Coastguard Worker }
401*f7c14bbaSAndroid Build Coastguard Worker 
btf_is_restrict(const struct btf_type * t)402*f7c14bbaSAndroid Build Coastguard Worker static inline bool btf_is_restrict(const struct btf_type *t)
403*f7c14bbaSAndroid Build Coastguard Worker {
404*f7c14bbaSAndroid Build Coastguard Worker 	return btf_kind(t) == BTF_KIND_RESTRICT;
405*f7c14bbaSAndroid Build Coastguard Worker }
406*f7c14bbaSAndroid Build Coastguard Worker 
btf_is_mod(const struct btf_type * t)407*f7c14bbaSAndroid Build Coastguard Worker static inline bool btf_is_mod(const struct btf_type *t)
408*f7c14bbaSAndroid Build Coastguard Worker {
409*f7c14bbaSAndroid Build Coastguard Worker 	__u16 kind = btf_kind(t);
410*f7c14bbaSAndroid Build Coastguard Worker 
411*f7c14bbaSAndroid Build Coastguard Worker 	return kind == BTF_KIND_VOLATILE ||
412*f7c14bbaSAndroid Build Coastguard Worker 	       kind == BTF_KIND_CONST ||
413*f7c14bbaSAndroid Build Coastguard Worker 	       kind == BTF_KIND_RESTRICT ||
414*f7c14bbaSAndroid Build Coastguard Worker 	       kind == BTF_KIND_TYPE_TAG;
415*f7c14bbaSAndroid Build Coastguard Worker }
416*f7c14bbaSAndroid Build Coastguard Worker 
btf_is_func(const struct btf_type * t)417*f7c14bbaSAndroid Build Coastguard Worker static inline bool btf_is_func(const struct btf_type *t)
418*f7c14bbaSAndroid Build Coastguard Worker {
419*f7c14bbaSAndroid Build Coastguard Worker 	return btf_kind(t) == BTF_KIND_FUNC;
420*f7c14bbaSAndroid Build Coastguard Worker }
421*f7c14bbaSAndroid Build Coastguard Worker 
btf_is_func_proto(const struct btf_type * t)422*f7c14bbaSAndroid Build Coastguard Worker static inline bool btf_is_func_proto(const struct btf_type *t)
423*f7c14bbaSAndroid Build Coastguard Worker {
424*f7c14bbaSAndroid Build Coastguard Worker 	return btf_kind(t) == BTF_KIND_FUNC_PROTO;
425*f7c14bbaSAndroid Build Coastguard Worker }
426*f7c14bbaSAndroid Build Coastguard Worker 
btf_is_var(const struct btf_type * t)427*f7c14bbaSAndroid Build Coastguard Worker static inline bool btf_is_var(const struct btf_type *t)
428*f7c14bbaSAndroid Build Coastguard Worker {
429*f7c14bbaSAndroid Build Coastguard Worker 	return btf_kind(t) == BTF_KIND_VAR;
430*f7c14bbaSAndroid Build Coastguard Worker }
431*f7c14bbaSAndroid Build Coastguard Worker 
btf_is_datasec(const struct btf_type * t)432*f7c14bbaSAndroid Build Coastguard Worker static inline bool btf_is_datasec(const struct btf_type *t)
433*f7c14bbaSAndroid Build Coastguard Worker {
434*f7c14bbaSAndroid Build Coastguard Worker 	return btf_kind(t) == BTF_KIND_DATASEC;
435*f7c14bbaSAndroid Build Coastguard Worker }
436*f7c14bbaSAndroid Build Coastguard Worker 
btf_is_float(const struct btf_type * t)437*f7c14bbaSAndroid Build Coastguard Worker static inline bool btf_is_float(const struct btf_type *t)
438*f7c14bbaSAndroid Build Coastguard Worker {
439*f7c14bbaSAndroid Build Coastguard Worker 	return btf_kind(t) == BTF_KIND_FLOAT;
440*f7c14bbaSAndroid Build Coastguard Worker }
441*f7c14bbaSAndroid Build Coastguard Worker 
btf_is_decl_tag(const struct btf_type * t)442*f7c14bbaSAndroid Build Coastguard Worker static inline bool btf_is_decl_tag(const struct btf_type *t)
443*f7c14bbaSAndroid Build Coastguard Worker {
444*f7c14bbaSAndroid Build Coastguard Worker 	return btf_kind(t) == BTF_KIND_DECL_TAG;
445*f7c14bbaSAndroid Build Coastguard Worker }
446*f7c14bbaSAndroid Build Coastguard Worker 
btf_is_type_tag(const struct btf_type * t)447*f7c14bbaSAndroid Build Coastguard Worker static inline bool btf_is_type_tag(const struct btf_type *t)
448*f7c14bbaSAndroid Build Coastguard Worker {
449*f7c14bbaSAndroid Build Coastguard Worker 	return btf_kind(t) == BTF_KIND_TYPE_TAG;
450*f7c14bbaSAndroid Build Coastguard Worker }
451*f7c14bbaSAndroid Build Coastguard Worker 
btf_is_any_enum(const struct btf_type * t)452*f7c14bbaSAndroid Build Coastguard Worker static inline bool btf_is_any_enum(const struct btf_type *t)
453*f7c14bbaSAndroid Build Coastguard Worker {
454*f7c14bbaSAndroid Build Coastguard Worker 	return btf_is_enum(t) || btf_is_enum64(t);
455*f7c14bbaSAndroid Build Coastguard Worker }
456*f7c14bbaSAndroid Build Coastguard Worker 
btf_kind_core_compat(const struct btf_type * t1,const struct btf_type * t2)457*f7c14bbaSAndroid Build Coastguard Worker static inline bool btf_kind_core_compat(const struct btf_type *t1,
458*f7c14bbaSAndroid Build Coastguard Worker 					const struct btf_type *t2)
459*f7c14bbaSAndroid Build Coastguard Worker {
460*f7c14bbaSAndroid Build Coastguard Worker 	return btf_kind(t1) == btf_kind(t2) ||
461*f7c14bbaSAndroid Build Coastguard Worker 	       (btf_is_any_enum(t1) && btf_is_any_enum(t2));
462*f7c14bbaSAndroid Build Coastguard Worker }
463*f7c14bbaSAndroid Build Coastguard Worker 
btf_int_encoding(const struct btf_type * t)464*f7c14bbaSAndroid Build Coastguard Worker static inline __u8 btf_int_encoding(const struct btf_type *t)
465*f7c14bbaSAndroid Build Coastguard Worker {
466*f7c14bbaSAndroid Build Coastguard Worker 	return BTF_INT_ENCODING(*(__u32 *)(t + 1));
467*f7c14bbaSAndroid Build Coastguard Worker }
468*f7c14bbaSAndroid Build Coastguard Worker 
btf_int_offset(const struct btf_type * t)469*f7c14bbaSAndroid Build Coastguard Worker static inline __u8 btf_int_offset(const struct btf_type *t)
470*f7c14bbaSAndroid Build Coastguard Worker {
471*f7c14bbaSAndroid Build Coastguard Worker 	return BTF_INT_OFFSET(*(__u32 *)(t + 1));
472*f7c14bbaSAndroid Build Coastguard Worker }
473*f7c14bbaSAndroid Build Coastguard Worker 
btf_int_bits(const struct btf_type * t)474*f7c14bbaSAndroid Build Coastguard Worker static inline __u8 btf_int_bits(const struct btf_type *t)
475*f7c14bbaSAndroid Build Coastguard Worker {
476*f7c14bbaSAndroid Build Coastguard Worker 	return BTF_INT_BITS(*(__u32 *)(t + 1));
477*f7c14bbaSAndroid Build Coastguard Worker }
478*f7c14bbaSAndroid Build Coastguard Worker 
btf_array(const struct btf_type * t)479*f7c14bbaSAndroid Build Coastguard Worker static inline struct btf_array *btf_array(const struct btf_type *t)
480*f7c14bbaSAndroid Build Coastguard Worker {
481*f7c14bbaSAndroid Build Coastguard Worker 	return (struct btf_array *)(t + 1);
482*f7c14bbaSAndroid Build Coastguard Worker }
483*f7c14bbaSAndroid Build Coastguard Worker 
btf_enum(const struct btf_type * t)484*f7c14bbaSAndroid Build Coastguard Worker static inline struct btf_enum *btf_enum(const struct btf_type *t)
485*f7c14bbaSAndroid Build Coastguard Worker {
486*f7c14bbaSAndroid Build Coastguard Worker 	return (struct btf_enum *)(t + 1);
487*f7c14bbaSAndroid Build Coastguard Worker }
488*f7c14bbaSAndroid Build Coastguard Worker 
489*f7c14bbaSAndroid Build Coastguard Worker struct btf_enum64;
490*f7c14bbaSAndroid Build Coastguard Worker 
btf_enum64(const struct btf_type * t)491*f7c14bbaSAndroid Build Coastguard Worker static inline struct btf_enum64 *btf_enum64(const struct btf_type *t)
492*f7c14bbaSAndroid Build Coastguard Worker {
493*f7c14bbaSAndroid Build Coastguard Worker 	return (struct btf_enum64 *)(t + 1);
494*f7c14bbaSAndroid Build Coastguard Worker }
495*f7c14bbaSAndroid Build Coastguard Worker 
btf_enum64_value(const struct btf_enum64 * e)496*f7c14bbaSAndroid Build Coastguard Worker static inline __u64 btf_enum64_value(const struct btf_enum64 *e)
497*f7c14bbaSAndroid Build Coastguard Worker {
498*f7c14bbaSAndroid Build Coastguard Worker 	/* struct btf_enum64 is introduced in Linux 6.0, which is very
499*f7c14bbaSAndroid Build Coastguard Worker 	 * bleeding-edge. Here we are avoiding relying on struct btf_enum64
500*f7c14bbaSAndroid Build Coastguard Worker 	 * definition coming from kernel UAPI headers to support wider range
501*f7c14bbaSAndroid Build Coastguard Worker 	 * of system-wide kernel headers.
502*f7c14bbaSAndroid Build Coastguard Worker 	 *
503*f7c14bbaSAndroid Build Coastguard Worker 	 * Given this header can be also included from C++ applications, that
504*f7c14bbaSAndroid Build Coastguard Worker 	 * further restricts C tricks we can use (like using compatible
505*f7c14bbaSAndroid Build Coastguard Worker 	 * anonymous struct). So just treat struct btf_enum64 as
506*f7c14bbaSAndroid Build Coastguard Worker 	 * a three-element array of u32 and access second (lo32) and third
507*f7c14bbaSAndroid Build Coastguard Worker 	 * (hi32) elements directly.
508*f7c14bbaSAndroid Build Coastguard Worker 	 *
509*f7c14bbaSAndroid Build Coastguard Worker 	 * For reference, here is a struct btf_enum64 definition:
510*f7c14bbaSAndroid Build Coastguard Worker 	 *
511*f7c14bbaSAndroid Build Coastguard Worker 	 * const struct btf_enum64 {
512*f7c14bbaSAndroid Build Coastguard Worker 	 *	__u32	name_off;
513*f7c14bbaSAndroid Build Coastguard Worker 	 *	__u32	val_lo32;
514*f7c14bbaSAndroid Build Coastguard Worker 	 *	__u32	val_hi32;
515*f7c14bbaSAndroid Build Coastguard Worker 	 * };
516*f7c14bbaSAndroid Build Coastguard Worker 	 */
517*f7c14bbaSAndroid Build Coastguard Worker 	const __u32 *e64 = (const __u32 *)e;
518*f7c14bbaSAndroid Build Coastguard Worker 
519*f7c14bbaSAndroid Build Coastguard Worker 	return ((__u64)e64[2] << 32) | e64[1];
520*f7c14bbaSAndroid Build Coastguard Worker }
521*f7c14bbaSAndroid Build Coastguard Worker 
btf_members(const struct btf_type * t)522*f7c14bbaSAndroid Build Coastguard Worker static inline struct btf_member *btf_members(const struct btf_type *t)
523*f7c14bbaSAndroid Build Coastguard Worker {
524*f7c14bbaSAndroid Build Coastguard Worker 	return (struct btf_member *)(t + 1);
525*f7c14bbaSAndroid Build Coastguard Worker }
526*f7c14bbaSAndroid Build Coastguard Worker 
527*f7c14bbaSAndroid Build Coastguard Worker /* Get bit offset of a member with specified index. */
btf_member_bit_offset(const struct btf_type * t,__u32 member_idx)528*f7c14bbaSAndroid Build Coastguard Worker static inline __u32 btf_member_bit_offset(const struct btf_type *t,
529*f7c14bbaSAndroid Build Coastguard Worker 					  __u32 member_idx)
530*f7c14bbaSAndroid Build Coastguard Worker {
531*f7c14bbaSAndroid Build Coastguard Worker 	const struct btf_member *m = btf_members(t) + member_idx;
532*f7c14bbaSAndroid Build Coastguard Worker 	bool kflag = btf_kflag(t);
533*f7c14bbaSAndroid Build Coastguard Worker 
534*f7c14bbaSAndroid Build Coastguard Worker 	return kflag ? BTF_MEMBER_BIT_OFFSET(m->offset) : m->offset;
535*f7c14bbaSAndroid Build Coastguard Worker }
536*f7c14bbaSAndroid Build Coastguard Worker /*
537*f7c14bbaSAndroid Build Coastguard Worker  * Get bitfield size of a member, assuming t is BTF_KIND_STRUCT or
538*f7c14bbaSAndroid Build Coastguard Worker  * BTF_KIND_UNION. If member is not a bitfield, zero is returned.
539*f7c14bbaSAndroid Build Coastguard Worker  */
btf_member_bitfield_size(const struct btf_type * t,__u32 member_idx)540*f7c14bbaSAndroid Build Coastguard Worker static inline __u32 btf_member_bitfield_size(const struct btf_type *t,
541*f7c14bbaSAndroid Build Coastguard Worker 					     __u32 member_idx)
542*f7c14bbaSAndroid Build Coastguard Worker {
543*f7c14bbaSAndroid Build Coastguard Worker 	const struct btf_member *m = btf_members(t) + member_idx;
544*f7c14bbaSAndroid Build Coastguard Worker 	bool kflag = btf_kflag(t);
545*f7c14bbaSAndroid Build Coastguard Worker 
546*f7c14bbaSAndroid Build Coastguard Worker 	return kflag ? BTF_MEMBER_BITFIELD_SIZE(m->offset) : 0;
547*f7c14bbaSAndroid Build Coastguard Worker }
548*f7c14bbaSAndroid Build Coastguard Worker 
btf_params(const struct btf_type * t)549*f7c14bbaSAndroid Build Coastguard Worker static inline struct btf_param *btf_params(const struct btf_type *t)
550*f7c14bbaSAndroid Build Coastguard Worker {
551*f7c14bbaSAndroid Build Coastguard Worker 	return (struct btf_param *)(t + 1);
552*f7c14bbaSAndroid Build Coastguard Worker }
553*f7c14bbaSAndroid Build Coastguard Worker 
btf_var(const struct btf_type * t)554*f7c14bbaSAndroid Build Coastguard Worker static inline struct btf_var *btf_var(const struct btf_type *t)
555*f7c14bbaSAndroid Build Coastguard Worker {
556*f7c14bbaSAndroid Build Coastguard Worker 	return (struct btf_var *)(t + 1);
557*f7c14bbaSAndroid Build Coastguard Worker }
558*f7c14bbaSAndroid Build Coastguard Worker 
559*f7c14bbaSAndroid Build Coastguard Worker static inline struct btf_var_secinfo *
btf_var_secinfos(const struct btf_type * t)560*f7c14bbaSAndroid Build Coastguard Worker btf_var_secinfos(const struct btf_type *t)
561*f7c14bbaSAndroid Build Coastguard Worker {
562*f7c14bbaSAndroid Build Coastguard Worker 	return (struct btf_var_secinfo *)(t + 1);
563*f7c14bbaSAndroid Build Coastguard Worker }
564*f7c14bbaSAndroid Build Coastguard Worker 
565*f7c14bbaSAndroid Build Coastguard Worker struct btf_decl_tag;
btf_decl_tag(const struct btf_type * t)566*f7c14bbaSAndroid Build Coastguard Worker static inline struct btf_decl_tag *btf_decl_tag(const struct btf_type *t)
567*f7c14bbaSAndroid Build Coastguard Worker {
568*f7c14bbaSAndroid Build Coastguard Worker 	return (struct btf_decl_tag *)(t + 1);
569*f7c14bbaSAndroid Build Coastguard Worker }
570*f7c14bbaSAndroid Build Coastguard Worker 
571*f7c14bbaSAndroid Build Coastguard Worker #ifdef __cplusplus
572*f7c14bbaSAndroid Build Coastguard Worker } /* extern "C" */
573*f7c14bbaSAndroid Build Coastguard Worker #endif
574*f7c14bbaSAndroid Build Coastguard Worker 
575*f7c14bbaSAndroid Build Coastguard Worker #endif /* __LIBBPF_BTF_H */
576