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)) \
236 static void process_byte_size_attr(struct die *cache, Dwarf_Die *die) in DEFINE_PROCESS_UDATA_ATTRIBUTE()
241 if (get_udata_attr(die, DW_AT_byte_size, &value)) { in DEFINE_PROCESS_UDATA_ATTRIBUTE()
251 static bool match_##type##_type(Dwarf_Die *die) \
253 return dwarf_tag(die) == DW_TAG_##type##_type; \
261 bool match_all(Dwarf_Die *die) in DEFINE_MATCH()
266 int process_die_container(struct state *state, struct die *cache, in process_die_container()
267 Dwarf_Die *die, die_callback_t func, in process_die_container() argument
277 res = checkp(dwarf_child(die, ¤t)); in process_die_container()
297 static int process_type(struct state *state, struct die *parent,
298 Dwarf_Die *die);
300 static void process_type_attr(struct state *state, struct die *cache, in process_type_attr()
301 Dwarf_Die *die) in process_type_attr() argument
305 if (get_ref_die_attr(die, DW_AT_type, &type)) { in process_type_attr()
314 static void process_list_comma(struct state *state, struct die *cache) in process_list_comma()
325 static void __process_list_type(struct state *state, struct die *cache, in __process_list_type()
326 Dwarf_Die *die, const char *type) in __process_list_type() argument
328 const char *name = get_name_attr(die); in __process_list_type()
338 process_type_attr(state, cache, die); in __process_list_type()
347 process_accessibility_attr(cache, die); in __process_list_type()
348 process_bit_size_attr(cache, die); in __process_list_type()
349 process_data_bit_offset_attr(cache, die); in __process_list_type()
350 process_data_member_location_attr(cache, die); in __process_list_type()
355 struct die *cache, Dwarf_Die *die) \
357 __process_list_type(state, cache, die, #type " "); \
364 static void __process_type(struct state *state, struct die *cache, in DEFINE_PROCESS_LIST_TYPE()
365 Dwarf_Die *die, const char *type) in DEFINE_PROCESS_LIST_TYPE()
368 process_fqn(cache, die); in DEFINE_PROCESS_LIST_TYPE()
371 process_type_attr(state, cache, die); in DEFINE_PROCESS_LIST_TYPE()
374 process_byte_size_attr(cache, die); in DEFINE_PROCESS_LIST_TYPE()
375 process_alignment_attr(cache, die); in DEFINE_PROCESS_LIST_TYPE()
380 struct die *cache, Dwarf_Die *die) \
382 __process_type(state, cache, die, #type "_type"); \
398 static void process_subrange_type(struct state *state, struct die *cache, in DEFINE_PROCESS_TYPE()
399 Dwarf_Die *die) in DEFINE_PROCESS_TYPE()
403 if (get_udata_attr(die, DW_AT_count, &count)) in DEFINE_PROCESS_TYPE()
405 else if (get_udata_attr(die, DW_AT_upper_bound, &count)) in DEFINE_PROCESS_TYPE()
411 static void process_array_type(struct state *state, struct die *cache, in process_array_type()
412 Dwarf_Die *die) in process_array_type() argument
416 check(process_die_container(state, cache, die, process_type, in process_array_type()
420 process_type_attr(state, cache, die); in process_array_type()
425 static void __process_subroutine_type(struct state *state, struct die *cache, in __process_subroutine_type()
426 Dwarf_Die *die, const char *type) in __process_subroutine_type() argument
432 check(process_die_container(state, cache, die, process_type, in __process_subroutine_type()
439 process_type_attr(state, cache, die); in __process_subroutine_type()
442 static void process_subroutine_type(struct state *state, struct die *cache, in process_subroutine_type()
443 Dwarf_Die *die) in process_subroutine_type() argument
445 __process_subroutine_type(state, cache, die, "subroutine_type"); in process_subroutine_type()
448 static void process_variant_type(struct state *state, struct die *cache, in process_variant_type()
449 Dwarf_Die *die) in process_variant_type() argument
454 check(process_die_container(state, cache, die, process_type, in process_variant_type()
458 process_discr_value_attr(cache, die); in process_variant_type()
461 static void process_variant_part_type(struct state *state, struct die *cache, in process_variant_part_type()
462 Dwarf_Die *die) in process_variant_part_type() argument
467 check(process_die_container(state, cache, die, process_type, in process_variant_part_type()
473 static int get_kabi_status(Dwarf_Die *die, const char **suffix) in get_kabi_status() argument
475 const char *name = get_name_attr(die); in get_kabi_status()
504 struct die *__unused, Dwarf_Die *die) in check_struct_member_kabi_status() argument
508 assert(dwarf_tag(die) == DW_TAG_member_type); in check_struct_member_kabi_status()
521 res = get_kabi_status(die, &state->kabi.orig_name); in check_struct_member_kabi_status()
524 !get_ref_die_attr(die, DW_AT_type, &state->kabi.placeholder)) in check_struct_member_kabi_status()
531 struct die *__unused, Dwarf_Die *die) in check_union_member_kabi_status() argument
536 assert(dwarf_tag(die) == DW_TAG_member_type); in check_union_member_kabi_status()
538 if (!get_ref_die_attr(die, DW_AT_type, &type)) in check_union_member_kabi_status()
556 res = get_kabi_status(die, &state->kabi.orig_name); in check_union_member_kabi_status()
574 static int get_union_kabi_status(Dwarf_Die *die, Dwarf_Die *placeholder, in get_union_kabi_status() argument
639 res = checkp(process_die_container(&state, NULL, die, in get_union_kabi_status()
653 static bool is_kabi_ignored(Dwarf_Die *die) in is_kabi_ignored() argument
660 if (!get_ref_die_attr(die, DW_AT_type, &type)) in is_kabi_ignored()
667 static int ___process_structure_type(struct state *state, struct die *cache, in ___process_structure_type()
668 Dwarf_Die *die) in ___process_structure_type() argument
670 switch (dwarf_tag(die)) { in ___process_structure_type()
672 if (is_kabi_ignored(die)) in ___process_structure_type()
674 return check(process_type(state, cache, die)); in ___process_structure_type()
676 return check(process_type(state, cache, die)); in ___process_structure_type()
686 error("unexpected structure_type child: %x", dwarf_tag(die)); in ___process_structure_type()
690 static void __process_structure_type(struct state *state, struct die *cache, in __process_structure_type()
691 Dwarf_Die *die, const char *type, in __process_structure_type() argument
698 process_fqn(cache, die); in __process_structure_type()
702 expand = state->expand.expand && is_kabi_definition(cache, die); in __process_structure_type()
706 check(process_die_container(state, cache, die, process_func, in __process_structure_type()
714 process_byte_size_attr(cache, die); in __process_structure_type()
715 process_alignment_attr(cache, die); in __process_structure_type()
721 struct state *state, struct die *cache, Dwarf_Die *die) \
723 __process_structure_type(state, cache, die, \
732 static void process_union_type(struct state *state, struct die *cache, in DEFINE_PROCESS_STRUCTURE_TYPE()
733 Dwarf_Die *die) in DEFINE_PROCESS_STRUCTURE_TYPE()
737 int res = checkp(get_union_kabi_status(die, &placeholder, in DEFINE_PROCESS_STRUCTURE_TYPE()
745 __process_structure_type(state, cache, die, "union_type", in DEFINE_PROCESS_STRUCTURE_TYPE()
749 static void process_enumerator_type(struct state *state, struct die *cache, in process_enumerator_type()
750 Dwarf_Die *die) in process_enumerator_type() argument
757 update_fqn(cache, die); in process_enumerator_type()
769 process_fqn(cache, die); in process_enumerator_type()
771 if (overridden || get_udata_attr(die, DW_AT_const_value, &value)) { in process_enumerator_type()
777 static void process_enumeration_type(struct state *state, struct die *cache, in process_enumeration_type()
778 Dwarf_Die *die) in process_enumeration_type() argument
780 __process_structure_type(state, cache, die, "enumeration_type", in process_enumeration_type()
784 static void process_base_type(struct state *state, struct die *cache, in process_base_type()
785 Dwarf_Die *die) in process_base_type() argument
788 process_fqn(cache, die); in process_base_type()
789 process_byte_size_attr(cache, die); in process_base_type()
790 process_encoding_attr(cache, die); in process_base_type()
791 process_alignment_attr(cache, die); in process_base_type()
794 static void process_unspecified_type(struct state *state, struct die *cache, in process_unspecified_type()
795 Dwarf_Die *die) in process_unspecified_type() argument
804 static void process_cached(struct state *state, struct die *cache, in process_cached()
805 Dwarf_Die *die) in process_cached() argument
821 if (!dwarf_die_addr_die(dwarf_cu_getdwarf(die->cu), in process_cached()
824 die_debug_b("cache %p DIE addr %" PRIxPTR " tag %x", in process_cached()
862 process_##type##_type(state, cache, die); \
865 static int process_type(struct state *state, struct die *parent, Dwarf_Die *die) in process_type() argument
868 struct die *cache; in process_type()
870 int tag = dwarf_tag(die); in process_type()
880 if (cache_was_expanded(&state->expansion_cache, die->addr)) in process_type()
884 cache_mark_expanded(&state->expansion_cache, die->addr); in process_type()
893 cache = die_map_get(die, want_state); in process_type()
896 die_debug_g("cached addr %p tag %x -- %s", die->addr, tag, in process_type()
899 process_cached(state, cache, die); in process_type()
906 die_debug_g("addr %p tag %x -- %s -> %s", die->addr, tag, in process_type()
944 die_debug_r("parent %p cache %p die addr %p tag %x", parent, cache, in process_type()
945 die->addr, tag); in process_type()
959 static struct die *get_symbol_cache(struct state *state, Dwarf_Die *die) in get_symbol_cache() argument
961 struct die *cache; in get_symbol_cache()
963 cache = die_map_get(die, DIE_SYMBOL); in get_symbol_cache()
966 return NULL; /* We already processed a symbol for this DIE */ in get_symbol_cache()
968 cache->tag = dwarf_tag(die); in get_symbol_cache()
972 static void process_symbol(struct state *state, Dwarf_Die *die, in process_symbol() argument
975 struct die *cache; in process_symbol()
977 symbol_set_die(state->sym, die); in process_symbol()
979 cache = get_symbol_cache(state, die); in process_symbol()
984 check(process_func(state, cache, die)); in process_symbol()
990 static int __process_subprogram(struct state *state, struct die *cache, in __process_subprogram()
991 Dwarf_Die *die) in __process_subprogram() argument
993 __process_subroutine_type(state, cache, die, "subprogram"); in __process_subprogram()
997 static void process_subprogram(struct state *state, Dwarf_Die *die) in process_subprogram() argument
999 process_symbol(state, die, __process_subprogram); in process_subprogram()
1002 static int __process_variable(struct state *state, struct die *cache, in __process_variable()
1003 Dwarf_Die *die) in __process_variable() argument
1006 process_type_attr(state, cache, die); in __process_variable()
1010 static void process_variable(struct state *state, Dwarf_Die *die) in process_variable() argument
1012 process_symbol(state, die, __process_variable); in process_variable()
1020 if (!get_ref_die_attr(&state->die, DW_AT_type, &ptr_type) || in save_symbol_ptr()
1023 get_symbol_name(&state->die)); in save_symbol_ptr()
1027 get_symbol_name(&state->die)); in save_symbol_ptr()
1030 * Save the symbol pointer DIE in case the actual symbol is in save_symbol_ptr()
1040 static int process_exported_symbols(struct state *unused, struct die *cache, in process_exported_symbols()
1041 Dwarf_Die *die) in process_exported_symbols() argument
1043 int tag = dwarf_tag(die); in process_exported_symbols()
1051 NULL, cache, die, process_exported_symbols, match_all)); in process_exported_symbols()
1058 if (!match_export_symbol(&state, die)) in process_exported_symbols()
1063 if (is_symbol_ptr(get_symbol_name(&state.die))) in process_exported_symbols()
1066 process_subprogram(&state, &state.die); in process_exported_symbols()
1068 process_variable(&state, &state.die); in process_exported_symbols()
1090 if (!dwarf_die_addr_die(dwarf, (void *)sym->ptr_die_addr, &state.die)) in process_symbol_ptr()
1094 if (dwarf_tag(&state.die) == DW_TAG_subroutine_type) in process_symbol_ptr()
1095 process_subprogram(&state, &state.die); in process_symbol_ptr()
1097 process_variable(&state, &state.die); in process_symbol_ptr()
1102 static int resolve_fqns(struct state *parent, struct die *unused, in resolve_fqns()
1103 Dwarf_Die *die) in resolve_fqns() argument
1106 struct die *cache; in resolve_fqns()
1113 if (!__die_map_get((uintptr_t)die->addr, DIE_FQN, &cache)) in resolve_fqns()
1116 tag = dwarf_tag(die); in resolve_fqns()
1126 name = get_name_attr(die); in resolve_fqns()
1130 * The fqn for the current DIE, and if needed, a prefix for the in resolve_fqns()
1141 * Use fqn only if the DIE has a name. Otherwise fqn will in resolve_fqns()
1157 /* If the DIE has a non-empty name, cache it. */ in resolve_fqns()
1159 cache = die_map_get(die, DIE_FQN); in resolve_fqns()
1165 check(process_die_container(&state, NULL, die, resolve_fqns, in resolve_fqns()