Coverage Report

Created: 2026-09-03 06:40

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libbpf/src/btf.h
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
57.4k
#define BTF_ELF_SEC ".BTF"
20
52.8k
#define BTF_EXT_ELF_SEC ".BTF.ext"
21
0
#define BTF_BASE_ELF_SEC ".BTF.base"
22
56.5k
#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
struct btf_new_opts {
113
  size_t sz;
114
  struct btf *base_btf; /* optional base BTF */
115
  bool add_layout;  /* add BTF layout information */
116
  size_t:0;
117
};
118
#define btf_new_opts__last_field add_layout
119
120
/**
121
 * @brief **btf__new_empty_opts()** creates an unpopulated BTF object with
122
 * optional *base_btf* and BTF kind layout description if *add_layout*
123
 * is set
124
 * @return new BTF object instance which has to be eventually freed with
125
 * **btf__free()**
126
 *
127
 * On error, NULL is returned and the thread-local `errno` variable is
128
 * set to the error code.
129
 */
130
LIBBPF_API struct btf *btf__new_empty_opts(struct btf_new_opts *opts);
131
132
/**
133
 * @brief **btf__distill_base()** creates new versions of the split BTF
134
 * *src_btf* and its base BTF. The new base BTF will only contain the types
135
 * needed to improve robustness of the split BTF to small changes in base BTF.
136
 * When that split BTF is loaded against a (possibly changed) base, this
137
 * distilled base BTF will help update references to that (possibly changed)
138
 * base BTF.
139
 * @param src_btf source split BTF object
140
 * @param new_base_btf pointer to where the new base BTF object pointer will be stored
141
 * @param new_split_btf pointer to where the new split BTF object pointer will be stored
142
 * @return 0 on success; negative error code, otherwise
143
 *
144
 * Both the new split and its associated new base BTF must be freed by
145
 * the caller.
146
 *
147
 * If successful, 0 is returned and **new_base_btf** and **new_split_btf**
148
 * will point at new base/split BTF. Both the new split and its associated
149
 * new base BTF must be freed by the caller.
150
 *
151
 * A negative value is returned on error and the thread-local `errno` variable
152
 * is set to the error code as well.
153
 */
154
LIBBPF_API int btf__distill_base(const struct btf *src_btf, struct btf **new_base_btf,
155
         struct btf **new_split_btf);
156
157
LIBBPF_API struct btf *btf__parse(const char *path, struct btf_ext **btf_ext);
158
LIBBPF_API struct btf *btf__parse_split(const char *path, struct btf *base_btf);
159
LIBBPF_API struct btf *btf__parse_elf(const char *path, struct btf_ext **btf_ext);
160
LIBBPF_API struct btf *btf__parse_elf_split(const char *path, struct btf *base_btf);
161
LIBBPF_API struct btf *btf__parse_raw(const char *path);
162
LIBBPF_API struct btf *btf__parse_raw_split(const char *path, struct btf *base_btf);
163
164
LIBBPF_API struct btf *btf__load_vmlinux_btf(void);
165
LIBBPF_API struct btf *btf__load_module_btf(const char *module_name, struct btf *vmlinux_btf);
166
167
LIBBPF_API struct btf *btf__load_from_kernel_by_id(__u32 id);
168
LIBBPF_API struct btf *btf__load_from_kernel_by_id_split(__u32 id, struct btf *base_btf);
169
170
LIBBPF_API int btf__load_into_kernel(struct btf *btf);
171
LIBBPF_API __s32 btf__find_by_name(const struct btf *btf,
172
           const char *type_name);
173
LIBBPF_API __s32 btf__find_by_name_kind(const struct btf *btf,
174
          const char *type_name, __u32 kind);
175
LIBBPF_API __u32 btf__type_cnt(const struct btf *btf);
176
LIBBPF_API const struct btf *btf__base_btf(const struct btf *btf);
177
LIBBPF_API const struct btf_type *btf__type_by_id(const struct btf *btf,
178
              __u32 id);
