Lines Matching refs:d

104 static const char *btf_name_of(const struct btf_dump *d, __u32 name_off)  in btf_name_of()  argument
106 return btf__name_by_offset(d->btf, name_off); in btf_name_of()
109 static void btf_dump_printf(const struct btf_dump *d, const char *fmt, ...) in btf_dump_printf() argument
114 d->printf_fn(d->opts.ctx, fmt, args); in btf_dump_printf()
118 static int btf_dump_mark_referenced(struct btf_dump *d);
119 static int btf_dump_resize(struct btf_dump *d);
126 struct btf_dump *d; in btf_dump__new() local
129 d = calloc(1, sizeof(struct btf_dump)); in btf_dump__new()
130 if (!d) in btf_dump__new()
133 d->btf = btf; in btf_dump__new()
134 d->btf_ext = btf_ext; in btf_dump__new()
135 d->printf_fn = printf_fn; in btf_dump__new()
136 d->opts.ctx = opts ? opts->ctx : NULL; in btf_dump__new()
137 d->ptr_sz = btf__pointer_size(btf) ? : sizeof(void *); in btf_dump__new()
139 d->type_names = hashmap__new(str_hash_fn, str_equal_fn, NULL); in btf_dump__new()
140 if (IS_ERR(d->type_names)) { in btf_dump__new()
141 err = PTR_ERR(d->type_names); in btf_dump__new()
142 d->type_names = NULL; in btf_dump__new()
145 d->ident_names = hashmap__new(str_hash_fn, str_equal_fn, NULL); in btf_dump__new()
146 if (IS_ERR(d->ident_names)) { in btf_dump__new()
147 err = PTR_ERR(d->ident_names); in btf_dump__new()
148 d->ident_names = NULL; in btf_dump__new()
152 err = btf_dump_resize(d); in btf_dump__new()
156 return d; in btf_dump__new()
158 btf_dump__free(d); in btf_dump__new()
162 static int btf_dump_resize(struct btf_dump *d) in btf_dump_resize() argument
164 int err, last_id = btf__get_nr_types(d->btf); in btf_dump_resize()
166 if (last_id <= d->last_id) in btf_dump_resize()
169 if (btf_ensure_mem((void **)&d->type_states, &d->type_states_cap, in btf_dump_resize()
170 sizeof(*d->type_states), last_id + 1)) in btf_dump_resize()
172 if (btf_ensure_mem((void **)&d->cached_names, &d->cached_names_cap, in btf_dump_resize()
173 sizeof(*d->cached_names), last_id + 1)) in btf_dump_resize()
176 if (d->last_id == 0) { in btf_dump_resize()
178 d->type_states[0].order_state = ORDERED; in btf_dump_resize()
179 d->type_states[0].emit_state = EMITTED; in btf_dump_resize()
183 err = btf_dump_mark_referenced(d); in btf_dump_resize()
187 d->last_id = last_id; in btf_dump_resize()
191 void btf_dump__free(struct btf_dump *d) in btf_dump__free() argument
195 if (IS_ERR_OR_NULL(d)) in btf_dump__free()
198 free(d->type_states); in btf_dump__free()
199 if (d->cached_names) { in btf_dump__free()
201 for (i = 0; i <= d->last_id; i++) { in btf_dump__free()
202 if (d->cached_names[i]) in btf_dump__free()
203 free((void *)d->cached_names[i]); in btf_dump__free()
206 free(d->cached_names); in btf_dump__free()
207 free(d->emit_queue); in btf_dump__free()
208 free(d->decl_stack); in btf_dump__free()
209 hashmap__free(d->type_names); in btf_dump__free()
210 hashmap__free(d->ident_names); in btf_dump__free()
212 free(d); in btf_dump__free()
215 static int btf_dump_order_type(struct btf_dump *d, __u32 id, bool through_ptr);
216 static void btf_dump_emit_type(struct btf_dump *d, __u32 id, __u32 cont_id);
234 int btf_dump__dump_type(struct btf_dump *d, __u32 id) in btf_dump__dump_type() argument
238 if (id > btf__get_nr_types(d->btf)) in btf_dump__dump_type()
241 err = btf_dump_resize(d); in btf_dump__dump_type()
245 d->emit_queue_cnt = 0; in btf_dump__dump_type()
246 err = btf_dump_order_type(d, id, false); in btf_dump__dump_type()
250 for (i = 0; i < d->emit_queue_cnt; i++) in btf_dump__dump_type()
251 btf_dump_emit_type(d, d->emit_queue[i], 0 /*top-level*/); in btf_dump__dump_type()
268 static int btf_dump_mark_referenced(struct btf_dump *d) in btf_dump_mark_referenced() argument
270 int i, j, n = btf__get_nr_types(d->btf); in btf_dump_mark_referenced()
274 for (i = d->last_id + 1; i <= n; i++) { in btf_dump_mark_referenced()
275 t = btf__type_by_id(d->btf, i); in btf_dump_mark_referenced()
291 d->type_states[t->type].referenced = 1; in btf_dump_mark_referenced()
297 d->type_states[a->index_type].referenced = 1; in btf_dump_mark_referenced()
298 d->type_states[a->type].referenced = 1; in btf_dump_mark_referenced()
306 d->type_states[m->type].referenced = 1; in btf_dump_mark_referenced()
313 d->type_states[p->type].referenced = 1; in btf_dump_mark_referenced()
320 d->type_states[v->type].referenced = 1; in btf_dump_mark_referenced()
330 static int btf_dump_add_emit_queue_id(struct btf_dump *d, __u32 id) in btf_dump_add_emit_queue_id() argument
335 if (d->emit_queue_cnt >= d->emit_queue_cap) { in btf_dump_add_emit_queue_id()
336 new_cap = max(16, d->emit_queue_cap * 3 / 2); in btf_dump_add_emit_queue_id()
337 new_queue = libbpf_reallocarray(d->emit_queue, new_cap, sizeof(new_queue[0])); in btf_dump_add_emit_queue_id()
340 d->emit_queue = new_queue; in btf_dump_add_emit_queue_id()
341 d->emit_queue_cap = new_cap; in btf_dump_add_emit_queue_id()
344 d->emit_queue[d->emit_queue_cnt++] = id; in btf_dump_add_emit_queue_id()
422 static int btf_dump_order_type(struct btf_dump *d, __u32 id, bool through_ptr) in btf_dump_order_type() argument
435 struct btf_dump_type_aux_state *tstate = &d->type_states[id]; in btf_dump_order_type()
444 t = btf__type_by_id(d->btf, id); in btf_dump_order_type()
460 err = btf_dump_order_type(d, t->type, true); in btf_dump_order_type()
465 return btf_dump_order_type(d, btf_array(t)->type, false); in btf_dump_order_type()
482 err = btf_dump_order_type(d, m->type, false); in btf_dump_order_type()
488 err = btf_dump_add_emit_queue_id(d, id); in btf_dump_order_type()
504 err = btf_dump_add_emit_queue_id(d, id); in btf_dump_order_type()
514 is_strong = btf_dump_order_type(d, t->type, through_ptr); in btf_dump_order_type()
523 err = btf_dump_add_emit_queue_id(d, id); in btf_dump_order_type()
527 d->type_states[id].order_state = ORDERED; in btf_dump_order_type()
533 return btf_dump_order_type(d, t->type, through_ptr); in btf_dump_order_type()
539 err = btf_dump_order_type(d, t->type, through_ptr); in btf_dump_order_type()
546 err = btf_dump_order_type(d, p->type, through_ptr); in btf_dump_order_type()
557 d->type_states[id].order_state = ORDERED; in btf_dump_order_type()
565 static void btf_dump_emit_missing_aliases(struct btf_dump *d, __u32 id,
568 static void btf_dump_emit_struct_fwd(struct btf_dump *d, __u32 id,
570 static void btf_dump_emit_struct_def(struct btf_dump *d, __u32 id,
573 static void btf_dump_emit_enum_fwd(struct btf_dump *d, __u32 id,
575 static void btf_dump_emit_enum_def(struct btf_dump *d, __u32 id,
578 static void btf_dump_emit_fwd_def(struct btf_dump *d, __u32 id,
581 static void btf_dump_emit_typedef_def(struct btf_dump *d, __u32 id,
590 static void btf_dump_emit_type_decl(struct btf_dump *d, __u32 id,
592 static void btf_dump_emit_type_chain(struct btf_dump *d,
596 static const char *btf_dump_type_name(struct btf_dump *d, __u32 id);
597 static const char *btf_dump_ident_name(struct btf_dump *d, __u32 id);
598 static size_t btf_dump_name_dups(struct btf_dump *d, struct hashmap *name_map,
601 static bool btf_dump_is_blacklisted(struct btf_dump *d, __u32 id) in btf_dump_is_blacklisted() argument
603 const struct btf_type *t = btf__type_by_id(d->btf, id); in btf_dump_is_blacklisted()
613 return strcmp(btf_name_of(d, t->name_off), "__builtin_va_list") == 0; in btf_dump_is_blacklisted()
634 static void btf_dump_emit_type(struct btf_dump *d, __u32 id, __u32 cont_id) in btf_dump_emit_type() argument
636 struct btf_dump_type_aux_state *tstate = &d->type_states[id]; in btf_dump_emit_type()
644 t = btf__type_by_id(d->btf, id); in btf_dump_emit_type()
665 btf_dump_emit_struct_fwd(d, id, t); in btf_dump_emit_type()
666 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
675 if (!btf_dump_is_blacklisted(d, id)) { in btf_dump_emit_type()
676 btf_dump_emit_typedef_def(d, id, t, 0); in btf_dump_emit_type()
677 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
691 btf_dump_emit_missing_aliases(d, id, t); in btf_dump_emit_type()
697 btf_dump_emit_enum_def(d, id, t, 0); in btf_dump_emit_type()
698 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
706 btf_dump_emit_type(d, t->type, cont_id); in btf_dump_emit_type()
709 btf_dump_emit_type(d, btf_array(t)->type, cont_id); in btf_dump_emit_type()
712 btf_dump_emit_fwd_def(d, id, t); in btf_dump_emit_type()
713 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
718 btf_dump_emit_type(d, t->type, id); in btf_dump_emit_type()
726 if (!tstate->fwd_emitted && !btf_dump_is_blacklisted(d, id)) { in btf_dump_emit_type()
727 btf_dump_emit_typedef_def(d, id, t, 0); in btf_dump_emit_type()
728 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
749 btf_dump_emit_type(d, m->type, new_cont_id); in btf_dump_emit_type()
751 btf_dump_emit_struct_fwd(d, id, t); in btf_dump_emit_type()
752 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
757 btf_dump_emit_struct_def(d, id, t, 0); in btf_dump_emit_type()
758 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
769 btf_dump_emit_type(d, t->type, cont_id); in btf_dump_emit_type()
771 btf_dump_emit_type(d, p->type, cont_id); in btf_dump_emit_type()
814 static void btf_dump_emit_bit_padding(const struct btf_dump *d, in btf_dump_emit_bit_padding() argument
819 int ptr_bits = d->ptr_sz * 8; in btf_dump_emit_bit_padding()
845 btf_dump_printf(d, "\n%s%s: %d;", pfx(lvl), pad_type, pad_bits); in btf_dump_emit_bit_padding()
850 static void btf_dump_emit_struct_fwd(struct btf_dump *d, __u32 id, in btf_dump_emit_struct_fwd() argument
853 btf_dump_printf(d, "%s %s", in btf_dump_emit_struct_fwd()
855 btf_dump_type_name(d, id)); in btf_dump_emit_struct_fwd()
858 static void btf_dump_emit_struct_def(struct btf_dump *d, in btf_dump_emit_struct_def() argument
868 packed = is_struct ? btf_is_struct_packed(d->btf, id, t) : 0; in btf_dump_emit_struct_def()
870 btf_dump_printf(d, "%s%s%s {", in btf_dump_emit_struct_def()
873 btf_dump_type_name(d, id)); in btf_dump_emit_struct_def()
879 fname = btf_name_of(d, m->name_off); in btf_dump_emit_struct_def()
882 align = packed ? 1 : btf__align_of(d->btf, m->type); in btf_dump_emit_struct_def()
884 btf_dump_emit_bit_padding(d, off, m_off, m_sz, align, lvl + 1); in btf_dump_emit_struct_def()
885 btf_dump_printf(d, "\n%s", pfx(lvl + 1)); in btf_dump_emit_struct_def()
886 btf_dump_emit_type_decl(d, m->type, fname, lvl + 1); in btf_dump_emit_struct_def()
889 btf_dump_printf(d, ": %d", m_sz); in btf_dump_emit_struct_def()
892 m_sz = max((__s64)0, btf__resolve_size(d->btf, m->type)); in btf_dump_emit_struct_def()
895 btf_dump_printf(d, ";"); in btf_dump_emit_struct_def()
900 align = packed ? 1 : btf__align_of(d->btf, id); in btf_dump_emit_struct_def()
901 btf_dump_emit_bit_padding(d, off, t->size * 8, 0, align, in btf_dump_emit_struct_def()
906 btf_dump_printf(d, "\n"); in btf_dump_emit_struct_def()
907 btf_dump_printf(d, "%s}", pfx(lvl)); in btf_dump_emit_struct_def()
909 btf_dump_printf(d, " __attribute__((packed))"); in btf_dump_emit_struct_def()
923 static void btf_dump_emit_missing_aliases(struct btf_dump *d, __u32 id, in btf_dump_emit_missing_aliases() argument
926 const char *name = btf_dump_type_name(d, id); in btf_dump_emit_missing_aliases()
931 btf_dump_printf(d, "typedef %s %s;\n\n", in btf_dump_emit_missing_aliases()
938 static void btf_dump_emit_enum_fwd(struct btf_dump *d, __u32 id, in btf_dump_emit_enum_fwd() argument
941 btf_dump_printf(d, "enum %s", btf_dump_type_name(d, id)); in btf_dump_emit_enum_fwd()
944 static void btf_dump_emit_enum_def(struct btf_dump *d, __u32 id, in btf_dump_emit_enum_def() argument
954 btf_dump_printf(d, "enum%s%s", in btf_dump_emit_enum_def()
956 btf_dump_type_name(d, id)); in btf_dump_emit_enum_def()
959 btf_dump_printf(d, " {"); in btf_dump_emit_enum_def()
961 name = btf_name_of(d, v->name_off); in btf_dump_emit_enum_def()
963 dup_cnt = btf_dump_name_dups(d, d->ident_names, name); in btf_dump_emit_enum_def()
965 btf_dump_printf(d, "\n%s%s___%zu = %u,", in btf_dump_emit_enum_def()
969 btf_dump_printf(d, "\n%s%s = %u,", in btf_dump_emit_enum_def()
974 btf_dump_printf(d, "\n%s}", pfx(lvl)); in btf_dump_emit_enum_def()
978 static void btf_dump_emit_fwd_def(struct btf_dump *d, __u32 id, in btf_dump_emit_fwd_def() argument
981 const char *name = btf_dump_type_name(d, id); in btf_dump_emit_fwd_def()
984 btf_dump_printf(d, "union %s", name); in btf_dump_emit_fwd_def()
986 btf_dump_printf(d, "struct %s", name); in btf_dump_emit_fwd_def()
989 static void btf_dump_emit_typedef_def(struct btf_dump *d, __u32 id, in btf_dump_emit_typedef_def() argument
992 const char *name = btf_dump_ident_name(d, id); in btf_dump_emit_typedef_def()
1001 btf_dump_printf(d, "typedef __builtin_va_list __gnuc_va_list"); in btf_dump_emit_typedef_def()
1005 btf_dump_printf(d, "typedef "); in btf_dump_emit_typedef_def()
1006 btf_dump_emit_type_decl(d, t->type, name, lvl); in btf_dump_emit_typedef_def()
1009 static int btf_dump_push_decl_stack_id(struct btf_dump *d, __u32 id) in btf_dump_push_decl_stack_id() argument
1014 if (d->decl_stack_cnt >= d->decl_stack_cap) { in btf_dump_push_decl_stack_id()
1015 new_cap = max(16, d->decl_stack_cap * 3 / 2); in btf_dump_push_decl_stack_id()
1016 new_stack = libbpf_reallocarray(d->decl_stack, new_cap, sizeof(new_stack[0])); in btf_dump_push_decl_stack_id()
1019 d->decl_stack = new_stack; in btf_dump_push_decl_stack_id()
1020 d->decl_stack_cap = new_cap; in btf_dump_push_decl_stack_id()
1023 d->decl_stack[d->decl_stack_cnt++] = id; in btf_dump_push_decl_stack_id()
1069 int btf_dump__emit_type_decl(struct btf_dump *d, __u32 id, in btf_dump__emit_type_decl() argument
1078 err = btf_dump_resize(d); in btf_dump__emit_type_decl()
1084 d->strip_mods = OPTS_GET(opts, strip_mods, false); in btf_dump__emit_type_decl()
1085 btf_dump_emit_type_decl(d, id, fname, lvl); in btf_dump__emit_type_decl()
1086 d->strip_mods = false; in btf_dump__emit_type_decl()
1090 static void btf_dump_emit_type_decl(struct btf_dump *d, __u32 id, in btf_dump_emit_type_decl() argument
1097 stack_start = d->decl_stack_cnt; in btf_dump_emit_type_decl()
1099 t = btf__type_by_id(d->btf, id); in btf_dump_emit_type_decl()
1100 if (d->strip_mods && btf_is_mod(t)) in btf_dump_emit_type_decl()
1103 err = btf_dump_push_decl_stack_id(d, id); in btf_dump_emit_type_decl()
1111 d->decl_stack_cnt = stack_start; in btf_dump_emit_type_decl()
1154 decl_stack.ids = d->decl_stack + stack_start; in btf_dump_emit_type_decl()
1155 decl_stack.cnt = d->decl_stack_cnt - stack_start; in btf_dump_emit_type_decl()
1156 btf_dump_emit_type_chain(d, &decl_stack, fname, lvl); in btf_dump_emit_type_decl()
1165 d->decl_stack_cnt = stack_start; in btf_dump_emit_type_decl()
1168 static void btf_dump_emit_mods(struct btf_dump *d, struct id_stack *decl_stack) in btf_dump_emit_mods() argument
1175 t = btf__type_by_id(d->btf, id); in btf_dump_emit_mods()
1179 btf_dump_printf(d, "volatile "); in btf_dump_emit_mods()
1182 btf_dump_printf(d, "const "); in btf_dump_emit_mods()
1185 btf_dump_printf(d, "restrict "); in btf_dump_emit_mods()
1194 static void btf_dump_drop_mods(struct btf_dump *d, struct id_stack *decl_stack) in btf_dump_drop_mods() argument
1201 t = btf__type_by_id(d->btf, id); in btf_dump_drop_mods()
1208 static void btf_dump_emit_name(const struct btf_dump *d, in btf_dump_emit_name() argument
1213 btf_dump_printf(d, "%s%s", separate ? " " : "", name); in btf_dump_emit_name()
1216 static void btf_dump_emit_type_chain(struct btf_dump *d, in btf_dump_emit_type_chain() argument
1239 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1240 btf_dump_printf(d, "void"); in btf_dump_emit_type_chain()
1245 t = btf__type_by_id(d->btf, id); in btf_dump_emit_type_chain()
1250 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1251 name = btf_name_of(d, t->name_off); in btf_dump_emit_type_chain()
1252 btf_dump_printf(d, "%s", name); in btf_dump_emit_type_chain()
1256 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1259 btf_dump_emit_struct_def(d, id, t, lvl); in btf_dump_emit_type_chain()
1261 btf_dump_emit_struct_fwd(d, id, t); in btf_dump_emit_type_chain()
1264 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1267 btf_dump_emit_enum_def(d, id, t, lvl); in btf_dump_emit_type_chain()
1269 btf_dump_emit_enum_fwd(d, id, t); in btf_dump_emit_type_chain()
1272 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1273 btf_dump_emit_fwd_def(d, id, t); in btf_dump_emit_type_chain()
1276 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1277 btf_dump_printf(d, "%s", btf_dump_ident_name(d, id)); in btf_dump_emit_type_chain()
1280 btf_dump_printf(d, "%s", last_was_ptr ? "*" : " *"); in btf_dump_emit_type_chain()
1283 btf_dump_printf(d, " volatile"); in btf_dump_emit_type_chain()
1286 btf_dump_printf(d, " const"); in btf_dump_emit_type_chain()
1289 btf_dump_printf(d, " restrict"); in btf_dump_emit_type_chain()
1306 btf_dump_drop_mods(d, decls); in btf_dump_emit_type_chain()
1309 btf_dump_emit_name(d, fname, last_was_ptr); in btf_dump_emit_type_chain()
1310 btf_dump_printf(d, "[%u]", a->nelems); in btf_dump_emit_type_chain()
1315 next_t = btf__type_by_id(d->btf, next_id); in btf_dump_emit_type_chain()
1319 btf_dump_printf(d, " "); in btf_dump_emit_type_chain()
1322 btf_dump_printf(d, "("); in btf_dump_emit_type_chain()
1323 btf_dump_emit_type_chain(d, decls, fname, lvl); in btf_dump_emit_type_chain()
1325 btf_dump_printf(d, ")"); in btf_dump_emit_type_chain()
1326 btf_dump_printf(d, "[%u]", a->nelems); in btf_dump_emit_type_chain()
1342 btf_dump_drop_mods(d, decls); in btf_dump_emit_type_chain()
1344 btf_dump_printf(d, " ("); in btf_dump_emit_type_chain()
1345 btf_dump_emit_type_chain(d, decls, fname, lvl); in btf_dump_emit_type_chain()
1346 btf_dump_printf(d, ")"); in btf_dump_emit_type_chain()
1348 btf_dump_emit_name(d, fname, last_was_ptr); in btf_dump_emit_type_chain()
1350 btf_dump_printf(d, "("); in btf_dump_emit_type_chain()
1358 btf_dump_printf(d, ")"); in btf_dump_emit_type_chain()
1364 btf_dump_printf(d, ", "); in btf_dump_emit_type_chain()
1368 btf_dump_printf(d, "..."); in btf_dump_emit_type_chain()
1372 name = btf_name_of(d, p->name_off); in btf_dump_emit_type_chain()
1373 btf_dump_emit_type_decl(d, p->type, name, lvl); in btf_dump_emit_type_chain()
1376 btf_dump_printf(d, ")"); in btf_dump_emit_type_chain()
1388 btf_dump_emit_name(d, fname, last_was_ptr); in btf_dump_emit_type_chain()
1392 static size_t btf_dump_name_dups(struct btf_dump *d, struct hashmap *name_map, in btf_dump_name_dups() argument
1404 static const char *btf_dump_resolve_name(struct btf_dump *d, __u32 id, in btf_dump_resolve_name() argument
1407 struct btf_dump_type_aux_state *s = &d->type_states[id]; in btf_dump_resolve_name()
1408 const struct btf_type *t = btf__type_by_id(d->btf, id); in btf_dump_resolve_name()
1409 const char *orig_name = btf_name_of(d, t->name_off); in btf_dump_resolve_name()
1410 const char **cached_name = &d->cached_names[id]; in btf_dump_resolve_name()
1424 dup_cnt = btf_dump_name_dups(d, name_map, orig_name); in btf_dump_resolve_name()
1437 static const char *btf_dump_type_name(struct btf_dump *d, __u32 id) in btf_dump_type_name() argument
1439 return btf_dump_resolve_name(d, id, d->type_names); in btf_dump_type_name()
1442 static const char *btf_dump_ident_name(struct btf_dump *d, __u32 id) in btf_dump_ident_name() argument
1444 return btf_dump_resolve_name(d, id, d->ident_names); in btf_dump_ident_name()