Lines Matching refs:d

105 static const char *btf_name_of(const struct btf_dump *d, __u32 name_off)  in btf_name_of()  argument
107 return btf__name_by_offset(d->btf, name_off); in btf_name_of()
110 static void btf_dump_printf(const struct btf_dump *d, const char *fmt, ...) in btf_dump_printf() argument
115 d->printf_fn(d->opts.ctx, fmt, args); in btf_dump_printf()
124 struct btf_dump *d; in btf_dump__new() local
127 d = calloc(1, sizeof(struct btf_dump)); in btf_dump__new()
128 if (!d) in btf_dump__new()
131 d->btf = btf; in btf_dump__new()
132 d->btf_ext = btf_ext; in btf_dump__new()
133 d->printf_fn = printf_fn; in btf_dump__new()
134 d->opts.ctx = opts ? opts->ctx : NULL; in btf_dump__new()
136 d->type_names = hashmap__new(str_hash_fn, str_equal_fn, NULL); in btf_dump__new()
137 if (IS_ERR(d->type_names)) { in btf_dump__new()
138 err = PTR_ERR(d->type_names); in btf_dump__new()
139 d->type_names = NULL; in btf_dump__new()
140 btf_dump__free(d); in btf_dump__new()
143 d->ident_names = hashmap__new(str_hash_fn, str_equal_fn, NULL); in btf_dump__new()
144 if (IS_ERR(d->ident_names)) { in btf_dump__new()
145 err = PTR_ERR(d->ident_names); in btf_dump__new()
146 d->ident_names = NULL; in btf_dump__new()
147 btf_dump__free(d); in btf_dump__new()
151 return d; in btf_dump__new()
154 void btf_dump__free(struct btf_dump *d) in btf_dump__free() argument
158 if (!d) in btf_dump__free()
161 free(d->type_states); in btf_dump__free()
162 if (d->cached_names) { in btf_dump__free()
164 for (i = 0, cnt = btf__get_nr_types(d->btf); i <= cnt; i++) { in btf_dump__free()
165 if (d->cached_names[i]) in btf_dump__free()
166 free((void *)d->cached_names[i]); in btf_dump__free()
169 free(d->cached_names); in btf_dump__free()
170 free(d->emit_queue); in btf_dump__free()
171 free(d->decl_stack); in btf_dump__free()
172 hashmap__free(d->type_names); in btf_dump__free()
173 hashmap__free(d->ident_names); in btf_dump__free()
175 free(d); in btf_dump__free()
178 static int btf_dump_mark_referenced(struct btf_dump *d);
179 static int btf_dump_order_type(struct btf_dump *d, __u32 id, bool through_ptr);
180 static void btf_dump_emit_type(struct btf_dump *d, __u32 id, __u32 cont_id);
198 int btf_dump__dump_type(struct btf_dump *d, __u32 id) in btf_dump__dump_type() argument
202 if (id > btf__get_nr_types(d->btf)) in btf_dump__dump_type()
206 if (!d->type_states) { in btf_dump__dump_type()
207 d->type_states = calloc(1 + btf__get_nr_types(d->btf), in btf_dump__dump_type()
208 sizeof(d->type_states[0])); in btf_dump__dump_type()
209 if (!d->type_states) in btf_dump__dump_type()
211 d->cached_names = calloc(1 + btf__get_nr_types(d->btf), in btf_dump__dump_type()
212 sizeof(d->cached_names[0])); in btf_dump__dump_type()
213 if (!d->cached_names) in btf_dump__dump_type()
217 d->type_states[0].order_state = ORDERED; in btf_dump__dump_type()
218 d->type_states[0].emit_state = EMITTED; in btf_dump__dump_type()
221 err = btf_dump_mark_referenced(d); in btf_dump__dump_type()
226 d->emit_queue_cnt = 0; in btf_dump__dump_type()
227 err = btf_dump_order_type(d, id, false); in btf_dump__dump_type()
231 for (i = 0; i < d->emit_queue_cnt; i++) in btf_dump__dump_type()
232 btf_dump_emit_type(d, d->emit_queue[i], 0 /*top-level*/); in btf_dump__dump_type()
249 static int btf_dump_mark_referenced(struct btf_dump *d) in btf_dump_mark_referenced() argument
251 int i, j, n = btf__get_nr_types(d->btf); in btf_dump_mark_referenced()
256 t = btf__type_by_id(d->btf, i); in btf_dump_mark_referenced()
272 d->type_states[t->type].referenced = 1; in btf_dump_mark_referenced()
278 d->type_states[a->index_type].referenced = 1; in btf_dump_mark_referenced()
279 d->type_states[a->type].referenced = 1; in btf_dump_mark_referenced()
287 d->type_states[m->type].referenced = 1; in btf_dump_mark_referenced()
294 d->type_states[p->type].referenced = 1; in btf_dump_mark_referenced()
301 d->type_states[v->type].referenced = 1; in btf_dump_mark_referenced()
310 static int btf_dump_add_emit_queue_id(struct btf_dump *d, __u32 id) in btf_dump_add_emit_queue_id() argument
315 if (d->emit_queue_cnt >= d->emit_queue_cap) { in btf_dump_add_emit_queue_id()
316 new_cap = max(16, d->emit_queue_cap * 3 / 2); in btf_dump_add_emit_queue_id()
317 new_queue = realloc(d->emit_queue, in btf_dump_add_emit_queue_id()
321 d->emit_queue = new_queue; in btf_dump_add_emit_queue_id()
322 d->emit_queue_cap = new_cap; in btf_dump_add_emit_queue_id()
325 d->emit_queue[d->emit_queue_cnt++] = id; in btf_dump_add_emit_queue_id()
403 static int btf_dump_order_type(struct btf_dump *d, __u32 id, bool through_ptr) in btf_dump_order_type() argument
416 struct btf_dump_type_aux_state *tstate = &d->type_states[id]; in btf_dump_order_type()
425 t = btf__type_by_id(d->btf, id); in btf_dump_order_type()
441 err = btf_dump_order_type(d, t->type, true); in btf_dump_order_type()
446 return btf_dump_order_type(d, btf_array(t)->type, through_ptr); in btf_dump_order_type()
463 err = btf_dump_order_type(d, m->type, false); in btf_dump_order_type()
469 err = btf_dump_add_emit_queue_id(d, id); in btf_dump_order_type()
485 err = btf_dump_add_emit_queue_id(d, id); in btf_dump_order_type()
495 is_strong = btf_dump_order_type(d, t->type, through_ptr); in btf_dump_order_type()
504 err = btf_dump_add_emit_queue_id(d, id); in btf_dump_order_type()
508 d->type_states[id].order_state = ORDERED; in btf_dump_order_type()
514 return btf_dump_order_type(d, t->type, through_ptr); in btf_dump_order_type()
520 err = btf_dump_order_type(d, t->type, through_ptr); in btf_dump_order_type()
527 err = btf_dump_order_type(d, p->type, through_ptr); in btf_dump_order_type()
538 d->type_states[id].order_state = ORDERED; in btf_dump_order_type()
546 static void btf_dump_emit_struct_fwd(struct btf_dump *d, __u32 id,
548 static void btf_dump_emit_struct_def(struct btf_dump *d, __u32 id,
551 static void btf_dump_emit_enum_fwd(struct btf_dump *d, __u32 id,
553 static void btf_dump_emit_enum_def(struct btf_dump *d, __u32 id,
556 static void btf_dump_emit_fwd_def(struct btf_dump *d, __u32 id,
559 static void btf_dump_emit_typedef_def(struct btf_dump *d, __u32 id,
568 static void btf_dump_emit_type_decl(struct btf_dump *d, __u32 id,
570 static void btf_dump_emit_type_chain(struct btf_dump *d,
574 static const char *btf_dump_type_name(struct btf_dump *d, __u32 id);
575 static const char *btf_dump_ident_name(struct btf_dump *d, __u32 id);
576 static size_t btf_dump_name_dups(struct btf_dump *d, struct hashmap *name_map,
579 static bool btf_dump_is_blacklisted(struct btf_dump *d, __u32 id) in btf_dump_is_blacklisted() argument
581 const struct btf_type *t = btf__type_by_id(d->btf, id); in btf_dump_is_blacklisted()
591 return strcmp(btf_name_of(d, t->name_off), "__builtin_va_list") == 0; in btf_dump_is_blacklisted()
612 static void btf_dump_emit_type(struct btf_dump *d, __u32 id, __u32 cont_id) in btf_dump_emit_type() argument
614 struct btf_dump_type_aux_state *tstate = &d->type_states[id]; in btf_dump_emit_type()
622 t = btf__type_by_id(d->btf, id); in btf_dump_emit_type()
643 btf_dump_emit_struct_fwd(d, id, t); in btf_dump_emit_type()
644 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
653 if (!btf_dump_is_blacklisted(d, id)) { in btf_dump_emit_type()
654 btf_dump_emit_typedef_def(d, id, t, 0); in btf_dump_emit_type()
655 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
672 btf_dump_emit_enum_def(d, id, t, 0); in btf_dump_emit_type()
673 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
681 btf_dump_emit_type(d, t->type, cont_id); in btf_dump_emit_type()
684 btf_dump_emit_type(d, btf_array(t)->type, cont_id); in btf_dump_emit_type()
687 btf_dump_emit_fwd_def(d, id, t); in btf_dump_emit_type()
688 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
693 btf_dump_emit_type(d, t->type, id); in btf_dump_emit_type()
701 if (!tstate->fwd_emitted && !btf_dump_is_blacklisted(d, id)) { in btf_dump_emit_type()
702 btf_dump_emit_typedef_def(d, id, t, 0); in btf_dump_emit_type()
703 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
724 btf_dump_emit_type(d, m->type, new_cont_id); in btf_dump_emit_type()
726 btf_dump_emit_struct_fwd(d, id, t); in btf_dump_emit_type()
727 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
732 btf_dump_emit_struct_def(d, id, t, 0); in btf_dump_emit_type()
733 btf_dump_printf(d, ";\n\n"); in btf_dump_emit_type()
744 btf_dump_emit_type(d, t->type, cont_id); in btf_dump_emit_type()
746 btf_dump_emit_type(d, p->type, cont_id); in btf_dump_emit_type()
824 static void btf_dump_emit_bit_padding(const struct btf_dump *d, in btf_dump_emit_bit_padding() argument
855 btf_dump_printf(d, "\n%s%s: %d;", pfx(lvl), pad_type, pad_bits); in btf_dump_emit_bit_padding()
860 static void btf_dump_emit_struct_fwd(struct btf_dump *d, __u32 id, in btf_dump_emit_struct_fwd() argument
863 btf_dump_printf(d, "%s %s", in btf_dump_emit_struct_fwd()
865 btf_dump_type_name(d, id)); in btf_dump_emit_struct_fwd()
868 static void btf_dump_emit_struct_def(struct btf_dump *d, in btf_dump_emit_struct_def() argument
878 packed = is_struct ? btf_is_struct_packed(d->btf, id, t) : 0; in btf_dump_emit_struct_def()
879 align = packed ? 1 : btf_align_of(d->btf, id); in btf_dump_emit_struct_def()
881 btf_dump_printf(d, "%s%s%s {", in btf_dump_emit_struct_def()
884 btf_dump_type_name(d, id)); in btf_dump_emit_struct_def()
890 fname = btf_name_of(d, m->name_off); in btf_dump_emit_struct_def()
893 align = packed ? 1 : btf_align_of(d->btf, m->type); in btf_dump_emit_struct_def()
895 btf_dump_emit_bit_padding(d, off, m_off, m_sz, align, lvl + 1); in btf_dump_emit_struct_def()
896 btf_dump_printf(d, "\n%s", pfx(lvl + 1)); in btf_dump_emit_struct_def()
897 btf_dump_emit_type_decl(d, m->type, fname, lvl + 1); in btf_dump_emit_struct_def()
900 btf_dump_printf(d, ": %d", m_sz); in btf_dump_emit_struct_def()
903 m_sz = max(0, btf__resolve_size(d->btf, m->type)); in btf_dump_emit_struct_def()
906 btf_dump_printf(d, ";"); in btf_dump_emit_struct_def()
910 btf_dump_printf(d, "\n"); in btf_dump_emit_struct_def()
911 btf_dump_printf(d, "%s}", pfx(lvl)); in btf_dump_emit_struct_def()
913 btf_dump_printf(d, " __attribute__((packed))"); in btf_dump_emit_struct_def()
916 static void btf_dump_emit_enum_fwd(struct btf_dump *d, __u32 id, in btf_dump_emit_enum_fwd() argument
919 btf_dump_printf(d, "enum %s", btf_dump_type_name(d, id)); in btf_dump_emit_enum_fwd()
922 static void btf_dump_emit_enum_def(struct btf_dump *d, __u32 id, in btf_dump_emit_enum_def() argument
932 btf_dump_printf(d, "enum%s%s", in btf_dump_emit_enum_def()
934 btf_dump_type_name(d, id)); in btf_dump_emit_enum_def()
937 btf_dump_printf(d, " {"); in btf_dump_emit_enum_def()
939 name = btf_name_of(d, v->name_off); in btf_dump_emit_enum_def()
941 dup_cnt = btf_dump_name_dups(d, d->ident_names, name); in btf_dump_emit_enum_def()
943 btf_dump_printf(d, "\n%s%s___%zu = %d,", in btf_dump_emit_enum_def()
947 btf_dump_printf(d, "\n%s%s = %d,", in btf_dump_emit_enum_def()
952 btf_dump_printf(d, "\n%s}", pfx(lvl)); in btf_dump_emit_enum_def()
956 static void btf_dump_emit_fwd_def(struct btf_dump *d, __u32 id, in btf_dump_emit_fwd_def() argument
959 const char *name = btf_dump_type_name(d, id); in btf_dump_emit_fwd_def()
962 btf_dump_printf(d, "union %s", name); in btf_dump_emit_fwd_def()
964 btf_dump_printf(d, "struct %s", name); in btf_dump_emit_fwd_def()
967 static void btf_dump_emit_typedef_def(struct btf_dump *d, __u32 id, in btf_dump_emit_typedef_def() argument
970 const char *name = btf_dump_ident_name(d, id); in btf_dump_emit_typedef_def()
972 btf_dump_printf(d, "typedef "); in btf_dump_emit_typedef_def()
973 btf_dump_emit_type_decl(d, t->type, name, lvl); in btf_dump_emit_typedef_def()
976 static int btf_dump_push_decl_stack_id(struct btf_dump *d, __u32 id) in btf_dump_push_decl_stack_id() argument
981 if (d->decl_stack_cnt >= d->decl_stack_cap) { in btf_dump_push_decl_stack_id()
982 new_cap = max(16, d->decl_stack_cap * 3 / 2); in btf_dump_push_decl_stack_id()
983 new_stack = realloc(d->decl_stack, in btf_dump_push_decl_stack_id()
987 d->decl_stack = new_stack; in btf_dump_push_decl_stack_id()
988 d->decl_stack_cap = new_cap; in btf_dump_push_decl_stack_id()
991 d->decl_stack[d->decl_stack_cnt++] = id; in btf_dump_push_decl_stack_id()
1037 static void btf_dump_emit_type_decl(struct btf_dump *d, __u32 id, in btf_dump_emit_type_decl() argument
1044 stack_start = d->decl_stack_cnt; in btf_dump_emit_type_decl()
1046 err = btf_dump_push_decl_stack_id(d, id); in btf_dump_emit_type_decl()
1054 d->decl_stack_cnt = stack_start; in btf_dump_emit_type_decl()
1062 t = btf__type_by_id(d->btf, id); in btf_dump_emit_type_decl()
1098 decl_stack.ids = d->decl_stack + stack_start; in btf_dump_emit_type_decl()
1099 decl_stack.cnt = d->decl_stack_cnt - stack_start; in btf_dump_emit_type_decl()
1100 btf_dump_emit_type_chain(d, &decl_stack, fname, lvl); in btf_dump_emit_type_decl()
1109 d->decl_stack_cnt = stack_start; in btf_dump_emit_type_decl()
1112 static void btf_dump_emit_mods(struct btf_dump *d, struct id_stack *decl_stack) in btf_dump_emit_mods() argument
1119 t = btf__type_by_id(d->btf, id); in btf_dump_emit_mods()
1123 btf_dump_printf(d, "volatile "); in btf_dump_emit_mods()
1126 btf_dump_printf(d, "const "); in btf_dump_emit_mods()
1129 btf_dump_printf(d, "restrict "); in btf_dump_emit_mods()
1138 static void btf_dump_emit_name(const struct btf_dump *d, in btf_dump_emit_name() argument
1143 btf_dump_printf(d, "%s%s", separate ? " " : "", name); in btf_dump_emit_name()
1146 static void btf_dump_emit_type_chain(struct btf_dump *d, in btf_dump_emit_type_chain() argument
1169 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1170 btf_dump_printf(d, "void"); in btf_dump_emit_type_chain()
1175 t = btf__type_by_id(d->btf, id); in btf_dump_emit_type_chain()
1180 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1181 name = btf_name_of(d, t->name_off); in btf_dump_emit_type_chain()
1182 btf_dump_printf(d, "%s", name); in btf_dump_emit_type_chain()
1186 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1189 btf_dump_emit_struct_def(d, id, t, lvl); in btf_dump_emit_type_chain()
1191 btf_dump_emit_struct_fwd(d, id, t); in btf_dump_emit_type_chain()
1194 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1197 btf_dump_emit_enum_def(d, id, t, lvl); in btf_dump_emit_type_chain()
1199 btf_dump_emit_enum_fwd(d, id, t); in btf_dump_emit_type_chain()
1202 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1203 btf_dump_emit_fwd_def(d, id, t); in btf_dump_emit_type_chain()
1206 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1207 btf_dump_printf(d, "%s", btf_dump_ident_name(d, id)); in btf_dump_emit_type_chain()
1210 btf_dump_printf(d, "%s", last_was_ptr ? "*" : " *"); in btf_dump_emit_type_chain()
1213 btf_dump_printf(d, " volatile"); in btf_dump_emit_type_chain()
1216 btf_dump_printf(d, " const"); in btf_dump_emit_type_chain()
1219 btf_dump_printf(d, " restrict"); in btf_dump_emit_type_chain()
1238 next_t = btf__type_by_id(d->btf, next_id); in btf_dump_emit_type_chain()
1246 btf_dump_emit_name(d, fname, last_was_ptr); in btf_dump_emit_type_chain()
1247 btf_dump_printf(d, "[%u]", a->nelems); in btf_dump_emit_type_chain()
1252 next_t = btf__type_by_id(d->btf, next_id); in btf_dump_emit_type_chain()
1256 btf_dump_printf(d, " "); in btf_dump_emit_type_chain()
1259 btf_dump_printf(d, "("); in btf_dump_emit_type_chain()
1260 btf_dump_emit_type_chain(d, decls, fname, lvl); in btf_dump_emit_type_chain()
1262 btf_dump_printf(d, ")"); in btf_dump_emit_type_chain()
1263 btf_dump_printf(d, "[%u]", a->nelems); in btf_dump_emit_type_chain()
1271 btf_dump_emit_mods(d, decls); in btf_dump_emit_type_chain()
1273 btf_dump_printf(d, " ("); in btf_dump_emit_type_chain()
1274 btf_dump_emit_type_chain(d, decls, fname, lvl); in btf_dump_emit_type_chain()
1275 btf_dump_printf(d, ")"); in btf_dump_emit_type_chain()
1277 btf_dump_emit_name(d, fname, last_was_ptr); in btf_dump_emit_type_chain()
1279 btf_dump_printf(d, "("); in btf_dump_emit_type_chain()
1287 btf_dump_printf(d, ")"); in btf_dump_emit_type_chain()
1293 btf_dump_printf(d, ", "); in btf_dump_emit_type_chain()
1297 btf_dump_printf(d, "..."); in btf_dump_emit_type_chain()
1301 name = btf_name_of(d, p->name_off); in btf_dump_emit_type_chain()
1302 btf_dump_emit_type_decl(d, p->type, name, lvl); in btf_dump_emit_type_chain()
1305 btf_dump_printf(d, ")"); in btf_dump_emit_type_chain()
1317 btf_dump_emit_name(d, fname, last_was_ptr); in btf_dump_emit_type_chain()
1321 static size_t btf_dump_name_dups(struct btf_dump *d, struct hashmap *name_map, in btf_dump_name_dups() argument
1333 static const char *btf_dump_resolve_name(struct btf_dump *d, __u32 id, in btf_dump_resolve_name() argument
1336 struct btf_dump_type_aux_state *s = &d->type_states[id]; in btf_dump_resolve_name()
1337 const struct btf_type *t = btf__type_by_id(d->btf, id); in btf_dump_resolve_name()
1338 const char *orig_name = btf_name_of(d, t->name_off); in btf_dump_resolve_name()
1339 const char **cached_name = &d->cached_names[id]; in btf_dump_resolve_name()
1348 dup_cnt = btf_dump_name_dups(d, name_map, orig_name); in btf_dump_resolve_name()
1361 static const char *btf_dump_type_name(struct btf_dump *d, __u32 id) in btf_dump_type_name() argument
1363 return btf_dump_resolve_name(d, id, d->type_names); in btf_dump_type_name()
1366 static const char *btf_dump_ident_name(struct btf_dump *d, __u32 id) in btf_dump_ident_name() argument
1368 return btf_dump_resolve_name(d, id, d->ident_names); in btf_dump_ident_name()