179
LIBBPF_API size_t btf__pointer_size(const struct btf *btf);
180
LIBBPF_API int btf__set_pointer_size(struct btf *btf, size_t ptr_sz);
181
LIBBPF_API enum btf_endianness btf__endianness(const struct btf *btf);
182
LIBBPF_API int btf__set_endianness(struct btf *btf, enum btf_endianness endian);
183
LIBBPF_API __s64 btf__resolve_size(const struct btf *btf, __u32 type_id);
184
LIBBPF_API int btf__resolve_type(const struct btf *btf, __u32 type_id);
185
LIBBPF_API int btf__align_of(const struct btf *btf, __u32 id);
186
LIBBPF_API int btf__fd(const struct btf *btf);
187
LIBBPF_API void btf__set_fd(struct btf *btf, int fd);
188
LIBBPF_API const void *btf__raw_data(const struct btf *btf, __u32 *size);
189
LIBBPF_API const char *btf__name_by_offset(const struct btf *btf, __u32 offset);
190
LIBBPF_API const char *btf__str_by_offset(const struct btf *btf, __u32 offset);
191
192
LIBBPF_API struct btf_ext *btf_ext__new(const __u8 *data, __u32 size);
193
LIBBPF_API void btf_ext__free(struct btf_ext *btf_ext);
194
LIBBPF_API const void *btf_ext__raw_data(const struct btf_ext *btf_ext, __u32 *size);
195
LIBBPF_API enum btf_endianness btf_ext__endianness(const struct btf_ext *btf_ext);
196
LIBBPF_API int btf_ext__set_endianness(struct btf_ext *btf_ext,
197
               enum btf_endianness endian);
198
199
LIBBPF_API int btf__find_str(struct btf *btf, const char *s);
200
LIBBPF_API int btf__add_str(struct btf *btf, const char *s);
201
LIBBPF_API int btf__add_type(struct btf *btf, const struct btf *src_btf,
202
           const struct btf_type *src_type);
203
/**
204
 * @brief **btf__add_btf()** appends all the BTF types from *src_btf* into *btf*
205
 * @param btf BTF object which all the BTF types and strings are added to
206
 * @param src_btf BTF object which all BTF types and referenced strings are copied from
207
 * @return BTF type ID of the first appended BTF type, or negative error code
208
 *
209
 * **btf__add_btf()** can be used to simply and efficiently append the entire
210
 * contents of one BTF object to another one. All the BTF type data is copied
211
 * over, all referenced type IDs are adjusted by adding a necessary ID offset.
212
 * Only strings referenced from BTF types are copied over and deduplicated, so
213
 * if there were some unused strings in *src_btf*, those won't be copied over,
214
 * which is consistent with the general string deduplication semantics of BTF
215
 * writing APIs.
216
 *
217
 * If any error is encountered during this process, the contents of *btf* is
218
 * left intact, which means that **btf__add_btf()** follows the transactional
219
 * semantics and the operation as a whole is all-or-nothing.
220
 *
221
 * *src_btf* has to be non-split BTF, as of now copying types from split BTF
222
 * is not supported and will result in -ENOTSUP error code returned.
223
 */
224
LIBBPF_API int btf__add_btf(struct btf *btf, const struct btf *src_btf);
225
226
LIBBPF_API int btf__add_int(struct btf *btf, const char *name, size_t byte_sz, int encoding);
227
LIBBPF_API int btf__add_float(struct btf *btf, const char *name, size_t byte_sz);
228
LIBBPF_API int btf__add_ptr(struct btf *btf, int ref_type_id);
229
LIBBPF_API int btf__add_array(struct btf *btf,
230
            int index_type_id, int elem_type_id, __u32 nr_elems);
231
/* struct/union construction APIs */
232
LIBBPF_API int btf__add_struct(struct btf *btf, const char *name, __u32 sz);
233
LIBBPF_API int btf__add_union(struct btf *btf, const char *name, __u32 sz);
234
LIBBPF_API int btf__add_field(struct btf *btf, const char *name, int field_type_id,
235
            __u32 bit_offset, __u32 bit_size);
236
237
/* enum construction APIs */
238
LIBBPF_API int btf__add_enum(struct btf *btf, const char *name, __u32 bytes_sz);
239
LIBBPF_API int btf__add_enum_value(struct btf *btf, const char *name, __s64 value);
240
LIBBPF_API int btf__add_enum64(struct btf *btf, const char *name, __u32 bytes_sz, bool is_signed);
241
LIBBPF_API int btf__add_enum64_value(struct btf *btf, const char *name, __u64 value);
242
243
enum btf_fwd_kind {
244
  BTF_FWD_STRUCT = 0,
245
  BTF_FWD_UNION = 1,
246
  BTF_FWD_ENUM = 2,
247
};
248
249
LIBBPF_API int btf__add_fwd(struct btf *btf, const char *name, enum btf_fwd_kind fwd_kind);
250
LIBBPF_API int btf__add_typedef(struct btf *btf, const char *name, int ref_type_id);
251
LIBBPF_API int btf__add_volatile(struct btf *btf, int ref_type_id);
252
LIBBPF_API int btf__add_const(struct btf *btf, int ref_type_id);
253
LIBBPF_API int btf__add_restrict(struct btf *btf, int ref_type_id);
254
LIBBPF_API int btf__add_type_tag(struct btf *btf, const char *value, int ref_type_id);
255
LIBBPF_API int btf__add_type_attr(struct btf *btf, const char *value, int ref_type_id);
256
257
/* func and func_proto construction APIs */
258
LIBBPF_API int btf__add_func(struct btf *btf, const char *name,
259
           enum btf_func_linkage linkage, int proto_type_id);
