Lines Matching full:die
28 /* >0 to stop DIE processing */
38 static void process_linebreak(struct die *cache, int n) in process_linebreak()
46 static bool get_##attr##_attr(Dwarf_Die *die, unsigned int id, \
50 return dwarf_attr(die, id, &da) && \
57 static bool get_ref_die_attr(Dwarf_Die *die, unsigned int id, Dwarf_Die *value) in DEFINE_GET_ATTR()
62 return dwarf_attr(die, id, &da) && dwarf_formref_die(&da, value); in DEFINE_GET_ATTR()
66 static const char *get_##attr##_attr(Dwarf_Die *die) \
69 if (dwarf_attr(die, DW_AT_##attr, &da)) \
77 static const char *get_symbol_name(Dwarf_Die *die) in DEFINE_GET_STRING_ATTR()
82 name = get_linkage_name_attr(die); in DEFINE_GET_STRING_ATTR()
84 name = get_name_attr(die); in DEFINE_GET_STRING_ATTR()
89 static bool match_export_symbol(struct state *state, Dwarf_Die *die) in match_export_symbol() argument
91 Dwarf_Die *source = die; in match_export_symbol()
94 /* If the DIE has an abstract origin, use it for type information. */ in match_export_symbol()
95 if (get_ref_die_attr(die, DW_AT_abstract_origin, &origin)) in match_export_symbol()
98 state->sym = symbol_get(get_symbol_name(die)); in match_export_symbol()
101 if (!state->sym && source != die) in match_export_symbol()
104 state->die = *source; in match_export_symbol()
111 static bool is_definition_private(Dwarf_Die *die) in is_definition_private() argument
123 if (!get_udata_attr(die, DW_AT_decl_file, &filenum)) in is_definition_private()
130 if (!dwarf_cu_die(die->cu, &cudie, NULL, NULL, NULL, NULL, NULL, NULL)) in is_definition_private()
147 static bool is_kabi_definition(struct die *cache, Dwarf_Die *die) in is_kabi_definition() argument
151 if (get_flag_attr(die, DW_AT_declaration, &value) && value) in is_kabi_definition()
157 return !is_definition_private(die); in is_kabi_definition()
163 static void process(struct die *cache, const char *s) in process()
183 static void process_fmt(struct die *cache, const char *fmt, ...) in process_fmt()
197 static void update_fqn(struct die *cache, Dwarf_Die *die) in update_fqn() argument
199 struct die *fqn; in update_fqn()
202 if (!__die_map_get((uintptr_t)die->addr, DIE_FQN, &fqn) && in update_fqn()
210 static void process_fqn(struct die *cache, Dwarf_Die *die) in process_fqn() argument
212 update_fqn(cache, die); in process_fqn()
219 static void process_##attribute##_attr(struct die *cache, \
220 Dwarf_Die *die) \
223 if (get_udata_attr(die, DW_AT_##attribute, &value)) \
239 static bool match_##type##_type(Dwarf_Die *die) \ in DEFINE_PROCESS_UDATA_ATTRIBUTE()
241 return dwarf_tag(die) == DW_TAG_##type##_type; \ in DEFINE_PROCESS_UDATA_ATTRIBUTE()
249 bool match_all(Dwarf_Die *die)
254 int process_die_container(struct state *state, struct die *cache, in process_die_container()
255 Dwarf_Die *die, die_callback_t func, in process_die_container() argument
265 res = checkp(dwarf_child(die, ¤t)); in process_die_container()
285 static int process_type(struct state *state, struct die *parent,
286 Dwarf_Die *die);
288 static void process_type_attr(struct state *state, struct die *cache, in process_type_attr()
289 Dwarf_Die *die) in process_type_attr() argument
293 if (get_ref_die_attr(die, DW_AT_type, &type)) { in process_type_attr()
302 static void process_list_comma(struct state *state, struct die *cache) in process_list_comma()
313 static void __process_list_type(struct state *state, struct die *cache, in __process_list_type()
314 Dwarf_Die *die, const char *type) in __process_list_type() argument
316 const char *name = get_name_attr(die); in __process_list_type()
326 process_type_attr(state, cache, die); in __process_list_type()
335 process_accessibility_attr(cache, die); in __process_list_type()
336 process_bit_size_attr(cache, die); in __process_list_type()
337 process_data_bit_offset_attr(cache, die); in __process_list_type()
338 process_data_member_location_attr(cache, die); in __process_list_type()
343 struct die *cache, Dwarf_Die *die) \
345 __process_list_type(state, cache, die, #type " "); \
352 static void __process_type(struct state *state, struct die *cache, in DEFINE_PROCESS_LIST_TYPE()
353 Dwarf_Die *die, const char *type) in DEFINE_PROCESS_LIST_TYPE()
356 process_fqn(cache, die); in DEFINE_PROCESS_LIST_TYPE()
359 process_type_attr(state, cache, die); in DEFINE_PROCESS_LIST_TYPE()
362 process_byte_size_attr(cache, die); in DEFINE_PROCESS_LIST_TYPE()
363 process_alignment_attr(cache, die); in DEFINE_PROCESS_LIST_TYPE()
368 struct die *cache, Dwarf_Die *die) \
370 __process_type(state, cache, die, #type "_type"); \
386 static void process_subrange_type(struct state *state, struct die *cache, in DEFINE_PROCESS_TYPE()
387 Dwarf_Die *die) in DEFINE_PROCESS_TYPE()
391 if (get_udata_attr(die, DW_AT_count, &count)) in DEFINE_PROCESS_TYPE()
393 else if (get_udata_attr(die, DW_AT_upper_bound, &count)) in DEFINE_PROCESS_TYPE()
399 static void process_array_type(struct state *state, struct die *cache, in process_array_type()
400 Dwarf_Die *die) in process_array_type() argument
404 check(process_die_container(state, cache, die, process_type, in process_array_type()
408 process_type_attr(state, cache, die); in process_array_type()
413 static void __process_subroutine_type(struct state *state, struct die *cache, in __process_subroutine_type()
414 Dwarf_Die *die, const char *type) in __process_subroutine_type() argument
420 check(process_die_container(state, cache, die, process_type, in __process_subroutine_type()
427 process_type_attr(state, cache, die); in __process_subroutine_type()
430 static void process_subroutine_type(struct state *state, struct die *cache, in process_subroutine_type()
431 Dwarf_Die *die) in process_subroutine_type() argument
433 __process_subroutine_type(state, cache, die, "subroutine_type"); in process_subroutine_type()
436 static void process_variant_type(struct state *state, struct die *cache, in process_variant_type()
437 Dwarf_Die *die) in process_variant_type() argument
442 check(process_die_container(state, cache, die, process_type, in process_variant_type()
446 process_discr_value_attr(cache, die); in process_variant_type()
449 static void process_variant_part_type(struct state *state, struct die *cache, in process_variant_part_type()
450 Dwarf_Die *die) in process_variant_part_type() argument
455 check(process_die_container(state, cache, die, process_type, in process_variant_part_type()
461 static int get_kabi_status(Dwarf_Die *die, const char **suffix) in get_kabi_status() argument
463 const char *name = get_name_attr(die); in get_kabi_status()
492 struct die *__unused, Dwarf_Die *die) in check_struct_member_kabi_status() argument
496 assert(dwarf_tag(die) == DW_TAG_member_type); in check_struct_member_kabi_status()
509 res = get_kabi_status(die, &state->kabi.orig_name); in check_struct_member_kabi_status()
512 !get_ref_die_attr(die, DW_AT_type, &state->kabi.placeholder)) in check_struct_member_kabi_status()
519 struct die *__unused, Dwarf_Die *die) in check_union_member_kabi_status() argument
524 assert(dwarf_tag(die) == DW_TAG_member_type); in check_union_member_kabi_status()
526 if (!get_ref_die_attr(die, DW_AT_type, &type)) in check_union_member_kabi_status()
544 res = get_kabi_status(die, &state->kabi.orig_name); in check_union_member_kabi_status()
562 static int get_union_kabi_status(Dwarf_Die *die, Dwarf_Die *placeholder, in get_union_kabi_status() argument
627 res = checkp(process_die_container(&state, NULL, die, in get_union_kabi_status()
641 static bool is_kabi_ignored(Dwarf_Die *die) in is_kabi_ignored() argument
648 if (!get_ref_die_attr(die, DW_AT_type, &type)) in is_kabi_ignored()
655 static int ___process_structure_type(struct state *state, struct die *cache, in ___process_structure_type()
656 Dwarf_Die *die) in ___process_structure_type() argument
658 switch (dwarf_tag(die)) { in ___process_structure_type()
660 if (is_kabi_ignored(die)) in ___process_structure_type()
662 return check(process_type(state, cache, die)); in ___process_structure_type()
664 return check(process_type(state, cache, die)); in ___process_structure_type()
674 error("unexpected structure_type child: %x", dwarf_tag(die)); in ___process_structure_type()
678 static void __process_structure_type(struct state *state, struct die *cache, in __process_structure_type()
679 Dwarf_Die *die, const char *type, in __process_structure_type() argument
686 process_fqn(cache, die); in __process_structure_type()
690 expand = state->expand.expand && is_kabi_definition(cache, die); in __process_structure_type()
694 check(process_die_container(state, cache, die, process_func, in __process_structure_type()
702 process_byte_size_attr(cache, die); in __process_structure_type()
703 process_alignment_attr(cache, die); in __process_structure_type()
709 struct state *state, struct die *cache, Dwarf_Die *die) \
711 __process_structure_type(state, cache, die, \
720 static void process_union_type(struct state *state, struct die *cache, in DEFINE_PROCESS_STRUCTURE_TYPE()
721 Dwarf_Die *die) in DEFINE_PROCESS_STRUCTURE_TYPE()
725 int res = checkp(get_union_kabi_status(die, &placeholder, in DEFINE_PROCESS_STRUCTURE_TYPE()
733 __process_structure_type(state, cache, die, "union_type", in DEFINE_PROCESS_STRUCTURE_TYPE()
737 static void process_enumerator_type(struct state *state, struct die *cache, in process_enumerator_type()
738 Dwarf_Die *die) in process_enumerator_type() argument
745 update_fqn(cache, die); in process_enumerator_type()
757 process_fqn(cache, die); in process_enumerator_type()
759 if (overridden || get_udata_attr(die, DW_AT_const_value, &value)) { in process_enumerator_type()
765 static void process_enumeration_type(struct state *state, struct die *cache, in process_enumeration_type()
766 Dwarf_Die *die) in process_enumeration_type() argument
768 __process_structure_type(state, cache, die, "enumeration_type", in process_enumeration_type()
772 static void process_base_type(struct state *state, struct die *cache, in process_base_type()
773 Dwarf_Die *die) in process_base_type() argument
776 process_fqn(cache, die); in process_base_type()
777 process_byte_size_attr(cache, die); in process_base_type()
778 process_encoding_attr(cache, die); in process_base_type()
779 process_alignment_attr(cache, die); in process_base_type()
782 static void process_unspecified_type(struct state *state, struct die *cache, in process_unspecified_type()
783 Dwarf_Die *die) in process_unspecified_type() argument
792 static void process_cached(struct state *state, struct die *cache, in process_cached()
793 Dwarf_Die *die) in process_cached() argument
809 if (!dwarf_die_addr_die(dwarf_cu_getdwarf(die->cu), in process_cached()
812 die_debug_b("cache %p DIE addr %" PRIxPTR " tag %x", in process_cached()
850 process_##type##_type(state, cache, die); \
853 static int process_type(struct state *state, struct die *parent, Dwarf_Die *die) in process_type() argument
856 struct die *cache; in process_type()
858 int tag = dwarf_tag(die); in process_type()
868 if (cache_was_expanded(&state->expansion_cache, die->addr)) in process_type()
872 cache_mark_expanded(&state->expansion_cache, die->addr); in process_type()
881 cache = die_map_get(die, want_state); in process_type()
884 die_debug_g("cached addr %p tag %x -- %s", die->addr, tag, in process_type()
887 process_cached(state, cache, die); in process_type()
894 die_debug_g("addr %p tag %x -- %s -> %s", die->addr, tag, in process_type()
932 die_debug_r("parent %p cache %p die addr %p tag %x", parent, cache, in process_type()
933 die->addr, tag); in process_type()
947 static struct die *get_symbol_cache(struct state *state, Dwarf_Die *die) in get_symbol_cache() argument
949 struct die *cache; in get_symbol_cache()
951 cache = die_map_get(die, DIE_SYMBOL); in get_symbol_cache()
954 return NULL; /* We already processed a symbol for this DIE */ in get_symbol_cache()
956 cache->tag = dwarf_tag(die); in get_symbol_cache()
960 static void process_symbol(struct state *state, Dwarf_Die *die, in process_symbol() argument
963 struct die *cache; in process_symbol()
965 symbol_set_die(state->sym, die); in process_symbol()
967 cache = get_symbol_cache(state, die); in process_symbol()
972 check(process_func(state, cache, die)); in process_symbol()
978 static int __process_subprogram(struct state *state, struct die *cache, in __process_subprogram()
979 Dwarf_Die *die) in __process_subprogram() argument
981 __process_subroutine_type(state, cache, die, "subprogram"); in __process_subprogram()
985 static void process_subprogram(struct state *state, Dwarf_Die *die) in process_subprogram() argument
987 process_symbol(state, die, __process_subprogram); in process_subprogram()
990 static int __process_variable(struct state *state, struct die *cache, in __process_variable()
991 Dwarf_Die *die) in __process_variable() argument
994 process_type_attr(state, cache, die); in __process_variable()
998 static void process_variable(struct state *state, Dwarf_Die *die) in process_variable() argument
1000 process_symbol(state, die, __process_variable); in process_variable()
1008 if (!get_ref_die_attr(&state->die, DW_AT_type, &ptr_type) || in save_symbol_ptr()
1011 get_symbol_name(&state->die)); in save_symbol_ptr()
1015 get_symbol_name(&state->die)); in save_symbol_ptr()
1018 * Save the symbol pointer DIE in case the actual symbol is in save_symbol_ptr()
1028 static int process_exported_symbols(struct state *unused, struct die *cache, in process_exported_symbols()
1029 Dwarf_Die *die) in process_exported_symbols() argument
1031 int tag = dwarf_tag(die); in process_exported_symbols()
1039 NULL, cache, die, process_exported_symbols, match_all)); in process_exported_symbols()
1046 if (!match_export_symbol(&state, die)) in process_exported_symbols()
1051 if (is_symbol_ptr(get_symbol_name(&state.die))) in process_exported_symbols()
1054 process_subprogram(&state, &state.die); in process_exported_symbols()
1056 process_variable(&state, &state.die); in process_exported_symbols()
1078 if (!dwarf_die_addr_die(dwarf, (void *)sym->ptr_die_addr, &state.die)) in process_symbol_ptr()
1082 if (dwarf_tag(&state.die) == DW_TAG_subroutine_type) in process_symbol_ptr()
1083 process_subprogram(&state, &state.die); in process_symbol_ptr()
1085 process_variable(&state, &state.die); in process_symbol_ptr()
1090 static int resolve_fqns(struct state *parent, struct die *unused, in resolve_fqns()
1091 Dwarf_Die *die) in resolve_fqns() argument
1094 struct die *cache; in resolve_fqns()
1101 if (!__die_map_get((uintptr_t)die->addr, DIE_FQN, &cache)) in resolve_fqns()
1104 tag = dwarf_tag(die); in resolve_fqns()
1114 name = get_name_attr(die); in resolve_fqns()
1118 * The fqn for the current DIE, and if needed, a prefix for the in resolve_fqns()
1129 * Use fqn only if the DIE has a name. Otherwise fqn will in resolve_fqns()
1145 /* If the DIE has a non-empty name, cache it. */ in resolve_fqns()
1147 cache = die_map_get(die, DIE_FQN); in resolve_fqns()
1153 check(process_die_container(&state, NULL, die, resolve_fqns, in resolve_fqns()