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