260
LIBBPF_API int btf__add_func_proto(struct btf *btf, int ret_type_id);
261
LIBBPF_API int btf__add_func_param(struct btf *btf, const char *name, int type_id);
262
263
/* var & datasec construction APIs */
264
LIBBPF_API int btf__add_var(struct btf *btf, const char *name, int linkage, int type_id);
265
LIBBPF_API int btf__add_datasec(struct btf *btf, const char *name, __u32 byte_sz);
266
LIBBPF_API int btf__add_datasec_var_info(struct btf *btf, int var_type_id,
267
           __u32 offset, __u32 byte_sz);
268
269
/* tag construction API */
270
LIBBPF_API int btf__add_decl_tag(struct btf *btf, const char *value, int ref_type_id,
271
          int component_idx);
272
LIBBPF_API int btf__add_decl_attr(struct btf *btf, const char *value, int ref_type_id,
273
          int component_idx);
274
275
struct btf_dedup_opts {
276
  size_t sz;
277
  /* optional .BTF.ext info to dedup along the main BTF info */
278
  struct btf_ext *btf_ext;
279
  /* force hash collisions (used for testing) */
280
  bool force_collisions;
281
  size_t :0;
282
};
283
#define btf_dedup_opts__last_field force_collisions
284
285
LIBBPF_API int btf__dedup(struct btf *btf, const struct btf_dedup_opts *opts);
286
287
/**
288
 * @brief **btf__relocate()** will check the split BTF *btf* for references
289
 * to base BTF kinds, and verify those references are compatible with
290
 * *base_btf*; if they are, *btf* is adjusted such that is re-parented to
291
 * *base_btf* and type ids and strings are adjusted to accommodate this.
292
 * @param btf split BTF object to relocate
293
 * @param base_btf base BTF object
294
 * @return 0 on success; negative error code, otherwise
295
 *
296
 * If successful, 0 is returned and **btf** now has **base_btf** as its
297
 * base.
298
 *
299
 * A negative value is returned on error and the thread-local `errno` variable
300
 * is set to the error code as well.
301
 */
302
LIBBPF_API int btf__relocate(struct btf *btf, const struct btf *base_btf);
303
304
struct btf_permute_opts {
305
  size_t sz;
306
  /* optional .BTF.ext info along the main BTF info */
307
  struct btf_ext *btf_ext;
308
  size_t :0;
309
};
310
#define btf_permute_opts__last_field btf_ext
311
312
/**
313
 * @brief **btf__permute()** rearranges BTF types in-place according to a specified ID mapping
314
 * @param btf BTF object to permute
315
 * @param id_map Array mapping original type IDs to new IDs
316
 * @param id_map_cnt Number of elements in @id_map
317
 * @param opts Optional parameters, including BTF extension data for reference updates
318
 * @return 0 on success, negative error code on failure
319
 *
320
 * **btf__permute()** reorders BTF types based on the provided @id_map array,
321
 * updating all internal type references to maintain consistency. The function
322
 * operates in-place, modifying the BTF object directly.
323
 *
324
 * For **base BTF**:
325
 * - @id_map must include all types from ID 0 to `btf__type_cnt(btf) - 1`
326
 * - @id_map_cnt must be `btf__type_cnt(btf)`
327
 * - Mapping is defined as `id_map[original_id] = new_id`
328
 * - `id_map[0]` must be 0 (void type cannot be moved)
329
 *
330
 * For **split BTF**:
331
 * - @id_map must include only split types (types added on top of the base BTF)
332
 * - @id_map_cnt must be `btf__type_cnt(btf) - btf__type_cnt(btf__base_btf(btf))`
333
 * - Mapping is defined as `id_map[original_id - start_id] = new_id`
334
 * - `start_id` equals `btf__type_cnt(btf__base_btf(btf))`
335
 *
336
 * After permutation, all type references within the BTF data and optional
337
 * BTF extension (if provided via @opts) are updated automatically.
338
 *
339
 * On error, returns a negative error code and sets errno:
340
 *   - `-EINVAL`: Invalid parameters or invalid ID mapping
341
 *   - `-ENOMEM`: Memory allocation failure
342
 */
343
LIBBPF_API int btf__permute(struct btf *btf, __u32 *id_map, __u32 id_map_cnt,
344
          const struct btf_permute_opts *opts);
