Lines Matching full:die

27 	/* >0 to stop DIE processing */
37 static void process_linebreak(struct die *cache, int n) in process_linebreak()
45 static bool get_##attr##_attr(Dwarf_Die *die, unsigned int id, \
49 return dwarf_attr(die, id, &da) && \
56 static bool get_ref_die_attr(Dwarf_Die *die, unsigned int id, Dwarf_Die *value) in DEFINE_GET_ATTR()
61 return dwarf_attr(die, id, &da) && dwarf_formref_die(&da, value); in DEFINE_GET_ATTR()
65 static const char *get_##attr##_attr(Dwarf_Die *die) \
68 if (dwarf_attr(die, DW_AT_##attr, &da)) \
76 static const char *get_symbol_name(Dwarf_Die *die) in DEFINE_GET_STRING_ATTR()
81 name = get_linkage_name_attr(die); in DEFINE_GET_STRING_ATTR()
83 name = get_name_attr(die); in DEFINE_GET_STRING_ATTR()
88 static bool match_export_symbol(struct state *state, Dwarf_Die *die) in match_export_symbol() argument
90 Dwarf_Die *source = die; in match_export_symbol()
93 /* If the DIE has an abstract origin, use it for type information. */ in match_export_symbol()
94 if (get_ref_die_attr(die, DW_AT_abstract_origin, &origin)) in match_export_symbol()
97 state->sym = symbol_get(get_symbol_name(die)); in match_export_symbol()
100 if (!state->sym && source != die) in match_export_symbol()
103 state->die = *source; in match_export_symbol()
110 static bool is_definition_private(Dwarf_Die *die) in is_definition_private() argument
122 if (!get_udata_attr(die, DW_AT_decl_file, &filenum)) in is_definition_private()
129 if (!dwarf_cu_die(die->cu, &cudie, NULL, NULL, NULL, NULL, NULL, NULL)) in is_definition_private()
146 static bool is_kabi_definition(struct die *cache, Dwarf_Die *die) in is_kabi_definition() argument
150 if (get_flag_attr(die, DW_AT_declaration, &value) && value) in is_kabi_definition()
156 return !is_definition_private(die); in is_kabi_definition()
162 static void process(struct die *cache, const char *s) in process()
182 static void process_fmt(struct die *cache, const char *fmt, ...) in process_fmt()
199 static char *get_fqn(Dwarf_Die *die) in get_fqn() argument
211 res = checkp(dwarf_getscopes_die(die, &scopes)); in get_fqn()
213 list[count] = get_name_attr(die); in get_fqn()
251 /* Consider the DIE unnamed if the last scope doesn't have a name */ in get_fqn()
265 static void update_fqn(struct die *cache, Dwarf_Die *die) in update_fqn() argument
268 cache->fqn = get_fqn(die) ?: ""; in update_fqn()
271 static void process_fqn(struct die *cache, Dwarf_Die *die) in process_fqn() argument
273 update_fqn(cache, die); in process_fqn()
280 static void process_##attribute##_attr(struct die *cache, \
281 Dwarf_Die *die) \
284 if (get_udata_attr(die, DW_AT_##attribute, &value)) \
300 static bool match_##type##_type(Dwarf_Die *die) \ in DEFINE_PROCESS_UDATA_ATTRIBUTE()
302 return dwarf_tag(die) == DW_TAG_##type##_type; \ in DEFINE_PROCESS_UDATA_ATTRIBUTE()
310 bool match_all(Dwarf_Die *die)
315 int process_die_container(struct state *state, struct die *cache, in process_die_container()
316 Dwarf_Die *die, die_callback_t func, in process_die_container() argument
326 res = checkp(dwarf_child(die, &current)); in process_die_container()
346 static int process_type(struct state *state, struct die *parent,
347 Dwarf_Die *die);
349 static void process_type_attr(struct state *state, struct die *cache, in process_type_attr()
350 Dwarf_Die *die) in process_type_attr() argument
354 if (get_ref_die_attr(die, DW_AT_type, &type)) { in process_type_attr()
363 static void process_list_comma(struct state *state, struct die *cache) in process_list_comma()
374 static void __process_list_type(struct state *state, struct die *cache, in __process_list_type()
375 Dwarf_Die *die, const char *type) in __process_list_type() argument
377 const char *name = get_name_attr(die); in __process_list_type()
387 process_type_attr(state, cache, die); in __process_list_type()
396 process_accessibility_attr(cache, die); in __process_list_type()
397 process_bit_size_attr(cache, die); in __process_list_type()
398 process_data_bit_offset_attr(cache, die); in __process_list_type()
399 process_data_member_location_attr(cache, die); in __process_list_type()
404 struct die *cache, Dwarf_Die *die) \
406 __process_list_type(state, cache, die, #type " "); \
413 static void __process_type(struct state *state, struct die *cache, in DEFINE_PROCESS_LIST_TYPE()
414 Dwarf_Die *die, const char *type) in DEFINE_PROCESS_LIST_TYPE()
417 process_fqn(cache, die); in DEFINE_PROCESS_LIST_TYPE()
420 process_type_attr(state, cache, die); in DEFINE_PROCESS_LIST_TYPE()
423 process_byte_size_attr(cache, die); in DEFINE_PROCESS_LIST_TYPE()
424 process_alignment_attr(cache, die); in DEFINE_PROCESS_LIST_TYPE()
429 struct die *cache, Dwarf_Die *die) \
431 __process_type(state, cache, die, #type "_type"); \
447 static void process_subrange_type(struct state *state, struct die *cache, in DEFINE_PROCESS_TYPE()
448 Dwarf_Die *die) in DEFINE_PROCESS_TYPE()
452 if (get_udata_attr(die, DW_AT_count, &count)) in DEFINE_PROCESS_TYPE()
454 else if (get_udata_attr(die, DW_AT_upper_bound, &count)) in DEFINE_PROCESS_TYPE()
460 static void process_array_type(struct state *state, struct die *cache, in process_array_type()
461 Dwarf_Die *die) in process_array_type() argument
465 check(process_die_container(state, cache, die, process_type, in process_array_type()
469 process_type_attr(state, cache, die); in process_array_type()
474 static void __process_subroutine_type(struct state *state, struct die *cache, in __process_subroutine_type()
475 Dwarf_Die *die, const char *type) in __process_subroutine_type() argument
481 check(process_die_container(state, cache, die, process_type, in __process_subroutine_type()
488 process_type_attr(state, cache, die); in __process_subroutine_type()
491 static void process_subroutine_type(struct state *state, struct die *cache, in process_subroutine_type()
492 Dwarf_Die *die) in process_subroutine_type() argument
494 __process_subroutine_type(state, cache, die, "subroutine_type"); in process_subroutine_type()
497 static void process_variant_type(struct state *state, struct die *cache, in process_variant_type()
498 Dwarf_Die *die) in process_variant_type() argument
503 check(process_die_container(state, cache, die, process_type, in process_variant_type()
507 process_discr_value_attr(cache, die); in process_variant_type()
510 static void process_variant_part_type(struct state *state, struct die *cache, in process_variant_part_type()
511 Dwarf_Die *die) in process_variant_part_type() argument
516 check(process_die_container(state, cache, die, process_type, in process_variant_part_type()
522 static int get_kabi_status(Dwarf_Die *die, const char **suffix) in get_kabi_status() argument
524 const char *name = get_name_attr(die); in get_kabi_status()
553 struct die *__unused, Dwarf_Die *die) in check_struct_member_kabi_status() argument
557 assert(dwarf_tag(die) == DW_TAG_member_type); in check_struct_member_kabi_status()
570 res = get_kabi_status(die, &state->kabi.orig_name); in check_struct_member_kabi_status()
573 !get_ref_die_attr(die, DW_AT_type, &state->kabi.placeholder)) in check_struct_member_kabi_status()
580 struct die *__unused, Dwarf_Die *die) in check_union_member_kabi_status() argument
585 assert(dwarf_tag(die) == DW_TAG_member_type); in check_union_member_kabi_status()
587 if (!get_ref_die_attr(die, DW_AT_type, &type)) in check_union_member_kabi_status()
605 res = get_kabi_status(die, &state->kabi.orig_name); in check_union_member_kabi_status()
623 static int get_union_kabi_status(Dwarf_Die *die, Dwarf_Die *placeholder, in get_union_kabi_status() argument
688 res = checkp(process_die_container(&state, NULL, die, in get_union_kabi_status()
702 static bool is_kabi_ignored(Dwarf_Die *die) in is_kabi_ignored() argument
709 if (!get_ref_die_attr(die, DW_AT_type, &type)) in is_kabi_ignored()
716 static int ___process_structure_type(struct state *state, struct die *cache, in ___process_structure_type()
717 Dwarf_Die *die) in ___process_structure_type() argument
719 switch (dwarf_tag(die)) { in ___process_structure_type()
721 if (is_kabi_ignored(die)) in ___process_structure_type()
723 return check(process_type(state, cache, die)); in ___process_structure_type()
725 return check(process_type(state, cache, die)); in ___process_structure_type()
735 error("unexpected structure_type child: %x", dwarf_tag(die)); in ___process_structure_type()
739 static void __process_structure_type(struct state *state, struct die *cache, in __process_structure_type()
740 Dwarf_Die *die, const char *type, in __process_structure_type() argument
747 process_fqn(cache, die); in __process_structure_type()
751 expand = state->expand.expand && is_kabi_definition(cache, die); in __process_structure_type()
755 check(process_die_container(state, cache, die, process_func, in __process_structure_type()
763 process_byte_size_attr(cache, die); in __process_structure_type()
764 process_alignment_attr(cache, die); in __process_structure_type()
770 struct state *state, struct die *cache, Dwarf_Die *die) \
772 __process_structure_type(state, cache, die, \
781 static void process_union_type(struct state *state, struct die *cache, in DEFINE_PROCESS_STRUCTURE_TYPE()
782 Dwarf_Die *die) in DEFINE_PROCESS_STRUCTURE_TYPE()
786 int res = checkp(get_union_kabi_status(die, &placeholder, in DEFINE_PROCESS_STRUCTURE_TYPE()
794 __process_structure_type(state, cache, die, "union_type", in DEFINE_PROCESS_STRUCTURE_TYPE()
798 static void process_enumerator_type(struct state *state, struct die *cache, in process_enumerator_type()
799 Dwarf_Die *die) in process_enumerator_type() argument
806 update_fqn(cache, die); in process_enumerator_type()
818 process_fqn(cache, die); in process_enumerator_type()
820 if (overridden || get_udata_attr(die, DW_AT_const_value, &value)) { in process_enumerator_type()
826 static void process_enumeration_type(struct state *state, struct die *cache, in process_enumeration_type()
827 Dwarf_Die *die) in process_enumeration_type() argument
829 __process_structure_type(state, cache, die, "enumeration_type", in process_enumeration_type()
833 static void process_base_type(struct state *state, struct die *cache, in process_base_type()
834 Dwarf_Die *die) in process_base_type() argument
837 process_fqn(cache, die); in process_base_type()
838 process_byte_size_attr(cache, die); in process_base_type()
839 process_encoding_attr(cache, die); in process_base_type()
840 process_alignment_attr(cache, die); in process_base_type()
843 static void process_unspecified_type(struct state *state, struct die *cache, in process_unspecified_type()
844 Dwarf_Die *die) in process_unspecified_type() argument
853 static void process_cached(struct state *state, struct die *cache, in process_cached()
854 Dwarf_Die *die) in process_cached() argument
870 if (!dwarf_die_addr_die(dwarf_cu_getdwarf(die->cu), in process_cached()
873 die_debug_b("cache %p DIE addr %" PRIxPTR " tag %x", in process_cached()
911 process_##type##_type(state, cache, die); \
914 static int process_type(struct state *state, struct die *parent, Dwarf_Die *die) in process_type() argument
917 struct die *cache; in process_type()
919 int tag = dwarf_tag(die); in process_type()
929 if (cache_was_expanded(&state->expansion_cache, die->addr)) in process_type()
933 cache_mark_expanded(&state->expansion_cache, die->addr); in process_type()
942 cache = die_map_get(die, want_state); in process_type()
945 die_debug_g("cached addr %p tag %x -- %s", die->addr, tag, in process_type()
948 process_cached(state, cache, die); in process_type()
955 die_debug_g("addr %p tag %x -- %s -> %s", die->addr, tag, in process_type()
993 die_debug_r("parent %p cache %p die addr %p tag %x", parent, cache, in process_type()
994 die->addr, tag); in process_type()
1008 static struct die *get_symbol_cache(struct state *state, Dwarf_Die *die) in get_symbol_cache() argument
1010 struct die *cache; in get_symbol_cache()
1012 cache = die_map_get(die, DIE_SYMBOL); in get_symbol_cache()
1015 return NULL; /* We already processed a symbol for this DIE */ in get_symbol_cache()
1017 cache->tag = dwarf_tag(die); in get_symbol_cache()
1021 static void process_symbol(struct state *state, Dwarf_Die *die, in process_symbol() argument
1024 struct die *cache; in process_symbol()
1026 symbol_set_die(state->sym, die); in process_symbol()
1028 cache = get_symbol_cache(state, die); in process_symbol()
1033 check(process_func(state, cache, die)); in process_symbol()
1039 static int __process_subprogram(struct state *state, struct die *cache, in __process_subprogram()
1040 Dwarf_Die *die) in __process_subprogram() argument
1042 __process_subroutine_type(state, cache, die, "subprogram"); in __process_subprogram()
1046 static void process_subprogram(struct state *state, Dwarf_Die *die) in process_subprogram() argument
1048 process_symbol(state, die, __process_subprogram); in process_subprogram()
1051 static int __process_variable(struct state *state, struct die *cache, in __process_variable()
1052 Dwarf_Die *die) in __process_variable() argument
1055 process_type_attr(state, cache, die); in __process_variable()
1059 static void process_variable(struct state *state, Dwarf_Die *die) in process_variable() argument
1061 process_symbol(state, die, __process_variable); in process_variable()
1069 if (!get_ref_die_attr(&state->die, DW_AT_type, &ptr_type) || in save_symbol_ptr()
1072 get_symbol_name(&state->die)); in save_symbol_ptr()
1076 get_symbol_name(&state->die)); in save_symbol_ptr()
1079 * Save the symbol pointer DIE in case the actual symbol is in save_symbol_ptr()
1089 static int process_exported_symbols(struct state *unused, struct die *cache, in process_exported_symbols()
1090 Dwarf_Die *die) in process_exported_symbols() argument
1092 int tag = dwarf_tag(die); in process_exported_symbols()
1100 NULL, cache, die, process_exported_symbols, match_all)); in process_exported_symbols()
1107 if (!match_export_symbol(&state, die)) in process_exported_symbols()
1112 if (is_symbol_ptr(get_symbol_name(&state.die))) in process_exported_symbols()
1115 process_subprogram(&state, &state.die); in process_exported_symbols()
1117 process_variable(&state, &state.die); in process_exported_symbols()
1139 if (!dwarf_die_addr_die(dwarf, (void *)sym->ptr_die_addr, &state.die)) in process_symbol_ptr()
1143 if (dwarf_tag(&state.die) == DW_TAG_subroutine_type) in process_symbol_ptr()
1144 process_subprogram(&state, &state.die); in process_symbol_ptr()
1146 process_variable(&state, &state.die); in process_symbol_ptr()