Lines Matching refs:d
133 static const char *btf_name_of(const struct btf_dump *d, __u32 name_off) in btf_name_of() argument
135 return btf__name_by_offset(d->btf, name_off); in btf_name_of()
138 static void btf_dump_printf(const struct btf_dump *d, const char *fmt, ...) in btf_dump_printf() argument
143 d->printf_fn(d->cb_ctx, fmt, args); in btf_dump_printf()
147 static int btf_dump_mark_referenced(struct btf_dump *d);
148 static int btf_dump_resize(struct btf_dump *d);
155 struct btf_dump *d; in btf_dump__new() local
164 d = calloc(1, sizeof(struct btf_dump)); in btf_dump__new()
165 if (!d) in btf_dump__new()
168 d->btf = btf; in btf_dump__new()
169 d->printf_fn = printf_fn; in btf_dump__new()
170 d->cb_ctx = ctx; in btf_dump__new()
171 d->ptr_sz = btf__pointer_size(btf) ? : sizeof(void *); in btf_dump__new()
173 d->type_names = hashmap__new(str_hash_fn, str_equal_fn, NULL); in btf_dump__new()
174 if (IS_ERR(d->type_names)) { in btf_dump__new()
175 err = PTR_ERR(d->type_names); in btf_dump__new()
176 d->type_names = NULL; in btf_dump__new()
179 d->ident_names = hashmap__new(str_hash_fn, str_equal_fn, NULL); in btf_dump__new()
180 if (IS_ERR(d->ident_names)) { in btf_dump__new()
181 err = PTR_ERR(d->ident_names); in btf_dump__new()
182 d->ident_names = NULL; in btf_dump__new()
186 err = btf_dump_resize(d); in btf_dump__new()
190 return d; in btf_dump__new()
192 btf_dump__free(d); in btf_dump__new()
196 static int btf_dump_resize(struct btf_dump *d) in btf_dump_resize() argument
198 int err, last_id = btf__type_cnt(d->btf) - 1; in btf_dump_resize()
200 if (last_id <= d->last_id) in btf_dump_resize()
203 if (libbpf_ensure_mem((void **)&d->type_states, &d->type_states_cap, in btf_dump_resize()
204 sizeof(*d->type_states), last_id + 1)) in btf_dump_resize()
206 if (libbpf_ensure_mem((void **)&d->cached_names, &d->cached_names_cap, in btf_dump_resize()
207 sizeof(*d->cached_names), last_id + 1)) in btf_dump_resize()
210 if (d->last_id == 0) { in btf_dump_resize()
212 d->type_states[0].order_state = ORDERED; in btf_dump_resize()
213 d->type_states[0].emit_state = EMITTED; in btf_dump_resize()
217 err = btf_dump_mark_referenced(d); in btf_dump_resize()
221 d->last_id = last_id; in btf_dump_resize()
239 void btf_dump__free(struct btf_dump *d) in btf_dump__free() argument
243 if (IS_ERR_OR_NULL(d)) in btf_dump__free()
246 free(d->type_states); in btf_dump__free()
247 if (d->cached_names) { in btf_dump__free()
249 for (i = 0; i <= d->last_id; i++) { in btf_dump__free()
250 if (d->cached_names[i]) in btf_dump__free()
251 free((void *)d->cached_names[i]); in btf_dump__free()
254 free(d->cached_names); in btf_dump__free()
255 free(d->emit_queue); in btf_dump__free()
256 free(d->decl_stack); in btf_dump__free()
257 btf_dump_free_names(d->type_names); in btf_dump__free()
258 btf_dump_free_names(d->ident_names); in btf_dump__free()
260 free(d); in btf_dump__free()
263 static int btf_dump_order_type(struct btf_dump *d, __u32 id, bool through_ptr);
264 static void btf_dump_emit_type(struct btf_dump *d, __u32 id, __u32 cont_id);
282 int btf_dump__dump_type(struct btf_dump *d, __u32 id) in btf_dump__dump_type() argument
286 if (id >= btf__type_cnt(d->btf)) in btf_dump__dump_type()
289 err = btf_dump_resize(d); in btf_dump__dump_type()
293 d->emit_queue_cnt = 0; in btf_dump__dump_type()
294 err = btf_dump_order_type(d, id, false); in btf_dump__dump_type()
298 for (i = 0; i < d->emit_queue_cnt; i++) in btf_dump__dump_type()
299 btf_dump_emit_type(d, d->emit_queue[i], 0 /*top-level*/); in btf_dump__dump_type()
316 static int btf_dump_mark_referenced(struct btf_dump *d) in btf_dump_mark_referenced() argument
318 int i, j, n = btf__type_cnt(d->btf); in btf_dump_mark_referenced()
322 for (i = d->last_id + 1; i < n; i++) { in btf_dump_mark_referenced()
323 t = btf__type_by_id(d->btf, i); in btf_dump_mark_referenced()
343 d->type_states[t->type].referenced = 1; in btf_dump_mark_referenced()
349 d->type_states[a->index_type].referenced = 1; in btf_dump_mark_referenced()
350 d->type_states[a->type].referenced = 1; in btf_dump_mark_referenced()
358 d->type_states[m->type].referenced = 1; in btf_dump_mark_referenced()
365 d->type_states[p->type].referenced = 1; in btf_dump_mark_referenced()
372 d->type_states[v->type].referenced = 1; in btf_dump_mark_referenced()
382 static int btf_dump_add_emit_queue_id(struct btf_dump *d, __u32 id) in btf_dump_add_emit_queue_id() argument
387 if (d->emit_queue_cnt >= d->emit_queue_cap) { in btf_dump_add_emit_queue_id()
388 new_cap = max(16, d->emit_queue_cap * 3 / 2); in btf_dump_add_emit_queue_id()
389 new_queue = libbpf_reallocarray(d->emit_queue, new_cap, sizeof(new_queue[0])); in btf_dump_add_emit_queue_id()
392 d->emit_queue = new_queue; in btf_dump_add_emit_queue_id()
393 d->emit_queue_cap = new_cap; in btf_dump_add_emit_queue_id()
396 d->emit_queue[d->emit_queue_cnt++] = id; in btf_dump_add_emit_queue_id()
474 static int btf_dump_order_type(struct btf_dump *d, __u32 id, bool through_ptr) in btf_dump_order_type() argument
487 struct btf_dump_type_aux_state *tstate = &d->type_states[id]; in btf_dump_order_type()
496 t = btf__type_by_id(d->btf, id); in btf_dump_order_type()
513 err = btf_dump_order_type(d, t->type, true); in btf_dump_order_type()
518 return btf_dump_order_type(d, btf_array(t)->type, false); in btf_dump_order_type()
535 err = btf_dump_order_type(d, m->type, false); in btf_dump_order_type()
541 err = btf_dump_add_emit_queue_id(d, id); in btf_dump_order_type()
558 err = btf_dump_add_emit_queue_id(d, id); in btf_dump_order_type()
568 is_strong = btf_dump_order_type(d, t->type, through_ptr); in btf_dump_order_type()
577 err = btf_dump_add_emit_queue_id(d, id); in btf_dump_order_type()
581 d->type_states[id].order_state = ORDERED; in btf_dump_order_type()
588 return btf_dump_order_type(d, t->type, through_ptr); in btf_dump_order_type()
594 err = btf_dump_order_type(d, t->type, through_ptr); in btf_dump_order_type()
601 err = btf_dump_order_type(d, p->type, through_ptr); in btf_dump_order_type()
613 d->type_states[id].order_state = ORDERED; in btf_dump_order_type()
621 static void btf_dump_emit_missing_aliases(struct btf_dump *d, __u32 id,
624 static void btf_dump_emit_struct_fwd(struct btf_dump *d, __u32 id,
626 static void btf_dump_emit_struct_def(struct btf_dump *d, __u32 id,
629 static void btf_dump_emit_enum_fwd(struct btf_dump *d, __u32 id,
631 static void btf_dump_emit_enum_def(struct btf_dump *d, __u32 id,
634 static void btf_dump_emit_fwd_def(struct btf_dump *d, __u32 id,
637 static void btf_dump_emit_typedef_def(struct btf_dump *d, __u32 id,
646 static void btf_dump_emit_type_decl(struct btf_dump *d, __u32 id,
648 static void btf_dump_emit_type_chain(struct btf_dump *d,
652 static const char *btf_dump_type_name(struct btf_dump *d, __u32 id);
653 static const char *btf_dump_ident_name(struct btf_dump *d, __u32 id);
654 static size_t btf_dump_name_dups(struct btf_dump *d, struct hashmap *name_map,
657 static bool btf_dump_is_blacklisted(struct btf_dump *d, __u32 id) in btf_dump_is_blacklisted() argument
659 const struct btf_type *t = btf__type_by_id(d->btf, id); in btf_dump_is_blacklisted()
669 return strcmp(btf_name_of(d, t->name_off), "__builtin_va_list") == 0; in btf_dump_is_blacklisted()
690 static void btf_dump_emit_type(struct btf_dump *d, __u32 id, __u32 cont_id) in btf_dump_emit_type() argument
692 struct btf_dump_type_aux_state *tstate = &d->type_states[id]; in btf_dump_emit_type()
700 t = btf__type_by_id(d->btf, id); in btf_dump_emit_type()
721 btf_dump_emit_struct_fwd(d, id, t); in btf_dump_emit_type()
722 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
731 if (!btf_dump_is_blacklisted(d, id)) { in btf_dump_emit_type()
732 btf_dump_emit_typedef_def(d, id, t, 0); in btf_dump_emit_type()
733 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
747 btf_dump_emit_missing_aliases(d, id, t); in btf_dump_emit_type()
754 btf_dump_emit_enum_def(d, id, t, 0); in btf_dump_emit_type()
755 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
764 btf_dump_emit_type(d, t->type, cont_id); in btf_dump_emit_type()
767 btf_dump_emit_type(d, btf_array(t)->type, cont_id); in btf_dump_emit_type()
770 btf_dump_emit_fwd_def(d, id, t); in btf_dump_emit_type()
771 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
776 btf_dump_emit_type(d, t->type, id); in btf_dump_emit_type()
784 if (!tstate->fwd_emitted && !btf_dump_is_blacklisted(d, id)) { in btf_dump_emit_type()
785 btf_dump_emit_typedef_def(d, id, t, 0); in btf_dump_emit_type()
786 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
807 btf_dump_emit_type(d, m->type, new_cont_id); in btf_dump_emit_type()
809 btf_dump_emit_struct_fwd(d, id, t); in btf_dump_emit_type()
810 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
815 btf_dump_emit_struct_def(d, id, t, 0); in btf_dump_emit_type()
816 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
827 btf_dump_emit_type(d, t->type, cont_id); in btf_dump_emit_type()
829 btf_dump_emit_type(d, p->type, cont_id); in btf_dump_emit_type()
865 static void btf_dump_emit_bit_padding(const struct btf_dump *d, in btf_dump_emit_bit_padding() argument
873 {"long", d->ptr_sz * 8}, {"int", 32}, {"short", 16}, {"char", 8} in btf_dump_emit_bit_padding()
922 btf_dump_printf(d, "\n%s%s: %d;", pfx(lvl), pad_type, in btf_dump_emit_bit_padding()
936 btf_dump_printf(d, "\n%s%s: %d;", pfx(lvl), pad_type, pad_bits); in btf_dump_emit_bit_padding()
952 btf_dump_printf(d, "\n%s%s: %d;", pfx(lvl), pad_type, bits); in btf_dump_emit_bit_padding()
959 static void btf_dump_emit_struct_fwd(struct btf_dump *d, __u32 id, in btf_dump_emit_struct_fwd() argument
962 btf_dump_printf(d, "%s%s%s", in btf_dump_emit_struct_fwd()
965 btf_dump_type_name(d, id)); in btf_dump_emit_struct_fwd()
968 static void btf_dump_emit_struct_def(struct btf_dump *d, in btf_dump_emit_struct_def() argument
979 align = btf__align_of(d->btf, id); in btf_dump_emit_struct_def()
980 packed = is_struct ? btf_is_struct_packed(d->btf, id, t) : 0; in btf_dump_emit_struct_def()
982 btf_dump_printf(d, "%s%s%s {", in btf_dump_emit_struct_def()
985 btf_dump_type_name(d, id)); in btf_dump_emit_struct_def()
992 fname = btf_name_of(d, m->name_off); in btf_dump_emit_struct_def()
995 m_align = packed ? 1 : btf__align_of(d->btf, m->type); in btf_dump_emit_struct_def()
999 btf_dump_emit_bit_padding(d, off, m_off, m_align, in_bitfield, lvl + 1); in btf_dump_emit_struct_def()
1000 btf_dump_printf(d, "\n%s", pfx(lvl + 1)); in btf_dump_emit_struct_def()
1001 btf_dump_emit_type_decl(d, m->type, fname, lvl + 1); in btf_dump_emit_struct_def()
1004 btf_dump_printf(d, ": %d", m_sz); in btf_dump_emit_struct_def()
1008 m_sz = max((__s64)0, btf__resolve_size(d->btf, m->type)); in btf_dump_emit_struct_def()
1013 btf_dump_printf(d, ";"); in btf_dump_emit_struct_def()
1018 btf_dump_emit_bit_padding(d, off, t->size * 8, align, false, lvl + 1); in btf_dump_emit_struct_def()
1025 btf_dump_printf(d, "\n"); in btf_dump_emit_struct_def()
1026 btf_dump_printf(d, "%s}", pfx(lvl)); in btf_dump_emit_struct_def()
1028 btf_dump_printf(d, "}"); in btf_dump_emit_struct_def()
1031 btf_dump_printf(d, " __attribute__((packed))"); in btf_dump_emit_struct_def()
1045 static void btf_dump_emit_missing_aliases(struct btf_dump *d, __u32 id, in btf_dump_emit_missing_aliases() argument
1048 const char *name = btf_dump_type_name(d, id); in btf_dump_emit_missing_aliases()
1053 btf_dump_printf(d, "typedef %s %s;\n\n", in btf_dump_emit_missing_aliases()
1060 static void btf_dump_emit_enum_fwd(struct btf_dump *d, __u32 id, in btf_dump_emit_enum_fwd() argument
1063 btf_dump_printf(d, "enum %s", btf_dump_type_name(d, id)); in btf_dump_emit_enum_fwd()
1066 static void btf_dump_emit_enum32_val(struct btf_dump *d, in btf_dump_emit_enum32_val() argument
1078 name = btf_name_of(d, v->name_off); in btf_dump_emit_enum32_val()
1080 dup_cnt = btf_dump_name_dups(d, d->ident_names, name); in btf_dump_emit_enum32_val()
1083 btf_dump_printf(d, fmt_str, pfx(lvl + 1), name, dup_cnt, v->val); in btf_dump_emit_enum32_val()
1086 btf_dump_printf(d, fmt_str, pfx(lvl + 1), name, v->val); in btf_dump_emit_enum32_val()
1091 static void btf_dump_emit_enum64_val(struct btf_dump *d, in btf_dump_emit_enum64_val() argument
1104 name = btf_name_of(d, v->name_off); in btf_dump_emit_enum64_val()
1105 dup_cnt = btf_dump_name_dups(d, d->ident_names, name); in btf_dump_emit_enum64_val()
1110 btf_dump_printf(d, fmt_str, in btf_dump_emit_enum64_val()
1116 btf_dump_printf(d, fmt_str, in btf_dump_emit_enum64_val()
1122 static void btf_dump_emit_enum_def(struct btf_dump *d, __u32 id, in btf_dump_emit_enum_def() argument
1128 btf_dump_printf(d, "enum%s%s", in btf_dump_emit_enum_def()
1130 btf_dump_type_name(d, id)); in btf_dump_emit_enum_def()
1135 btf_dump_printf(d, " {"); in btf_dump_emit_enum_def()
1137 btf_dump_emit_enum32_val(d, t, lvl, vlen); in btf_dump_emit_enum_def()
1139 btf_dump_emit_enum64_val(d, t, lvl, vlen); in btf_dump_emit_enum_def()
1140 btf_dump_printf(d, "\n%s}", pfx(lvl)); in btf_dump_emit_enum_def()
1145 btf_dump_printf(d, " __attribute__((mode(byte)))"); in btf_dump_emit_enum_def()
1146 } else if (t->size == 8 && d->ptr_sz == 8) { in btf_dump_emit_enum_def()
1175 btf_dump_printf(d, " __attribute__((mode(word)))"); in btf_dump_emit_enum_def()
1180 static void btf_dump_emit_fwd_def(struct btf_dump *d, __u32 id, in btf_dump_emit_fwd_def() argument
1183 const char *name = btf_dump_type_name(d, id); in btf_dump_emit_fwd_def()
1186 btf_dump_printf(d, "union %s", name); in btf_dump_emit_fwd_def()
1188 btf_dump_printf(d, "struct %s", name); in btf_dump_emit_fwd_def()
1191 static void btf_dump_emit_typedef_def(struct btf_dump *d, __u32 id, in btf_dump_emit_typedef_def() argument
1194 const char *name = btf_dump_ident_name(d, id); in btf_dump_emit_typedef_def()
1203 btf_dump_printf(d, "typedef __builtin_va_list __gnuc_va_list"); in btf_dump_emit_typedef_def()
1207 btf_dump_printf(d, "typedef "); in btf_dump_emit_typedef_def()
1208 btf_dump_emit_type_decl(d, t->type, name, lvl); in btf_dump_emit_typedef_def()
1211 static int btf_dump_push_decl_stack_id(struct btf_dump *d, __u32 id) in btf_dump_push_decl_stack_id() argument
1216 if (d->decl_stack_cnt >= d->decl_stack_cap) { in btf_dump_push_decl_stack_id()
1217 new_cap = max(16, d->decl_stack_cap * 3 / 2); in btf_dump_push_decl_stack_id()
1218 new_stack = libbpf_reallocarray(d->decl_stack, new_cap, sizeof(new_stack[0])); in btf_dump_push_decl_stack_id()
1221 d->decl_stack = new_stack; in btf_dump_push_decl_stack_id()
1222 d->decl_stack_cap = new_cap; in btf_dump_push_decl_stack_id()
1225 d->decl_stack[d->decl_stack_cnt++] = id; in btf_dump_push_decl_stack_id()
1271 int btf_dump__emit_type_decl(struct btf_dump *d, __u32 id, in btf_dump__emit_type_decl() argument
1280 err = btf_dump_resize(d); in btf_dump__emit_type_decl()
1286 d->strip_mods = OPTS_GET(opts, strip_mods, false); in btf_dump__emit_type_decl()
1287 btf_dump_emit_type_decl(d, id, fname, lvl); in btf_dump__emit_type_decl()
1288 d->strip_mods = false; in btf_dump__emit_type_decl()
1292 static void btf_dump_emit_type_decl(struct btf_dump *d, __u32 id, in btf_dump_emit_type_decl() argument
1299 stack_start = d->decl_stack_cnt; in btf_dump_emit_type_decl()
1301 t = btf__type_by_id(d->btf, id); in btf_dump_emit_type_decl()
1302 if (d->strip_mods && btf_is_mod(t)) in btf_dump_emit_type_decl()
1305 err = btf_dump_push_decl_stack_id(d, id); in btf_dump_emit_type_decl()
1313 d->decl_stack_cnt = stack_start; in btf_dump_emit_type_decl()
1359 decl_stack.ids = d->decl_stack + stack_start; in btf_dump_emit_type_decl()
1360 decl_stack.cnt = d->decl_stack_cnt - stack_start; in btf_dump_emit_type_decl()
1361 btf_dump_emit_type_chain(d, &decl_stack, fname, lvl); in btf_dump_emit_type_decl()
1370 d->decl_stack_cnt = stack_start; in btf_dump_emit_type_decl()
1373 static void btf_dump_emit_mods(struct btf_dump *d, struct id_stack *decl_stack) in btf_dump_emit_mods() argument
1380 t = btf__type_by_id(d->btf, id); in btf_dump_emit_mods()
1384 btf_dump_printf(d, "volatile "); in btf_dump_emit_mods()
1387 btf_dump_printf(d, "const "); in btf_dump_emit_mods()
1390 btf_dump_printf(d, "restrict "); in btf_dump_emit_mods()
1399 static void btf_dump_drop_mods(struct btf_dump *d, struct id_stack *decl_stack) in btf_dump_drop_mods() argument
1406 t = btf__type_by_id(d->btf, id); in btf_dump_drop_mods()
1413 static void btf_dump_emit_name(const struct btf_dump *d, in btf_dump_emit_name() argument
1418 btf_dump_printf(d, "%s%s", separate ? " " : "", name); in btf_dump_emit_name()
1421 static void btf_dump_emit_type_chain(struct btf_dump *d, in btf_dump_emit_type_chain() argument
1444 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1445 btf_dump_printf(d, "void"); in btf_dump_emit_type_chain()
1450 t = btf__type_by_id(d->btf, id); in btf_dump_emit_type_chain()
1456 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1457 name = btf_name_of(d, t->name_off); in btf_dump_emit_type_chain()
1458 btf_dump_printf(d, "%s", name); in btf_dump_emit_type_chain()
1462 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1464 if (t->name_off == 0 && !d->skip_anon_defs) in btf_dump_emit_type_chain()
1465 btf_dump_emit_struct_def(d, id, t, lvl); in btf_dump_emit_type_chain()
1467 btf_dump_emit_struct_fwd(d, id, t); in btf_dump_emit_type_chain()
1471 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1473 if (t->name_off == 0 && !d->skip_anon_defs) in btf_dump_emit_type_chain()
1474 btf_dump_emit_enum_def(d, id, t, lvl); in btf_dump_emit_type_chain()
1476 btf_dump_emit_enum_fwd(d, id, t); in btf_dump_emit_type_chain()
1479 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1480 btf_dump_emit_fwd_def(d, id, t); in btf_dump_emit_type_chain()
1483 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1484 btf_dump_printf(d, "%s", btf_dump_ident_name(d, id)); in btf_dump_emit_type_chain()
1487 btf_dump_printf(d, "%s", last_was_ptr ? "*" : " *"); in btf_dump_emit_type_chain()
1490 btf_dump_printf(d, " volatile"); in btf_dump_emit_type_chain()
1493 btf_dump_printf(d, " const"); in btf_dump_emit_type_chain()
1496 btf_dump_printf(d, " restrict"); in btf_dump_emit_type_chain()
1499 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1500 name = btf_name_of(d, t->name_off); in btf_dump_emit_type_chain()
1502 btf_dump_printf(d, " __attribute__((%s))", name); in btf_dump_emit_type_chain()
1504 btf_dump_printf(d, " __attribute__((btf_type_tag(\"%s\")))", name); in btf_dump_emit_type_chain()
1521 btf_dump_drop_mods(d, decls); in btf_dump_emit_type_chain()
1524 btf_dump_emit_name(d, fname, last_was_ptr); in btf_dump_emit_type_chain()
1525 btf_dump_printf(d, "[%u]", a->nelems); in btf_dump_emit_type_chain()
1530 next_t = btf__type_by_id(d->btf, next_id); in btf_dump_emit_type_chain()
1534 btf_dump_printf(d, " "); in btf_dump_emit_type_chain()
1537 btf_dump_printf(d, "("); in btf_dump_emit_type_chain()
1538 btf_dump_emit_type_chain(d, decls, fname, lvl); in btf_dump_emit_type_chain()
1540 btf_dump_printf(d, ")"); in btf_dump_emit_type_chain()
1541 btf_dump_printf(d, "[%u]", a->nelems); in btf_dump_emit_type_chain()
1557 btf_dump_drop_mods(d, decls); in btf_dump_emit_type_chain()
1559 btf_dump_printf(d, " ("); in btf_dump_emit_type_chain()
1560 btf_dump_emit_type_chain(d, decls, fname, lvl); in btf_dump_emit_type_chain()
1561 btf_dump_printf(d, ")"); in btf_dump_emit_type_chain()
1563 btf_dump_emit_name(d, fname, last_was_ptr); in btf_dump_emit_type_chain()
1565 btf_dump_printf(d, "("); in btf_dump_emit_type_chain()
1575 btf_dump_printf(d, "void)"); in btf_dump_emit_type_chain()
1581 btf_dump_printf(d, ", "); in btf_dump_emit_type_chain()
1585 btf_dump_printf(d, "..."); in btf_dump_emit_type_chain()
1589 name = btf_name_of(d, p->name_off); in btf_dump_emit_type_chain()
1590 btf_dump_emit_type_decl(d, p->type, name, lvl); in btf_dump_emit_type_chain()
1593 btf_dump_printf(d, ")"); in btf_dump_emit_type_chain()
1605 btf_dump_emit_name(d, fname, last_was_ptr); in btf_dump_emit_type_chain()
1609 static void btf_dump_emit_type_cast(struct btf_dump *d, __u32 id, in btf_dump_emit_type_cast() argument
1618 if (d->typed_dump->is_array_member) in btf_dump_emit_type_cast()
1624 t = btf__type_by_id(d->btf, id); in btf_dump_emit_type_cast()
1629 btf_dump_printf(d, "("); in btf_dump_emit_type_cast()
1631 d->skip_anon_defs = true; in btf_dump_emit_type_cast()
1632 d->strip_mods = true; in btf_dump_emit_type_cast()
1633 btf_dump_emit_type_decl(d, id, "", 0); in btf_dump_emit_type_cast()
1634 d->strip_mods = false; in btf_dump_emit_type_cast()
1635 d->skip_anon_defs = false; in btf_dump_emit_type_cast()
1638 btf_dump_printf(d, ")"); in btf_dump_emit_type_cast()
1642 static size_t btf_dump_name_dups(struct btf_dump *d, struct hashmap *name_map, in btf_dump_name_dups() argument
1665 static const char *btf_dump_resolve_name(struct btf_dump *d, __u32 id, in btf_dump_resolve_name() argument
1668 struct btf_dump_type_aux_state *s = &d->type_states[id]; in btf_dump_resolve_name()
1669 const struct btf_type *t = btf__type_by_id(d->btf, id); in btf_dump_resolve_name()
1670 const char *orig_name = btf_name_of(d, t->name_off); in btf_dump_resolve_name()
1671 const char **cached_name = &d->cached_names[id]; in btf_dump_resolve_name()
1685 dup_cnt = btf_dump_name_dups(d, name_map, orig_name); in btf_dump_resolve_name()
1698 static const char *btf_dump_type_name(struct btf_dump *d, __u32 id) in btf_dump_type_name() argument
1700 return btf_dump_resolve_name(d, id, d->type_names); in btf_dump_type_name()
1703 static const char *btf_dump_ident_name(struct btf_dump *d, __u32 id) in btf_dump_ident_name() argument
1705 return btf_dump_resolve_name(d, id, d->ident_names); in btf_dump_ident_name()
1708 static int btf_dump_dump_type_data(struct btf_dump *d,
1716 static const char *btf_dump_data_newline(struct btf_dump *d) in btf_dump_data_newline() argument
1718 return d->typed_dump->compact || d->typed_dump->depth == 0 ? "" : "\n"; in btf_dump_data_newline()
1721 static const char *btf_dump_data_delim(struct btf_dump *d) in btf_dump_data_delim() argument
1723 return d->typed_dump->depth == 0 ? "" : ","; in btf_dump_data_delim()
1726 static void btf_dump_data_pfx(struct btf_dump *d) in btf_dump_data_pfx() argument
1728 int i, lvl = d->typed_dump->indent_lvl + d->typed_dump->depth; in btf_dump_data_pfx()
1730 if (d->typed_dump->compact) in btf_dump_data_pfx()
1734 btf_dump_printf(d, "%s", d->typed_dump->indent_str); in btf_dump_data_pfx()
1742 #define btf_dump_type_values(d, fmt, ...) \ argument
1743 btf_dump_printf(d, fmt "%s%s", \
1745 btf_dump_data_delim(d), \
1746 btf_dump_data_newline(d))
1748 static int btf_dump_unsupported_data(struct btf_dump *d, in btf_dump_unsupported_data() argument
1752 btf_dump_printf(d, "<unsupported kind:%u>", btf_kind(t)); in btf_dump_unsupported_data()
1756 static int btf_dump_get_bitfield_value(struct btf_dump *d, in btf_dump_get_bitfield_value() argument
1797 static int btf_dump_bitfield_check_zero(struct btf_dump *d, in btf_dump_bitfield_check_zero() argument
1806 err = btf_dump_get_bitfield_value(d, t, data, bits_offset, bit_sz, &check_num); in btf_dump_bitfield_check_zero()
1814 static int btf_dump_bitfield_data(struct btf_dump *d, in btf_dump_bitfield_data() argument
1823 err = btf_dump_get_bitfield_value(d, t, data, bits_offset, bit_sz, &print_num); in btf_dump_bitfield_data()
1827 btf_dump_type_values(d, "0x%llx", (unsigned long long)print_num); in btf_dump_bitfield_data()
1833 static int btf_dump_base_type_check_zero(struct btf_dump *d, in btf_dump_base_type_check_zero() argument
1845 nr_bytes = d->ptr_sz; in btf_dump_base_type_check_zero()
1870 static int btf_dump_int_data(struct btf_dump *d, in btf_dump_int_data() argument
1889 if (!ptr_is_aligned(d->btf, type_id, data)) { in btf_dump_int_data()
1912 btf_dump_type_values(d, "0x%llx", (unsigned long long)lsi); in btf_dump_int_data()
1914 btf_dump_type_values(d, "0x%llx%016llx", (unsigned long long)msi, in btf_dump_int_data()
1920 btf_dump_type_values(d, "%lld", *(long long *)data); in btf_dump_int_data()
1922 btf_dump_type_values(d, "%llu", *(unsigned long long *)data); in btf_dump_int_data()
1926 btf_dump_type_values(d, "%d", *(__s32 *)data); in btf_dump_int_data()
1928 btf_dump_type_values(d, "%u", *(__u32 *)data); in btf_dump_int_data()
1932 btf_dump_type_values(d, "%d", *(__s16 *)data); in btf_dump_int_data()
1934 btf_dump_type_values(d, "%u", *(__u16 *)data); in btf_dump_int_data()
1937 if (d->typed_dump->is_array_char) { in btf_dump_int_data()
1939 if (d->typed_dump->is_array_terminated) in btf_dump_int_data()
1942 btf_dump_type_values(d, "'\\0'"); in btf_dump_int_data()
1943 d->typed_dump->is_array_terminated = true; in btf_dump_int_data()
1947 btf_dump_type_values(d, "'%c'", *(char *)data); in btf_dump_int_data()
1952 btf_dump_type_values(d, "%d", *(__s8 *)data); in btf_dump_int_data()
1954 btf_dump_type_values(d, "%u", *(__u8 *)data); in btf_dump_int_data()
1965 double d; member
1969 static int btf_dump_float_data(struct btf_dump *d, in btf_dump_float_data() argument
1979 if (!ptr_is_aligned(d->btf, type_id, data)) { in btf_dump_float_data()
1986 btf_dump_type_values(d, "%Lf", flp->ld); in btf_dump_float_data()
1989 btf_dump_type_values(d, "%lf", flp->d); in btf_dump_float_data()
1992 btf_dump_type_values(d, "%f", flp->f); in btf_dump_float_data()
2001 static int btf_dump_var_data(struct btf_dump *d, in btf_dump_var_data() argument
2027 btf_dump_printf(d, "%s", l); in btf_dump_var_data()
2029 t = btf__type_by_id(d->btf, type_id); in btf_dump_var_data()
2030 btf_dump_emit_type_cast(d, type_id, false); in btf_dump_var_data()
2031 btf_dump_printf(d, " %s = ", btf_name_of(d, v->name_off)); in btf_dump_var_data()
2032 return btf_dump_dump_type_data(d, NULL, t, type_id, data, 0, 0); in btf_dump_var_data()
2035 static int btf_dump_string_data(struct btf_dump *d, in btf_dump_string_data() argument
2046 if ((void *)(chars + i) >= d->typed_dump->data_end) in btf_dump_string_data()
2056 btf_dump_data_pfx(d); in btf_dump_string_data()
2057 btf_dump_printf(d, "\""); in btf_dump_string_data()
2071 btf_dump_printf(d, "%c", c); in btf_dump_string_data()
2073 btf_dump_printf(d, "\\x%02x", (__u8)c); in btf_dump_string_data()
2076 btf_dump_printf(d, "\""); in btf_dump_string_data()
2081 static int btf_dump_array_data(struct btf_dump *d, in btf_dump_array_data() argument
2094 elem_type = skip_mods_and_typedefs(d->btf, elem_type_id, NULL); in btf_dump_array_data()
2095 elem_size = btf__resolve_size(d->btf, elem_type_id); in btf_dump_array_data()
2109 if (d->typed_dump->emit_strings && in btf_dump_array_data()
2110 btf_dump_string_data(d, t, id, data) == 0) { in btf_dump_array_data()
2113 d->typed_dump->is_array_char = true; in btf_dump_array_data()
2124 d->typed_dump->depth++; in btf_dump_array_data()
2125 btf_dump_printf(d, "[%s", btf_dump_data_newline(d)); in btf_dump_array_data()
2130 is_array_member = d->typed_dump->is_array_member; in btf_dump_array_data()
2131 d->typed_dump->is_array_member = true; in btf_dump_array_data()
2132 is_array_terminated = d->typed_dump->is_array_terminated; in btf_dump_array_data()
2133 d->typed_dump->is_array_terminated = false; in btf_dump_array_data()
2135 if (d->typed_dump->is_array_terminated) in btf_dump_array_data()
2137 btf_dump_dump_type_data(d, NULL, elem_type, elem_type_id, data, 0, 0); in btf_dump_array_data()
2139 d->typed_dump->is_array_member = is_array_member; in btf_dump_array_data()
2140 d->typed_dump->is_array_terminated = is_array_terminated; in btf_dump_array_data()
2141 d->typed_dump->depth--; in btf_dump_array_data()
2142 btf_dump_data_pfx(d); in btf_dump_array_data()
2143 btf_dump_type_values(d, "]"); in btf_dump_array_data()
2148 static int btf_dump_struct_data(struct btf_dump *d, in btf_dump_struct_data() argument
2164 d->typed_dump->depth++; in btf_dump_struct_data()
2165 btf_dump_printf(d, "{%s", btf_dump_data_newline(d)); in btf_dump_struct_data()
2173 mtype = btf__type_by_id(d->btf, m->type); in btf_dump_struct_data()
2174 mname = btf_name_of(d, m->name_off); in btf_dump_struct_data()
2178 err = btf_dump_dump_type_data(d, mname, mtype, m->type, data + moffset / 8, in btf_dump_struct_data()
2183 d->typed_dump->depth--; in btf_dump_struct_data()
2184 btf_dump_data_pfx(d); in btf_dump_struct_data()
2185 btf_dump_type_values(d, "}"); in btf_dump_struct_data()
2194 static int btf_dump_ptr_data(struct btf_dump *d, in btf_dump_ptr_data() argument
2199 if (ptr_is_aligned(d->btf, id, data) && d->ptr_sz == sizeof(void *)) { in btf_dump_ptr_data()
2200 btf_dump_type_values(d, "%p", *(void **)data); in btf_dump_ptr_data()
2204 memcpy(&pt, data, d->ptr_sz); in btf_dump_ptr_data()
2205 if (d->ptr_sz == 4) in btf_dump_ptr_data()
2206 btf_dump_type_values(d, "0x%x", pt.p); in btf_dump_ptr_data()
2208 btf_dump_type_values(d, "0x%llx", pt.lp); in btf_dump_ptr_data()
2213 static int btf_dump_get_enum_value(struct btf_dump *d, in btf_dump_get_enum_value() argument
2221 if (!ptr_is_aligned(d->btf, id, data)) { in btf_dump_get_enum_value()
2225 err = btf_dump_get_bitfield_value(d, t, data, 0, 0, &val); in btf_dump_get_enum_value()
2251 static int btf_dump_enum_data(struct btf_dump *d, in btf_dump_enum_data() argument
2260 err = btf_dump_get_enum_value(d, t, data, id, &value); in btf_dump_enum_data()
2271 btf_dump_type_values(d, "%s", btf_name_of(d, e->name_off)); in btf_dump_enum_data()
2275 btf_dump_type_values(d, is_signed ? "%d" : "%u", value); in btf_dump_enum_data()
2282 btf_dump_type_values(d, "%s", btf_name_of(d, e->name_off)); in btf_dump_enum_data()
2286 btf_dump_type_values(d, is_signed ? "%lldLL" : "%lluULL", in btf_dump_enum_data()
2292 static int btf_dump_datasec_data(struct btf_dump *d, in btf_dump_datasec_data() argument
2302 btf_dump_type_values(d, "SEC(\"%s\") ", btf_name_of(d, t->name_off)); in btf_dump_datasec_data()
2305 var = btf__type_by_id(d->btf, vsi->type); in btf_dump_datasec_data()
2306 err = btf_dump_dump_type_data(d, NULL, var, vsi->type, data + vsi->offset, 0, 0); in btf_dump_datasec_data()
2309 btf_dump_printf(d, ";"); in btf_dump_datasec_data()
2315 static int btf_dump_type_data_check_overflow(struct btf_dump *d, in btf_dump_type_data_check_overflow() argument
2334 return data + nr_bytes > d->typed_dump->data_end ? -E2BIG : nr_bytes; in btf_dump_type_data_check_overflow()
2337 size = btf__resolve_size(d->btf, id); in btf_dump_type_data_check_overflow()
2352 t = skip_mods_and_typedefs(d->btf, id, NULL); in btf_dump_type_data_check_overflow()
2365 if (data + bits_offset / 8 + size > d->typed_dump->data_end) in btf_dump_type_data_check_overflow()
2374 static int btf_dump_type_data_check_zero(struct btf_dump *d, in btf_dump_type_data_check_zero() argument
2395 if (d->typed_dump->emit_zeroes || d->typed_dump->depth == 0 || in btf_dump_type_data_check_zero()
2396 (d->typed_dump->is_array_member && in btf_dump_type_data_check_zero()
2397 !d->typed_dump->is_array_char)) in btf_dump_type_data_check_zero()
2400 t = skip_mods_and_typedefs(d->btf, id, NULL); in btf_dump_type_data_check_zero()
2405 return btf_dump_bitfield_check_zero(d, t, data, bits_offset, bit_sz); in btf_dump_type_data_check_zero()
2406 return btf_dump_base_type_check_zero(d, t, id, data); in btf_dump_type_data_check_zero()
2409 return btf_dump_base_type_check_zero(d, t, id, data); in btf_dump_type_data_check_zero()
2417 elem_size = btf__resolve_size(d->btf, elem_type_id); in btf_dump_type_data_check_zero()
2418 elem_type = skip_mods_and_typedefs(d->btf, elem_type_id, NULL); in btf_dump_type_data_check_zero()
2431 err = btf_dump_type_data_check_zero(d, elem_type, in btf_dump_type_data_check_zero()
2453 mtype = btf__type_by_id(d->btf, m->type); in btf_dump_type_data_check_zero()
2461 err = btf_dump_type_data_check_zero(d, mtype, m->type, data + moffset / 8, in btf_dump_type_data_check_zero()
2470 err = btf_dump_get_enum_value(d, t, data, id, &value); in btf_dump_type_data_check_zero()
2482 static int btf_dump_dump_type_data(struct btf_dump *d, in btf_dump_dump_type_data() argument
2492 size = btf_dump_type_data_check_overflow(d, t, id, data, bits_offset, bit_sz); in btf_dump_dump_type_data()
2495 err = btf_dump_type_data_check_zero(d, t, id, data, bits_offset, bit_sz); in btf_dump_dump_type_data()
2504 btf_dump_data_pfx(d); in btf_dump_dump_type_data()
2506 if (!d->typed_dump->skip_names) { in btf_dump_dump_type_data()
2508 btf_dump_printf(d, ".%s = ", fname); in btf_dump_dump_type_data()
2509 btf_dump_emit_type_cast(d, id, true); in btf_dump_dump_type_data()
2512 t = skip_mods_and_typedefs(d->btf, id, NULL); in btf_dump_dump_type_data()
2520 err = btf_dump_unsupported_data(d, t, id); in btf_dump_dump_type_data()
2524 err = btf_dump_bitfield_data(d, t, data, bits_offset, bit_sz); in btf_dump_dump_type_data()
2526 err = btf_dump_int_data(d, t, id, data, bits_offset); in btf_dump_dump_type_data()
2529 err = btf_dump_float_data(d, t, id, data); in btf_dump_dump_type_data()
2532 err = btf_dump_ptr_data(d, t, id, data); in btf_dump_dump_type_data()
2535 err = btf_dump_array_data(d, t, id, data); in btf_dump_dump_type_data()
2539 err = btf_dump_struct_data(d, t, id, data); in btf_dump_dump_type_data()
2548 err = btf_dump_get_bitfield_value(d, t, data, bits_offset, bit_sz, in btf_dump_dump_type_data()
2553 err = btf_dump_enum_data(d, t, id, &enum_val); in btf_dump_dump_type_data()
2555 err = btf_dump_enum_data(d, t, id, data); in btf_dump_dump_type_data()
2558 err = btf_dump_var_data(d, t, id, data); in btf_dump_dump_type_data()
2561 err = btf_dump_datasec_data(d, t, id, data); in btf_dump_dump_type_data()
2573 int btf_dump__dump_type_data(struct btf_dump *d, __u32 id, in btf_dump__dump_type_data() argument
2584 t = btf__type_by_id(d->btf, id); in btf_dump__dump_type_data()
2588 d->typed_dump = &typed_dump; in btf_dump__dump_type_data()
2589 d->typed_dump->data_end = data + data_sz; in btf_dump__dump_type_data()
2590 d->typed_dump->indent_lvl = OPTS_GET(opts, indent_level, 0); in btf_dump__dump_type_data()
2594 d->typed_dump->indent_str[0] = '\t'; in btf_dump__dump_type_data()
2596 libbpf_strlcpy(d->typed_dump->indent_str, opts->indent_str, in btf_dump__dump_type_data()
2597 sizeof(d->typed_dump->indent_str)); in btf_dump__dump_type_data()
2599 d->typed_dump->compact = OPTS_GET(opts, compact, false); in btf_dump__dump_type_data()
2600 d->typed_dump->skip_names = OPTS_GET(opts, skip_names, false); in btf_dump__dump_type_data()
2601 d->typed_dump->emit_zeroes = OPTS_GET(opts, emit_zeroes, false); in btf_dump__dump_type_data()
2602 d->typed_dump->emit_strings = OPTS_GET(opts, emit_strings, false); in btf_dump__dump_type_data()
2604 ret = btf_dump_dump_type_data(d, NULL, t, id, data, 0, 0); in btf_dump__dump_type_data()
2606 d->typed_dump = NULL; in btf_dump__dump_type_data()