345
346
struct btf_dump;
347
348
struct btf_dump_opts {
349
  size_t sz;
350
};
351
#define btf_dump_opts__last_field sz
352
353
typedef void (*btf_dump_printf_fn_t)(void *ctx, const char *fmt, va_list args);
354
355
LIBBPF_API struct btf_dump *btf_dump__new(const struct btf *btf,
356
            btf_dump_printf_fn_t printf_fn,
357
            void *ctx,
358
            const struct btf_dump_opts *opts);
359
360
LIBBPF_API void btf_dump__free(struct btf_dump *d);
361
362
LIBBPF_API int btf_dump__dump_type(struct btf_dump *d, __u32 id);
363
364
struct btf_dump_emit_type_decl_opts {
365
  /* size of this struct, for forward/backward compatibility */
366
  size_t sz;
367
  /* optional field name for type declaration, e.g.:
368
   * - struct my_struct <FNAME>
369
   * - void (*<FNAME>)(int)
370
   * - char (*<FNAME>)[123]
371
   */
372
  const char *field_name;
373
  /* extra indentation level (in number of tabs) to emit for multi-line
374
   * type declarations (e.g., anonymous struct); applies for lines
375
   * starting from the second one (first line is assumed to have
376
   * necessary indentation already
377
   */
378
  int indent_level;
379
  /* strip all the const/volatile/restrict mods */
380
  bool strip_mods;
381
  size_t :0;
382
};
383
#define btf_dump_emit_type_decl_opts__last_field strip_mods
384
385
LIBBPF_API int
386
btf_dump__emit_type_decl(struct btf_dump *d, __u32 id,
387
       const struct btf_dump_emit_type_decl_opts *opts);
388
389
390
struct btf_dump_type_data_opts {
391
  /* size of this struct, for forward/backward compatibility */
392
  size_t sz;
393
  const char *indent_str;
394
  int indent_level;
395
  /* below match "show" flags for bpf_show_snprintf() */
396
  bool compact;   /* no newlines/indentation */
397
  bool skip_names;  /* skip member/type names */
398
  bool emit_zeroes; /* show 0-valued fields */
399
  bool emit_strings;  /* print char arrays as strings */
400
  size_t :0;
401
};
402
#define btf_dump_type_data_opts__last_field emit_strings
403
404
LIBBPF_API int
405
btf_dump__dump_type_data(struct btf_dump *d, __u32 id,
406
       const void *data, size_t data_sz,
407
       const struct btf_dump_type_data_opts *opts);
408
409
/*
410
 * A set of helpers for easier BTF types handling.
411
 *
412
 * The inline functions below rely on constants from the kernel headers which
413
 * may not be available for applications including this header file. To avoid
414
 * compilation errors, we define all the constants here that were added after
415
 * the initial introduction of the BTF_KIND* constants.
416
 */
