Lines Matching full:d
131 static const char *btf_name_of(const struct btf_dump *d, __u32 name_off) in btf_name_of() argument
133 return btf__name_by_offset(d->btf, name_off); in btf_name_of()
136 static void btf_dump_printf(const struct btf_dump *d, const char *fmt, ...) in btf_dump_printf() argument
141 d->printf_fn(d->opts.ctx, fmt, args); in btf_dump_printf()
145 static int btf_dump_mark_referenced(struct btf_dump *d);
146 static int btf_dump_resize(struct btf_dump *d);
153 struct btf_dump *d; in btf_dump__new() local
156 d = calloc(1, sizeof(struct btf_dump)); in btf_dump__new()
157 if (!d) in btf_dump__new()
160 d->btf = btf; in btf_dump__new()
161 d->btf_ext = btf_ext; in btf_dump__new()
162 d->printf_fn = printf_fn; in btf_dump__new()
163 d->opts.ctx = opts ? opts->ctx : NULL; in btf_dump__new()
164 d->ptr_sz = btf__pointer_size(btf) ? : sizeof(void *); in btf_dump__new()
166 d->type_names = hashmap__new(str_hash_fn, str_equal_fn, NULL); in btf_dump__new()
167 if (IS_ERR(d->type_names)) { in btf_dump__new()
168 err = PTR_ERR(d->type_names); in btf_dump__new()
169 d->type_names = NULL; in btf_dump__new()
172 d->ident_names = hashmap__new(str_hash_fn, str_equal_fn, NULL); in btf_dump__new()
173 if (IS_ERR(d->ident_names)) { in btf_dump__new()
174 err = PTR_ERR(d->ident_names); in btf_dump__new()
175 d->ident_names = NULL; in btf_dump__new()
179 err = btf_dump_resize(d); in btf_dump__new()
183 return d; in btf_dump__new()
185 btf_dump__free(d); in btf_dump__new()
189 static int btf_dump_resize(struct btf_dump *d) in btf_dump_resize() argument
191 int err, last_id = btf__get_nr_types(d->btf); in btf_dump_resize()
193 if (last_id <= d->last_id) in btf_dump_resize()
196 if (libbpf_ensure_mem((void **)&d->type_states, &d->type_states_cap, in btf_dump_resize()
197 sizeof(*d->type_states), last_id + 1)) in btf_dump_resize()
199 if (libbpf_ensure_mem((void **)&d->cached_names, &d->cached_names_cap, in btf_dump_resize()
200 sizeof(*d->cached_names), last_id + 1)) in btf_dump_resize()
203 if (d->last_id == 0) { in btf_dump_resize()
205 d->type_states[0].order_state = ORDERED; in btf_dump_resize()
206 d->type_states[0].emit_state = EMITTED; in btf_dump_resize()
210 err = btf_dump_mark_referenced(d); in btf_dump_resize()
214 d->last_id = last_id; in btf_dump_resize()
218 void btf_dump__free(struct btf_dump *d) in btf_dump__free() argument
222 if (IS_ERR_OR_NULL(d)) in btf_dump__free()
225 free(d->type_states); in btf_dump__free()
226 if (d->cached_names) { in btf_dump__free()
228 for (i = 0; i <= d->last_id; i++) { in btf_dump__free()
229 if (d->cached_names[i]) in btf_dump__free()
230 free((void *)d->cached_names[i]); in btf_dump__free()
233 free(d->cached_names); in btf_dump__free()
234 free(d->emit_queue); in btf_dump__free()
235 free(d->decl_stack); in btf_dump__free()
236 hashmap__free(d->type_names); in btf_dump__free()
237 hashmap__free(d->ident_names); in btf_dump__free()
239 free(d); in btf_dump__free()
242 static int btf_dump_order_type(struct btf_dump *d, __u32 id, bool through_ptr);
243 static void btf_dump_emit_type(struct btf_dump *d, __u32 id, __u32 cont_id);
261 int btf_dump__dump_type(struct btf_dump *d, __u32 id) in btf_dump__dump_type() argument
265 if (id > btf__get_nr_types(d->btf)) in btf_dump__dump_type()
268 err = btf_dump_resize(d); in btf_dump__dump_type()
272 d->emit_queue_cnt = 0; in btf_dump__dump_type()
273 err = btf_dump_order_type(d, id, false); in btf_dump__dump_type()
277 for (i = 0; i < d->emit_queue_cnt; i++) in btf_dump__dump_type()
278 btf_dump_emit_type(d, d->emit_queue[i], 0 /*top-level*/); in btf_dump__dump_type()
295 static int btf_dump_mark_referenced(struct btf_dump *d) in btf_dump_mark_referenced() argument
297 int i, j, n = btf__get_nr_types(d->btf); in btf_dump_mark_referenced()
301 for (i = d->last_id + 1; i <= n; i++) { in btf_dump_mark_referenced()
302 t = btf__type_by_id(d->btf, i); in btf_dump_mark_referenced()
319 d->type_states[t->type].referenced = 1; in btf_dump_mark_referenced()
325 d->type_states[a->index_type].referenced = 1; in btf_dump_mark_referenced()
326 d->type_states[a->type].referenced = 1; in btf_dump_mark_referenced()
334 d->type_states[m->type].referenced = 1; in btf_dump_mark_referenced()
341 d->type_states[p->type].referenced = 1; in btf_dump_mark_referenced()
348 d->type_states[v->type].referenced = 1; in btf_dump_mark_referenced()
358 static int btf_dump_add_emit_queue_id(struct btf_dump *d, __u32 id) in btf_dump_add_emit_queue_id() argument
363 if (d->emit_queue_cnt >= d->emit_queue_cap) { in btf_dump_add_emit_queue_id()
364 new_cap = max(16, d->emit_queue_cap * 3 / 2); in btf_dump_add_emit_queue_id()
365 new_queue = libbpf_reallocarray(d->emit_queue, new_cap, sizeof(new_queue[0])); in btf_dump_add_emit_queue_id()
368 d->emit_queue = new_queue; in btf_dump_add_emit_queue_id()
369 d->emit_queue_cap = new_cap; in btf_dump_add_emit_queue_id()
372 d->emit_queue[d->emit_queue_cnt++] = id; in btf_dump_add_emit_queue_id()
450 static int btf_dump_order_type(struct btf_dump *d, __u32 id, bool through_ptr) in btf_dump_order_type() argument
463 struct btf_dump_type_aux_state *tstate = &d->type_states[id]; in btf_dump_order_type()
472 t = btf__type_by_id(d->btf, id); in btf_dump_order_type()
489 err = btf_dump_order_type(d, t->type, true); in btf_dump_order_type()
494 return btf_dump_order_type(d, btf_array(t)->type, false); in btf_dump_order_type()
511 err = btf_dump_order_type(d, m->type, false); in btf_dump_order_type()
517 err = btf_dump_add_emit_queue_id(d, id); in btf_dump_order_type()
533 err = btf_dump_add_emit_queue_id(d, id); in btf_dump_order_type()
543 is_strong = btf_dump_order_type(d, t->type, through_ptr); in btf_dump_order_type()
552 err = btf_dump_add_emit_queue_id(d, id); in btf_dump_order_type()
556 d->type_states[id].order_state = ORDERED; in btf_dump_order_type()
562 return btf_dump_order_type(d, t->type, through_ptr); in btf_dump_order_type()
568 err = btf_dump_order_type(d, t->type, through_ptr); in btf_dump_order_type()
575 err = btf_dump_order_type(d, p->type, through_ptr); in btf_dump_order_type()
586 d->type_states[id].order_state = ORDERED; in btf_dump_order_type()
594 static void btf_dump_emit_missing_aliases(struct btf_dump *d, __u32 id,
597 static void btf_dump_emit_struct_fwd(struct btf_dump *d, __u32 id,
599 static void btf_dump_emit_struct_def(struct btf_dump *d, __u32 id,
602 static void btf_dump_emit_enum_fwd(struct btf_dump *d, __u32 id,
604 static void btf_dump_emit_enum_def(struct btf_dump *d, __u32 id,
607 static void btf_dump_emit_fwd_def(struct btf_dump *d, __u32 id,
610 static void btf_dump_emit_typedef_def(struct btf_dump *d, __u32 id,
619 static void btf_dump_emit_type_decl(struct btf_dump *d, __u32 id,
621 static void btf_dump_emit_type_chain(struct btf_dump *d,
625 static const char *btf_dump_type_name(struct btf_dump *d, __u32 id);
626 static const char *btf_dump_ident_name(struct btf_dump *d, __u32 id);
627 static size_t btf_dump_name_dups(struct btf_dump *d, struct hashmap *name_map,
630 static bool btf_dump_is_blacklisted(struct btf_dump *d, __u32 id) in btf_dump_is_blacklisted() argument
632 const struct btf_type *t = btf__type_by_id(d->btf, id); in btf_dump_is_blacklisted()
642 return strcmp(btf_name_of(d, t->name_off), "__builtin_va_list") == 0; in btf_dump_is_blacklisted()
663 static void btf_dump_emit_type(struct btf_dump *d, __u32 id, __u32 cont_id) in btf_dump_emit_type() argument
665 struct btf_dump_type_aux_state *tstate = &d->type_states[id]; in btf_dump_emit_type()
673 t = btf__type_by_id(d->btf, id); in btf_dump_emit_type()
694 btf_dump_emit_struct_fwd(d, id, t); in btf_dump_emit_type()
695 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
704 if (!btf_dump_is_blacklisted(d, id)) { in btf_dump_emit_type()
705 btf_dump_emit_typedef_def(d, id, t, 0); in btf_dump_emit_type()
706 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
720 btf_dump_emit_missing_aliases(d, id, t); in btf_dump_emit_type()
726 btf_dump_emit_enum_def(d, id, t, 0); in btf_dump_emit_type()
727 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
735 btf_dump_emit_type(d, t->type, cont_id); in btf_dump_emit_type()
738 btf_dump_emit_type(d, btf_array(t)->type, cont_id); in btf_dump_emit_type()
741 btf_dump_emit_fwd_def(d, id, t); in btf_dump_emit_type()
742 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
747 btf_dump_emit_type(d, t->type, id); in btf_dump_emit_type()
755 if (!tstate->fwd_emitted && !btf_dump_is_blacklisted(d, id)) { in btf_dump_emit_type()
756 btf_dump_emit_typedef_def(d, id, t, 0); in btf_dump_emit_type()
757 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
778 btf_dump_emit_type(d, m->type, new_cont_id); in btf_dump_emit_type()
780 btf_dump_emit_struct_fwd(d, id, t); in btf_dump_emit_type()
781 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
786 btf_dump_emit_struct_def(d, id, t, 0); in btf_dump_emit_type()
787 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
798 btf_dump_emit_type(d, t->type, cont_id); in btf_dump_emit_type()
800 btf_dump_emit_type(d, p->type, cont_id); in btf_dump_emit_type()
843 static void btf_dump_emit_bit_padding(const struct btf_dump *d, in btf_dump_emit_bit_padding() argument
848 int ptr_bits = d->ptr_sz * 8; in btf_dump_emit_bit_padding()
874 btf_dump_printf(d, "\n%s%s: %d;", pfx(lvl), pad_type, pad_bits); in btf_dump_emit_bit_padding()
879 static void btf_dump_emit_struct_fwd(struct btf_dump *d, __u32 id, in btf_dump_emit_struct_fwd() argument
882 btf_dump_printf(d, "%s%s%s", in btf_dump_emit_struct_fwd()
885 btf_dump_type_name(d, id)); in btf_dump_emit_struct_fwd()
888 static void btf_dump_emit_struct_def(struct btf_dump *d, in btf_dump_emit_struct_def() argument
898 packed = is_struct ? btf_is_struct_packed(d->btf, id, t) : 0; in btf_dump_emit_struct_def()
900 btf_dump_printf(d, "%s%s%s {", in btf_dump_emit_struct_def()
903 btf_dump_type_name(d, id)); in btf_dump_emit_struct_def()
909 fname = btf_name_of(d, m->name_off); in btf_dump_emit_struct_def()
912 align = packed ? 1 : btf__align_of(d->btf, m->type); in btf_dump_emit_struct_def()
914 btf_dump_emit_bit_padding(d, off, m_off, m_sz, align, lvl + 1); in btf_dump_emit_struct_def()
915 btf_dump_printf(d, "\n%s", pfx(lvl + 1)); in btf_dump_emit_struct_def()
916 btf_dump_emit_type_decl(d, m->type, fname, lvl + 1); in btf_dump_emit_struct_def()
919 btf_dump_printf(d, ": %d", m_sz); in btf_dump_emit_struct_def()
922 m_sz = max((__s64)0, btf__resolve_size(d->btf, m->type)); in btf_dump_emit_struct_def()
925 btf_dump_printf(d, ";"); in btf_dump_emit_struct_def()
930 align = packed ? 1 : btf__align_of(d->btf, id); in btf_dump_emit_struct_def()
931 btf_dump_emit_bit_padding(d, off, t->size * 8, 0, align, in btf_dump_emit_struct_def()
936 btf_dump_printf(d, "\n"); in btf_dump_emit_struct_def()
937 btf_dump_printf(d, "%s}", pfx(lvl)); in btf_dump_emit_struct_def()
939 btf_dump_printf(d, " __attribute__((packed))"); in btf_dump_emit_struct_def()
953 static void btf_dump_emit_missing_aliases(struct btf_dump *d, __u32 id, in btf_dump_emit_missing_aliases() argument
956 const char *name = btf_dump_type_name(d, id); in btf_dump_emit_missing_aliases()
961 btf_dump_printf(d, "typedef %s %s;\n\n", in btf_dump_emit_missing_aliases()
968 static void btf_dump_emit_enum_fwd(struct btf_dump *d, __u32 id, in btf_dump_emit_enum_fwd() argument
971 btf_dump_printf(d, "enum %s", btf_dump_type_name(d, id)); in btf_dump_emit_enum_fwd()
974 static void btf_dump_emit_enum_def(struct btf_dump *d, __u32 id, in btf_dump_emit_enum_def() argument
984 btf_dump_printf(d, "enum%s%s", in btf_dump_emit_enum_def()
986 btf_dump_type_name(d, id)); in btf_dump_emit_enum_def()
989 btf_dump_printf(d, " {"); in btf_dump_emit_enum_def()
991 name = btf_name_of(d, v->name_off); in btf_dump_emit_enum_def()
993 dup_cnt = btf_dump_name_dups(d, d->ident_names, name); in btf_dump_emit_enum_def()
995 btf_dump_printf(d, "\n%s%s___%zu = %u,", in btf_dump_emit_enum_def()
999 btf_dump_printf(d, "\n%s%s = %u,", in btf_dump_emit_enum_def()
1004 btf_dump_printf(d, "\n%s}", pfx(lvl)); in btf_dump_emit_enum_def()
1008 static void btf_dump_emit_fwd_def(struct btf_dump *d, __u32 id, in btf_dump_emit_fwd_def() argument
1011 const char *name = btf_dump_type_name(d, id); in btf_dump_emit_fwd_def()
1014 btf_dump_printf(d, "union %s", name); in btf_dump_emit_fwd_def()
1016 btf_dump_printf(d, "struct %s", name); in btf_dump_emit_fwd_def()
1019 static void btf_dump_emit_typedef_def(struct btf_dump *d, __u32 id, in btf_dump_emit_typedef_def() argument
1022 const char *name = btf_dump_ident_name(d, id); in btf_dump_emit_typedef_def()
1031 btf_dump_printf(d, "typedef __builtin_va_list __gnuc_va_list"); in btf_dump_emit_typedef_def()
1035 btf_dump_printf(d, "typedef "); in btf_dump_emit_typedef_def()
1036 btf_dump_emit_type_decl(d, t->type, name, lvl); in btf_dump_emit_typedef_def()
1039 static int btf_dump_push_decl_stack_id(struct btf_dump *d, __u32 id) in btf_dump_push_decl_stack_id() argument
1044 if (d->decl_stack_cnt >= d->decl_stack_cap) { in btf_dump_push_decl_stack_id()
1045 new_cap = max(16, d->decl_stack_cap * 3 / 2); in btf_dump_push_decl_stack_id()
1046 new_stack = libbpf_reallocarray(d->decl_stack, new_cap, sizeof(new_stack[0])); in btf_dump_push_decl_stack_id()
1049 d->decl_stack = new_stack; in btf_dump_push_decl_stack_id()
1050 d->decl_stack_cap = new_cap; in btf_dump_push_decl_stack_id()
1053 d->decl_stack[d->decl_stack_cnt++] = id; in btf_dump_push_decl_stack_id()
1099 int btf_dump__emit_type_decl(struct btf_dump *d, __u32 id, in btf_dump__emit_type_decl() argument
1108 err = btf_dump_resize(d); in btf_dump__emit_type_decl()
1114 d->strip_mods = OPTS_GET(opts, strip_mods, false); in btf_dump__emit_type_decl()
1115 btf_dump_emit_type_decl(d, id, fname, lvl); in btf_dump__emit_type_decl()
1116 d->strip_mods = false; in btf_dump__emit_type_decl()
1120 static void btf_dump_emit_type_decl(struct btf_dump *d, __u32 id, in btf_dump_emit_type_decl() argument
1127 stack_start = d->decl_stack_cnt; in btf_dump_emit_type_decl()
1129 t = btf__type_by_id(d->btf, id); in btf_dump_emit_type_decl()
1130 if (d->strip_mods && btf_is_mod(t)) in btf_dump_emit_type_decl()
1133 err = btf_dump_push_decl_stack_id(d, id); in btf_dump_emit_type_decl()
1140 pr_warn("not enough memory for decl stack:%d", err); in btf_dump_emit_type_decl()
1141 d->decl_stack_cnt = stack_start; in btf_dump_emit_type_decl()
1185 decl_stack.ids = d->decl_stack + stack_start; in btf_dump_emit_type_decl()
1186 decl_stack.cnt = d->decl_stack_cnt - stack_start; in btf_dump_emit_type_decl()
1187 btf_dump_emit_type_chain(d, &decl_stack, fname, lvl); in btf_dump_emit_type_decl()
1196 d->decl_stack_cnt = stack_start; in btf_dump_emit_type_decl()
1199 static void btf_dump_emit_mods(struct btf_dump *d, struct id_stack *decl_stack) in btf_dump_emit_mods() argument
1206 t = btf__type_by_id(d->btf, id); in btf_dump_emit_mods()
1210 btf_dump_printf(d, "volatile "); in btf_dump_emit_mods()
1213 btf_dump_printf(d, "const "); in btf_dump_emit_mods()
1216 btf_dump_printf(d, "restrict "); in btf_dump_emit_mods()
1225 static void btf_dump_drop_mods(struct btf_dump *d, struct id_stack *decl_stack) in btf_dump_drop_mods() argument
1232 t = btf__type_by_id(d->btf, id); in btf_dump_drop_mods()
1239 static void btf_dump_emit_name(const struct btf_dump *d, in btf_dump_emit_name() argument
1244 btf_dump_printf(d, "%s%s", separate ? " " : "", name); in btf_dump_emit_name()
1247 static void btf_dump_emit_type_chain(struct btf_dump *d, in btf_dump_emit_type_chain() argument
1270 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1271 btf_dump_printf(d, "void"); in btf_dump_emit_type_chain()
1276 t = btf__type_by_id(d->btf, id); in btf_dump_emit_type_chain()
1282 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1283 name = btf_name_of(d, t->name_off); in btf_dump_emit_type_chain()
1284 btf_dump_printf(d, "%s", name); in btf_dump_emit_type_chain()
1288 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1290 if (t->name_off == 0 && !d->skip_anon_defs) in btf_dump_emit_type_chain()
1291 btf_dump_emit_struct_def(d, id, t, lvl); in btf_dump_emit_type_chain()
1293 btf_dump_emit_struct_fwd(d, id, t); in btf_dump_emit_type_chain()
1296 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1298 if (t->name_off == 0 && !d->skip_anon_defs) in btf_dump_emit_type_chain()
1299 btf_dump_emit_enum_def(d, id, t, lvl); in btf_dump_emit_type_chain()
1301 btf_dump_emit_enum_fwd(d, id, t); in btf_dump_emit_type_chain()
1304 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1305 btf_dump_emit_fwd_def(d, id, t); in btf_dump_emit_type_chain()
1308 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1309 btf_dump_printf(d, "%s", btf_dump_ident_name(d, id)); in btf_dump_emit_type_chain()
1312 btf_dump_printf(d, "%s", last_was_ptr ? "*" : " *"); in btf_dump_emit_type_chain()
1315 btf_dump_printf(d, " volatile"); in btf_dump_emit_type_chain()
1318 btf_dump_printf(d, " const"); in btf_dump_emit_type_chain()
1321 btf_dump_printf(d, " restrict"); in btf_dump_emit_type_chain()
1338 btf_dump_drop_mods(d, decls); in btf_dump_emit_type_chain()
1341 btf_dump_emit_name(d, fname, last_was_ptr); in btf_dump_emit_type_chain()
1342 btf_dump_printf(d, "[%u]", a->nelems); in btf_dump_emit_type_chain()
1347 next_t = btf__type_by_id(d->btf, next_id); in btf_dump_emit_type_chain()
1351 btf_dump_printf(d, " "); in btf_dump_emit_type_chain()
1354 btf_dump_printf(d, "("); in btf_dump_emit_type_chain()
1355 btf_dump_emit_type_chain(d, decls, fname, lvl); in btf_dump_emit_type_chain()
1357 btf_dump_printf(d, ")"); in btf_dump_emit_type_chain()
1358 btf_dump_printf(d, "[%u]", a->nelems); in btf_dump_emit_type_chain()
1374 btf_dump_drop_mods(d, decls); in btf_dump_emit_type_chain()
1376 btf_dump_printf(d, " ("); in btf_dump_emit_type_chain()
1377 btf_dump_emit_type_chain(d, decls, fname, lvl); in btf_dump_emit_type_chain()
1378 btf_dump_printf(d, ")"); in btf_dump_emit_type_chain()
1380 btf_dump_emit_name(d, fname, last_was_ptr); in btf_dump_emit_type_chain()
1382 btf_dump_printf(d, "("); in btf_dump_emit_type_chain()
1390 btf_dump_printf(d, ")"); in btf_dump_emit_type_chain()
1396 btf_dump_printf(d, ", "); in btf_dump_emit_type_chain()
1400 btf_dump_printf(d, "..."); in btf_dump_emit_type_chain()
1404 name = btf_name_of(d, p->name_off); in btf_dump_emit_type_chain()
1405 btf_dump_emit_type_decl(d, p->type, name, lvl); in btf_dump_emit_type_chain()
1408 btf_dump_printf(d, ")"); in btf_dump_emit_type_chain()
1420 btf_dump_emit_name(d, fname, last_was_ptr); in btf_dump_emit_type_chain()
1424 static void btf_dump_emit_type_cast(struct btf_dump *d, __u32 id, in btf_dump_emit_type_cast() argument
1433 if (d->typed_dump->is_array_member) in btf_dump_emit_type_cast()
1439 t = btf__type_by_id(d->btf, id); in btf_dump_emit_type_cast()
1444 btf_dump_printf(d, "("); in btf_dump_emit_type_cast()
1446 d->skip_anon_defs = true; in btf_dump_emit_type_cast()
1447 d->strip_mods = true; in btf_dump_emit_type_cast()
1448 btf_dump_emit_type_decl(d, id, "", 0); in btf_dump_emit_type_cast()
1449 d->strip_mods = false; in btf_dump_emit_type_cast()
1450 d->skip_anon_defs = false; in btf_dump_emit_type_cast()
1453 btf_dump_printf(d, ")"); in btf_dump_emit_type_cast()
1457 static size_t btf_dump_name_dups(struct btf_dump *d, struct hashmap *name_map, in btf_dump_name_dups() argument
1469 static const char *btf_dump_resolve_name(struct btf_dump *d, __u32 id, in btf_dump_resolve_name() argument
1472 struct btf_dump_type_aux_state *s = &d->type_states[id]; in btf_dump_resolve_name()
1473 const struct btf_type *t = btf__type_by_id(d->btf, id); in btf_dump_resolve_name()
1474 const char *orig_name = btf_name_of(d, t->name_off); in btf_dump_resolve_name()
1475 const char **cached_name = &d->cached_names[id]; in btf_dump_resolve_name()
1484 dup_cnt = btf_dump_name_dups(d, name_map, orig_name); in btf_dump_resolve_name()
1497 static const char *btf_dump_type_name(struct btf_dump *d, __u32 id) in btf_dump_type_name() argument
1499 return btf_dump_resolve_name(d, id, d->type_names); in btf_dump_type_name()
1502 static const char *btf_dump_ident_name(struct btf_dump *d, __u32 id) in btf_dump_ident_name() argument
1504 return btf_dump_resolve_name(d, id, d->ident_names); in btf_dump_ident_name()
1507 static int btf_dump_dump_type_data(struct btf_dump *d,
1515 static const char *btf_dump_data_newline(struct btf_dump *d) in btf_dump_data_newline() argument
1517 return d->typed_dump->compact || d->typed_dump->depth == 0 ? "" : "\n"; in btf_dump_data_newline()
1520 static const char *btf_dump_data_delim(struct btf_dump *d) in btf_dump_data_delim() argument
1522 return d->typed_dump->depth == 0 ? "" : ","; in btf_dump_data_delim()
1525 static void btf_dump_data_pfx(struct btf_dump *d) in btf_dump_data_pfx() argument
1527 int i, lvl = d->typed_dump->indent_lvl + d->typed_dump->depth; in btf_dump_data_pfx()
1529 if (d->typed_dump->compact) in btf_dump_data_pfx()
1533 btf_dump_printf(d, "%s", d->typed_dump->indent_str); in btf_dump_data_pfx()
1541 #define btf_dump_type_values(d, fmt, ...) \ argument
1542 btf_dump_printf(d, fmt "%s%s", \
1544 btf_dump_data_delim(d), \
1545 btf_dump_data_newline(d))
1547 static int btf_dump_unsupported_data(struct btf_dump *d, in btf_dump_unsupported_data() argument
1551 btf_dump_printf(d, "<unsupported kind:%u>", btf_kind(t)); in btf_dump_unsupported_data()
1555 static int btf_dump_get_bitfield_value(struct btf_dump *d, in btf_dump_get_bitfield_value() argument
1571 pr_warn("unexpected bitfield size %d\n", sz); in btf_dump_get_bitfield_value()
1597 static int btf_dump_bitfield_check_zero(struct btf_dump *d, in btf_dump_bitfield_check_zero() argument
1606 err = btf_dump_get_bitfield_value(d, t, data, bits_offset, bit_sz, &check_num); in btf_dump_bitfield_check_zero()
1614 static int btf_dump_bitfield_data(struct btf_dump *d, in btf_dump_bitfield_data() argument
1623 err = btf_dump_get_bitfield_value(d, t, data, bits_offset, bit_sz, &print_num); in btf_dump_bitfield_data()
1627 btf_dump_type_values(d, "0x%llx", (unsigned long long)print_num); in btf_dump_bitfield_data()
1633 static int btf_dump_base_type_check_zero(struct btf_dump *d, in btf_dump_base_type_check_zero() argument
1645 nr_bytes = d->ptr_sz; in btf_dump_base_type_check_zero()
1650 pr_warn("unexpected size %d for id [%u]\n", nr_bytes, id); in btf_dump_base_type_check_zero()
1664 static int btf_dump_int_data(struct btf_dump *d, in btf_dump_int_data() argument
1675 pr_warn("unexpected size %d for id [%u]\n", sz, type_id); in btf_dump_int_data()
1683 return btf_dump_bitfield_data(d, t, data, 0, 0); in btf_dump_int_data()
1703 btf_dump_type_values(d, "0x%llx", (unsigned long long)lsi); in btf_dump_int_data()
1705 btf_dump_type_values(d, "0x%llx%016llx", (unsigned long long)msi, in btf_dump_int_data()
1711 btf_dump_type_values(d, "%lld", *(long long *)data); in btf_dump_int_data()
1713 btf_dump_type_values(d, "%llu", *(unsigned long long *)data); in btf_dump_int_data()
1717 btf_dump_type_values(d, "%d", *(__s32 *)data); in btf_dump_int_data()
1719 btf_dump_type_values(d, "%u", *(__u32 *)data); in btf_dump_int_data()
1723 btf_dump_type_values(d, "%d", *(__s16 *)data); in btf_dump_int_data()
1725 btf_dump_type_values(d, "%u", *(__u16 *)data); in btf_dump_int_data()
1728 if (d->typed_dump->is_array_char) { in btf_dump_int_data()
1730 if (d->typed_dump->is_array_terminated) in btf_dump_int_data()
1733 d->typed_dump->is_array_terminated = true; in btf_dump_int_data()
1737 btf_dump_type_values(d, "'%c'", *(char *)data); in btf_dump_int_data()
1742 btf_dump_type_values(d, "%d", *(__s8 *)data); in btf_dump_int_data()
1744 btf_dump_type_values(d, "%u", *(__u8 *)data); in btf_dump_int_data()
1747 pr_warn("unexpected sz %d for id [%u]\n", sz, type_id); in btf_dump_int_data()
1755 double d; member
1759 static int btf_dump_float_data(struct btf_dump *d, in btf_dump_float_data() argument
1776 btf_dump_type_values(d, "%Lf", flp->ld); in btf_dump_float_data()
1779 btf_dump_type_values(d, "%lf", flp->d); in btf_dump_float_data()
1782 btf_dump_type_values(d, "%f", flp->f); in btf_dump_float_data()
1785 pr_warn("unexpected size %d for id [%u]\n", sz, type_id); in btf_dump_float_data()
1791 static int btf_dump_var_data(struct btf_dump *d, in btf_dump_var_data() argument
1817 btf_dump_printf(d, "%s", l); in btf_dump_var_data()
1819 t = btf__type_by_id(d->btf, type_id); in btf_dump_var_data()
1820 btf_dump_emit_type_cast(d, type_id, false); in btf_dump_var_data()
1821 btf_dump_printf(d, " %s = ", btf_name_of(d, v->name_off)); in btf_dump_var_data()
1822 return btf_dump_dump_type_data(d, NULL, t, type_id, data, 0, 0); in btf_dump_var_data()
1825 static int btf_dump_array_data(struct btf_dump *d, in btf_dump_array_data() argument
1836 elem_type = skip_mods_and_typedefs(d->btf, elem_type_id, NULL); in btf_dump_array_data()
1837 elem_size = btf__resolve_size(d->btf, elem_type_id); in btf_dump_array_data()
1839 pr_warn("unexpected elem size %d for array type [%u]\n", elem_size, id); in btf_dump_array_data()
1850 d->typed_dump->is_array_char = true; in btf_dump_array_data()
1860 d->typed_dump->depth++; in btf_dump_array_data()
1861 btf_dump_printf(d, "[%s", btf_dump_data_newline(d)); in btf_dump_array_data()
1866 is_array_member = d->typed_dump->is_array_member; in btf_dump_array_data()
1867 d->typed_dump->is_array_member = true; in btf_dump_array_data()
1869 if (d->typed_dump->is_array_terminated) in btf_dump_array_data()
1871 btf_dump_dump_type_data(d, NULL, elem_type, elem_type_id, data, 0, 0); in btf_dump_array_data()
1873 d->typed_dump->is_array_member = is_array_member; in btf_dump_array_data()
1874 d->typed_dump->depth--; in btf_dump_array_data()
1875 btf_dump_data_pfx(d); in btf_dump_array_data()
1876 btf_dump_type_values(d, "]"); in btf_dump_array_data()
1881 static int btf_dump_struct_data(struct btf_dump *d, in btf_dump_struct_data() argument
1897 d->typed_dump->depth++; in btf_dump_struct_data()
1898 btf_dump_printf(d, "{%s", btf_dump_data_newline(d)); in btf_dump_struct_data()
1906 mtype = btf__type_by_id(d->btf, m->type); in btf_dump_struct_data()
1907 mname = btf_name_of(d, m->name_off); in btf_dump_struct_data()
1911 err = btf_dump_dump_type_data(d, mname, mtype, m->type, data + moffset / 8, in btf_dump_struct_data()
1916 d->typed_dump->depth--; in btf_dump_struct_data()
1917 btf_dump_data_pfx(d); in btf_dump_struct_data()
1918 btf_dump_type_values(d, "}"); in btf_dump_struct_data()
1927 static int btf_dump_ptr_data(struct btf_dump *d, in btf_dump_ptr_data() argument
1932 if (ptr_is_aligned(data, d->ptr_sz) && d->ptr_sz == sizeof(void *)) { in btf_dump_ptr_data()
1933 btf_dump_type_values(d, "%p", *(void **)data); in btf_dump_ptr_data()
1937 memcpy(&pt, data, d->ptr_sz); in btf_dump_ptr_data()
1938 if (d->ptr_sz == 4) in btf_dump_ptr_data()
1939 btf_dump_type_values(d, "0x%x", pt.p); in btf_dump_ptr_data()
1941 btf_dump_type_values(d, "0x%llx", pt.lp); in btf_dump_ptr_data()
1946 static int btf_dump_get_enum_value(struct btf_dump *d, in btf_dump_get_enum_value() argument
1959 err = btf_dump_get_bitfield_value(d, t, data, 0, 0, &val); in btf_dump_get_enum_value()
1980 pr_warn("unexpected size %d for enum, id:[%u]\n", t->size, id); in btf_dump_get_enum_value()
1985 static int btf_dump_enum_data(struct btf_dump *d, in btf_dump_enum_data() argument
1994 err = btf_dump_get_enum_value(d, t, data, id, &value); in btf_dump_enum_data()
2001 btf_dump_type_values(d, "%s", btf_name_of(d, e->name_off)); in btf_dump_enum_data()
2005 btf_dump_type_values(d, "%d", value); in btf_dump_enum_data()
2009 static int btf_dump_datasec_data(struct btf_dump *d, in btf_dump_datasec_data() argument
2019 btf_dump_type_values(d, "SEC(\"%s\") ", btf_name_of(d, t->name_off)); in btf_dump_datasec_data()
2022 var = btf__type_by_id(d->btf, vsi->type); in btf_dump_datasec_data()
2023 err = btf_dump_dump_type_data(d, NULL, var, vsi->type, data + vsi->offset, 0, 0); in btf_dump_datasec_data()
2026 btf_dump_printf(d, ";"); in btf_dump_datasec_data()
2032 static int btf_dump_type_data_check_overflow(struct btf_dump *d, in btf_dump_type_data_check_overflow() argument
2038 __s64 size = btf__resolve_size(d->btf, id); in btf_dump_type_data_check_overflow()
2053 t = skip_mods_and_typedefs(d->btf, id, NULL); in btf_dump_type_data_check_overflow()
2065 if (data + bits_offset / 8 + size > d->typed_dump->data_end) in btf_dump_type_data_check_overflow()
2074 static int btf_dump_type_data_check_zero(struct btf_dump *d, in btf_dump_type_data_check_zero() argument
2095 if (d->typed_dump->emit_zeroes || d->typed_dump->depth == 0 || in btf_dump_type_data_check_zero()
2096 (d->typed_dump->is_array_member && in btf_dump_type_data_check_zero()
2097 !d->typed_dump->is_array_char)) in btf_dump_type_data_check_zero()
2100 t = skip_mods_and_typedefs(d->btf, id, NULL); in btf_dump_type_data_check_zero()
2105 return btf_dump_bitfield_check_zero(d, t, data, bits_offset, bit_sz); in btf_dump_type_data_check_zero()
2106 return btf_dump_base_type_check_zero(d, t, id, data); in btf_dump_type_data_check_zero()
2109 return btf_dump_base_type_check_zero(d, t, id, data); in btf_dump_type_data_check_zero()
2117 elem_size = btf__resolve_size(d->btf, elem_type_id); in btf_dump_type_data_check_zero()
2118 elem_type = skip_mods_and_typedefs(d->btf, elem_type_id, NULL); in btf_dump_type_data_check_zero()
2131 err = btf_dump_type_data_check_zero(d, elem_type, in btf_dump_type_data_check_zero()
2153 mtype = btf__type_by_id(d->btf, m->type); in btf_dump_type_data_check_zero()
2161 err = btf_dump_type_data_check_zero(d, mtype, m->type, data + moffset / 8, in btf_dump_type_data_check_zero()
2169 err = btf_dump_get_enum_value(d, t, data, id, &value); in btf_dump_type_data_check_zero()
2181 static int btf_dump_dump_type_data(struct btf_dump *d, in btf_dump_dump_type_data() argument
2191 size = btf_dump_type_data_check_overflow(d, t, id, data, bits_offset); in btf_dump_dump_type_data()
2194 err = btf_dump_type_data_check_zero(d, t, id, data, bits_offset, bit_sz); in btf_dump_dump_type_data()
2203 btf_dump_data_pfx(d); in btf_dump_dump_type_data()
2205 if (!d->typed_dump->skip_names) { in btf_dump_dump_type_data()
2207 btf_dump_printf(d, ".%s = ", fname); in btf_dump_dump_type_data()
2208 btf_dump_emit_type_cast(d, id, true); in btf_dump_dump_type_data()
2211 t = skip_mods_and_typedefs(d->btf, id, NULL); in btf_dump_dump_type_data()
2218 err = btf_dump_unsupported_data(d, t, id); in btf_dump_dump_type_data()
2222 err = btf_dump_bitfield_data(d, t, data, bits_offset, bit_sz); in btf_dump_dump_type_data()
2224 err = btf_dump_int_data(d, t, id, data, bits_offset); in btf_dump_dump_type_data()
2227 err = btf_dump_float_data(d, t, id, data); in btf_dump_dump_type_data()
2230 err = btf_dump_ptr_data(d, t, id, data); in btf_dump_dump_type_data()
2233 err = btf_dump_array_data(d, t, id, data); in btf_dump_dump_type_data()
2237 err = btf_dump_struct_data(d, t, id, data); in btf_dump_dump_type_data()
2245 err = btf_dump_get_bitfield_value(d, t, data, bits_offset, bit_sz, in btf_dump_dump_type_data()
2250 err = btf_dump_enum_data(d, t, id, &enum_val); in btf_dump_dump_type_data()
2252 err = btf_dump_enum_data(d, t, id, data); in btf_dump_dump_type_data()
2255 err = btf_dump_var_data(d, t, id, data); in btf_dump_dump_type_data()
2258 err = btf_dump_datasec_data(d, t, id, data); in btf_dump_dump_type_data()
2270 int btf_dump__dump_type_data(struct btf_dump *d, __u32 id, in btf_dump__dump_type_data() argument
2281 t = btf__type_by_id(d->btf, id); in btf_dump__dump_type_data()
2285 d->typed_dump = &typed_dump; in btf_dump__dump_type_data()
2286 d->typed_dump->data_end = data + data_sz; in btf_dump__dump_type_data()
2287 d->typed_dump->indent_lvl = OPTS_GET(opts, indent_level, 0); in btf_dump__dump_type_data()
2291 d->typed_dump->indent_str[0] = '\t'; in btf_dump__dump_type_data()
2293 strncat(d->typed_dump->indent_str, opts->indent_str, in btf_dump__dump_type_data()
2294 sizeof(d->typed_dump->indent_str) - 1); in btf_dump__dump_type_data()
2296 d->typed_dump->compact = OPTS_GET(opts, compact, false); in btf_dump__dump_type_data()
2297 d->typed_dump->skip_names = OPTS_GET(opts, skip_names, false); in btf_dump__dump_type_data()
2298 d->typed_dump->emit_zeroes = OPTS_GET(opts, emit_zeroes, false); in btf_dump__dump_type_data()
2300 ret = btf_dump_dump_type_data(d, NULL, t, id, data, 0, 0); in btf_dump__dump_type_data()
2302 d->typed_dump = NULL; in btf_dump__dump_type_data()