417
#ifndef BTF_KIND_FUNC
418
22.7k
#define BTF_KIND_FUNC   12  /* Function */
419
6.67k
#define BTF_KIND_FUNC_PROTO 13  /* Function Proto */
420
#endif
421
#ifndef BTF_KIND_VAR
422
26.2k
#define BTF_KIND_VAR    14  /* Variable */
423
42.2k
#define BTF_KIND_DATASEC  15  /* Section  */
424
#endif
425
#ifndef BTF_KIND_FLOAT
426
19.7k
#define BTF_KIND_FLOAT    16  /* Floating point */
427
#endif
428
/* The kernel header switched to enums, so the following were never #defined */
429
9.90k
#define BTF_KIND_DECL_TAG 17  /* Decl Tag */
430
27.4k
#define BTF_KIND_TYPE_TAG 18  /* Type Tag */
431
1.47k
#define BTF_KIND_ENUM64   19  /* Enum for up-to 64bit values */
432
433
static inline __u16 btf_kind(const struct btf_type *t)
434
169k
{
435
169k
  return BTF_INFO_KIND(t->info);
436
169k
}
libbpf.c:btf_kind
Line
Count
Source
434
56.9k
{
435
56.9k
  return BTF_INFO_KIND(t->info);
436
56.9k
}
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
btf.c:btf_kind
Line
Count
Source
434
112k
{
435
112k
  return BTF_INFO_KIND(t->info);
436
112k
}
Unexecuted instantiation: strset.c:btf_kind
Unexecuted instantiation: btf_iter.c:btf_kind
Unexecuted instantiation: btf_relocate.c:btf_kind
437
438
static inline __u32 btf_vlen(const struct btf_type *t)
439
62.3k
{
440
62.3k
  return BTF_INFO_VLEN(t->info);
441
62.3k
}
libbpf.c:btf_vlen
Line
Count
Source
439
8.17k
{
440
8.17k
  return BTF_INFO_VLEN(t->info);
441
8.17k
}
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
btf.c:btf_vlen
Line
Count
Source
439
54.1k
{
440
54.1k
  return BTF_INFO_VLEN(t->info);
441
54.1k
}
Unexecuted instantiation: strset.c:btf_vlen
Unexecuted instantiation: btf_iter.c:btf_vlen
Unexecuted instantiation: btf_relocate.c:btf_vlen
442
443
static inline bool btf_kflag(const struct btf_type *t)
444
26
{
445
26
  return BTF_INFO_KFLAG(t->info);
446
26
}
libbpf.c:btf_kflag
Line
Count
Source
444
13
{
445
13
  return BTF_INFO_KFLAG(t->info);
446
13
}
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
btf.c:btf_kflag
Line
Count
Source
444
13
{
445
13
  return BTF_INFO_KFLAG(t->info);
446
13
}
Unexecuted instantiation: strset.c:btf_kflag
Unexecuted instantiation: btf_iter.c:btf_kflag
Unexecuted instantiation: btf_relocate.c:btf_kflag
447
448
static inline bool btf_is_void(const struct btf_type *t)
449
0
{
450
0
  return btf_kind(t) == BTF_KIND_UNKN;
451
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
452
453
static inline bool btf_is_int(const struct btf_type *t)
454
5.25k
{
455
5.25k
  return btf_kind(t) == BTF_KIND_INT;
456
5.25k
}
libbpf.c:btf_is_int
Line
Count
Source
454
5.25k
{
455
5.25k
  return btf_kind(t) == BTF_KIND_INT;
456
5.25k
}
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
457
458
static inline bool btf_is_ptr(const struct btf_type *t)
459
0
{
460
0
  return btf_kind(t) == BTF_KIND_PTR;
461
0
}
Unexecuted instantiation: libbpf.c:btf_is_ptr
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
462
463
static inline bool btf_is_array(const struct btf_type *t)
464
0
{
465
0
  return btf_kind(t) == BTF_KIND_ARRAY;
466
0
}
Unexecuted instantiation: libbpf.c:btf_is_array
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
467
468
static inline bool btf_is_struct(const struct btf_type *t)
469
361
{
470
361
  return btf_kind(t) == BTF_KIND_STRUCT;
471
361
}
libbpf.c:btf_is_struct
Line
Count
Source
469
361
{
470
361
  return btf_kind(t) == BTF_KIND_STRUCT;
471
361
}
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
472
473
static inline bool btf_is_union(const struct btf_type *t)
474
0
{
475
0
  return btf_kind(t) == BTF_KIND_UNION;
476
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
477
478
static inline bool btf_is_composite(const struct btf_type *t)
479
0
{
480
0
  __u16 kind = btf_kind(t);
481
482
0
  return kind == BTF_KIND_STRUCT || kind == BTF_KIND_UNION;
483
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
484
485
static inline bool btf_is_enum(const struct btf_type *t)
486
0
{
487
0
  return btf_kind(t) == BTF_KIND_ENUM;
488
0
}
Unexecuted instantiation: libbpf.c:btf_is_enum
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
489
490
static inline bool btf_is_enum64(const struct btf_type *t)
491
0
{
492
0
  return btf_kind(t) == BTF_KIND_ENUM64;
493
0
}
Unexecuted instantiation: libbpf.c:btf_is_enum64
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
494
495
static inline bool btf_is_fwd(const struct btf_type *t)
496
3.08k
{
497
3.08k
  return btf_kind(t) == BTF_KIND_FWD;
498
3.08k
}
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
btf.c:btf_is_fwd
Line
Count
Source
496
3.08k
{
497
3.08k
  return btf_kind(t) == BTF_KIND_FWD;
498
3.08k
}
Unexecuted instantiation: strset.c:btf_is_fwd
Unexecuted instantiation: btf_iter.c:btf_is_fwd
Unexecuted instantiation: btf_relocate.c:btf_is_fwd
499
500
static inline bool btf_is_typedef(const struct btf_type *t)
501
1.88k
{
502
1.88k
  return btf_kind(t) == BTF_KIND_TYPEDEF;
503
1.88k
}
libbpf.c:btf_is_typedef
Line
Count
Source
501
869
{
502
869
  return btf_kind(t) == BTF_KIND_TYPEDEF;
503
869
}
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
btf.c:btf_is_typedef
Line
Count
Source
501
1.01k
{
502
1.01k
  return btf_kind(t) == BTF_KIND_TYPEDEF;
503
1.01k
}
Unexecuted instantiation: strset.c:btf_is_typedef
Unexecuted instantiation: btf_iter.c:btf_is_typedef
Unexecuted instantiation: btf_relocate.c:btf_is_typedef
504
505
static inline bool btf_is_volatile(const struct btf_type *t)
506
0
{
507
0
  return btf_kind(t) == BTF_KIND_VOLATILE;
508
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
509
510
static inline bool btf_is_const(const struct btf_type *t)
511
0
{
512
0
  return btf_kind(t) == BTF_KIND_CONST;
513
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
514
515
static inline bool btf_is_restrict(const struct btf_type *t)
516
0
{
517
0
  return btf_kind(t) == BTF_KIND_RESTRICT;
518
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
519
520
static inline bool btf_is_mod(const struct btf_type *t)
521
2.31k
{
522
2.31k
  __u16 kind = btf_kind(t);
523
524
2.31k
  return kind == BTF_KIND_VOLATILE ||
525
2.20k
         kind == BTF_KIND_CONST ||
526
2.04k
         kind == BTF_KIND_RESTRICT ||
527
1.95k
         kind == BTF_KIND_TYPE_TAG;
528
2.31k
}
libbpf.c:btf_is_mod
Line
Count
Source
521
1.13k
{
522
1.13k
  __u16 kind = btf_kind(t);
523
524
1.13k
  return kind == BTF_KIND_VOLATILE ||
525
1.07k
         kind == BTF_KIND_CONST ||
526
960
         kind == BTF_KIND_RESTRICT ||
527
911
         kind == BTF_KIND_TYPE_TAG;
528
1.13k
}
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
btf.c:btf_is_mod
Line
Count
Source
521
1.17k
{
522
1.17k
  __u16 kind = btf_kind(t);
523
524
1.17k
  return kind == BTF_KIND_VOLATILE ||
525
1.12k
         kind == BTF_KIND_CONST ||
526
1.08k
         kind == BTF_KIND_RESTRICT ||
527
1.04k
         kind == BTF_KIND_TYPE_TAG;
528
1.17k
}
Unexecuted instantiation: strset.c:btf_is_mod
Unexecuted instantiation: btf_iter.c:btf_is_mod
Unexecuted instantiation: btf_relocate.c:btf_is_mod
529
530
static inline bool btf_is_func(const struct btf_type *t)
531
9.12k
{
532
9.12k
  return btf_kind(t) == BTF_KIND_FUNC;
533
9.12k
}
libbpf.c:btf_is_func
Line
Count
Source
531
9.12k
{
532
9.12k
  return btf_kind(t) == BTF_KIND_FUNC;
533
9.12k
}
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
534
535
static inline bool btf_is_func_proto(const struct btf_type *t)
536
0
{
537
0
  return btf_kind(t) == BTF_KIND_FUNC_PROTO;
538
0
}
Unexecuted instantiation: libbpf.c:btf_is_func_proto
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
539
540
static inline bool btf_is_var(const struct btf_type *t)
541
12.3k
{
542
12.3k
  return btf_kind(t) == BTF_KIND_VAR;
543
12.3k
}
libbpf.c:btf_is_var
Line
Count
Source
541
11.3k
{
542
11.3k
  return btf_kind(t) == BTF_KIND_VAR;
543
11.3k
}
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
btf.c:btf_is_var
Line
Count
Source
541
974
{
542
974
  return btf_kind(t) == BTF_KIND_VAR;
543
974
}
Unexecuted instantiation: strset.c:btf_is_var
Unexecuted instantiation: btf_iter.c:btf_is_var
Unexecuted instantiation: btf_relocate.c:btf_is_var
544
545
static inline bool btf_is_datasec(const struct btf_type *t)
546
28.4k
{
547
28.4k
  return btf_kind(t) == BTF_KIND_DATASEC;
548
28.4k
}
libbpf.c:btf_is_datasec
Line
Count
Source
546
28.4k
{
547
28.4k
  return btf_kind(t) == BTF_KIND_DATASEC;
548
28.4k
}
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
549
550
static inline bool btf_is_float(const struct btf_type *t)
551
0
{
552
0
  return btf_kind(t) == BTF_KIND_FLOAT;
553
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
554
555
static inline bool btf_is_decl_tag(const struct btf_type *t)
556
0
{
557
0
  return btf_kind(t) == BTF_KIND_DECL_TAG;
558
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
559
560
static inline bool btf_is_type_tag(const struct btf_type *t)
561
0
{
562
0
  return btf_kind(t) == BTF_KIND_TYPE_TAG;
563
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
564
565
static inline bool btf_is_any_enum(const struct btf_type *t)
566
0
{
567
0
  return btf_is_enum(t) || btf_is_enum64(t);
568
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
569
570
static inline bool btf_kind_core_compat(const struct btf_type *t1,
571
          const struct btf_type *t2)
572
0
{
573
0
  return btf_kind(t1) == btf_kind(t2) ||
574
0
         (btf_is_any_enum(t1) && btf_is_any_enum(t2));
575
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
576
577
static inline __u8 btf_int_encoding(const struct btf_type *t)
578
219
{
579
219
  return BTF_INT_ENCODING(*(__u32 *)(t + 1));
580
219
}
libbpf.c:btf_int_encoding
Line
Count
Source
578
219
{
579
219
  return BTF_INT_ENCODING(*(__u32 *)(t + 1));
580
219
}
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
581
582
static inline __u8 btf_int_offset(const struct btf_type *t)
583
0
{
584
0
  return BTF_INT_OFFSET(*(__u32 *)(t + 1));
585
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
586
587
static inline __u8 btf_int_bits(const struct btf_type *t)
588
1.24k
{
589
1.24k
  return BTF_INT_BITS(*(__u32 *)(t + 1));
590
1.24k
}
libbpf.c:btf_int_bits
Line
Count
Source
588
1.24k
{
589
1.24k
  return BTF_INT_BITS(*(__u32 *)(t + 1));
590
1.24k
}
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
591
592
static inline struct btf_array *btf_array(const struct btf_type *t)
593
5.05k
{
594
5.05k
  return (struct btf_array *)(t + 1);
595
5.05k
}
libbpf.c:btf_array
Line
Count
Source
593
296
{
594
296
  return (struct btf_array *)(t + 1);
595
296
}
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
btf.c:btf_array
Line
Count
Source
593
4.76k
{
594
4.76k
  return (struct btf_array *)(t + 1);
595
4.76k
}
Unexecuted instantiation: strset.c:btf_array
Unexecuted instantiation: btf_iter.c:btf_array
Unexecuted instantiation: btf_relocate.c:btf_array
596
597
static inline struct btf_enum *btf_enum(const struct btf_type *t)
598
531
{
599
531
  return (struct btf_enum *)(t + 1);
600
531
}
Unexecuted instantiation: libbpf.c:btf_enum
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
btf.c:btf_enum
Line
Count
Source
598
531
{
599
531
  return (struct btf_enum *)(t + 1);
600
531
}
Unexecuted instantiation: strset.c:btf_enum
Unexecuted instantiation: btf_iter.c:btf_enum
Unexecuted instantiation: btf_relocate.c:btf_enum
601
602
struct btf_enum64;
603
604
static inline struct btf_enum64 *btf_enum64(const struct btf_type *t)
605
497
{
606
497
  return (struct btf_enum64 *)(t + 1);
607
497
}
Unexecuted instantiation: libbpf.c:btf_enum64
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
btf.c:btf_enum64
Line
Count
Source
605
497
{
606
497
  return (struct btf_enum64 *)(t + 1);
607
497
}
Unexecuted instantiation: strset.c:btf_enum64
Unexecuted instantiation: btf_iter.c:btf_enum64
Unexecuted instantiation: btf_relocate.c:btf_enum64
608
609
static inline __u64 btf_enum64_value(const struct btf_enum64 *e)
610
0
{
611
  /* struct btf_enum64 is introduced in Linux 6.0, which is very
612
   * bleeding-edge. Here we are avoiding relying on struct btf_enum64
613
   * definition coming from kernel UAPI headers to support wider range
614
   * of system-wide kernel headers.
615
   *
616
   * Given this header can be also included from C++ applications, that
617
   * further restricts C tricks we can use (like using compatible
618
   * anonymous struct). So just treat struct btf_enum64 as
619
   * a three-element array of u32 and access second (lo32) and third
620
   * (hi32) elements directly.
621
   *
622
   * For reference, here is a struct btf_enum64 definition:
623
   *
624
   * const struct btf_enum64 {
625
   *  __u32 name_off;
626
   *  __u32 val_lo32;
627
   *  __u32 val_hi32;
628
   * };
629
   */
630
0
  const __u32 *e64 = (const __u32 *)e;
631
632
0
  return ((__u64)e64[2] << 32) | e64[1];
633
0
}
Unexecuted instantiation: libbpf.c:btf_enum64_value
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
634
635
static inline struct btf_member *btf_members(const struct btf_type *t)
636
1.36k
{
637
1.36k
  return (struct btf_member *)(t + 1);
638
1.36k
}
libbpf.c:btf_members
Line
Count
Source
636
26
{
637
26
  return (struct btf_member *)(t + 1);
638
26
}
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
btf.c:btf_members
Line
Count
Source
636
1.33k
{
637
1.33k
  return (struct btf_member *)(t + 1);
638
1.33k
}
Unexecuted instantiation: strset.c:btf_members
Unexecuted instantiation: btf_iter.c:btf_members
Unexecuted instantiation: btf_relocate.c:btf_members
639
640
/* Get bit offset of a member with specified index. */
641
static inline __u32 btf_member_bit_offset(const struct btf_type *t,
642
            __u32 member_idx)
643
13
{
644
13
  const struct btf_member *m = btf_members(t) + member_idx;
645
13
  bool kflag = btf_kflag(t);
646
647
13
  return kflag ? BTF_MEMBER_BIT_OFFSET(m->offset) : m->offset;
648
13
}
libbpf.c:btf_member_bit_offset
Line
Count
Source
643
13
{
644
13
  const struct btf_member *m = btf_members(t) + member_idx;
645
13
  bool kflag = btf_kflag(t);
646
647
13
  return kflag ? BTF_MEMBER_BIT_OFFSET(m->offset) : m->offset;
648
13
}
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
649
/*
650
 * Get bitfield size of a member, assuming t is BTF_KIND_STRUCT or
651
 * BTF_KIND_UNION. If member is not a bitfield, zero is returned.
652
 */
653
static inline __u32 btf_member_bitfield_size(const struct btf_type *t,
654
               __u32 member_idx)
655
13
{
656
13
  const struct btf_member *m = btf_members(t) + member_idx;
657
13
  bool kflag = btf_kflag(t);
658
659
13
  return kflag ? BTF_MEMBER_BITFIELD_SIZE(m->offset) : 0;
660
13
}
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
655
13
{
656
13
  const struct btf_member *m = btf_members(t) + member_idx;
657
13
  bool kflag = btf_kflag(t);
658
659
13
  return kflag ? BTF_MEMBER_BITFIELD_SIZE(m->offset) : 0;
660
13
}
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
661
662
static inline struct btf_param *btf_params(const struct btf_type *t)
663
2.63k
{
664
2.63k
  return (struct btf_param *)(t + 1);
665
2.63k
}
libbpf.c:btf_params
Line
Count
Source
663
79
{
664
79
  return (struct btf_param *)(t + 1);
665
79
}
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
btf.c:btf_params
Line
Count
Source
663
2.55k
{
664
2.55k
  return (struct btf_param *)(t + 1);
665
2.55k
}
Unexecuted instantiation: strset.c:btf_params
Unexecuted instantiation: btf_iter.c:btf_params
Unexecuted instantiation: btf_relocate.c:btf_params
666
667
static inline struct btf_var *btf_var(const struct btf_type *t)
668
3.29k
{
669
3.29k
  return (struct btf_var *)(t + 1);
670
3.29k
}
libbpf.c:btf_var
Line
Count
Source
668
2.22k
{
669
2.22k
  return (struct btf_var *)(t + 1);
670
2.22k
}
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
btf.c:btf_var
Line
Count
Source
668
1.07k
{
669
1.07k
  return (struct btf_var *)(t + 1);
670
1.07k
}
Unexecuted instantiation: strset.c:btf_var
Unexecuted instantiation: btf_iter.c:btf_var
Unexecuted instantiation: btf_relocate.c:btf_var
671
672
static inline struct btf_var_secinfo *
673
btf_var_secinfos(const struct btf_type *t)
674
11.9k
{
675
11.9k
  return (struct btf_var_secinfo *)(t + 1);
676
11.9k
}
libbpf.c:btf_var_secinfos
Line
Count
Source
674
6.41k
{
675
6.41k
  return (struct btf_var_secinfo *)(t + 1);
676
6.41k
}
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
btf.c:btf_var_secinfos
Line
Count
Source
674
5.56k
{
675
5.56k
  return (struct btf_var_secinfo *)(t + 1);
676
5.56k
}
Unexecuted instantiation: strset.c:btf_var_secinfos
Unexecuted instantiation: btf_iter.c:btf_var_secinfos
Unexecuted instantiation: btf_relocate.c:btf_var_secinfos
677
678
struct btf_decl_tag;
679
static inline struct btf_decl_tag *btf_decl_tag(const struct btf_type *t)
680
664
{
681
664
  return (struct btf_decl_tag *)(t + 1);
682
664
}
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
btf.c:btf_decl_tag
Line
Count
Source
680
664
{
681
664
  return (struct btf_decl_tag *)(t + 1);
682
664
}
Unexecuted instantiation: strset.c:btf_decl_tag
Unexecuted instantiation: btf_iter.c:btf_decl_tag
Unexecuted instantiation: btf_relocate.c:btf_decl_tag
683
684
#ifdef __cplusplus
685
} /* extern "C" */
686
#endif
687
688
#endif /* __LIBBPF_BTF_H */