gendwarfksyms: Expand array_type

Add support for expanding DW_TAG_array_type, and the subrange type
indicating array size.

Example source code:

  const char *s[34];

Output with --dump-dies:

  variable array_type[34] {
    pointer_type {
      const_type {
        base_type char byte_size(1) encoding(6)
      }
    } byte_size(8)
  }

Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
Reviewed-by: Petr Pavlu <petr.pavlu@suse.com>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
This commit is contained in:
Sami Tolvanen 2025-01-03 20:45:29 +00:00 committed by Masahiro Yamada
parent 220a0857f3
commit c772f1d1ea

View file

@ -220,6 +220,7 @@ DEFINE_PROCESS_UDATA_ATTRIBUTE(encoding)
}
DEFINE_MATCH(formal_parameter)
DEFINE_MATCH(subrange)
bool match_all(Dwarf_Die *die)
{
@ -342,6 +343,33 @@ DEFINE_PROCESS_TYPE(shared)
DEFINE_PROCESS_TYPE(volatile)
DEFINE_PROCESS_TYPE(typedef)
static void process_subrange_type(struct state *state, struct die *cache,
Dwarf_Die *die)
{
Dwarf_Word count = 0;
if (get_udata_attr(die, DW_AT_count, &count))
process_fmt(cache, "[%" PRIu64 "]", count);
else if (get_udata_attr(die, DW_AT_upper_bound, &count))
process_fmt(cache, "[%" PRIu64 "]", count + 1);
else
process(cache, "[]");
}
static void process_array_type(struct state *state, struct die *cache,
Dwarf_Die *die)
{
process(cache, "array_type");
/* Array size */
check(process_die_container(state, cache, die, process_type,
match_subrange_type));
process(cache, " {");
process_linebreak(cache, 1);
process_type_attr(state, cache, die);
process_linebreak(cache, -1);
process(cache, "}");
}
static void __process_subroutine_type(struct state *state, struct die *cache,
Dwarf_Die *die, const char *type)
{
@ -437,7 +465,9 @@ static int process_type(struct state *state, struct die *parent, Dwarf_Die *die)
PROCESS_TYPE(volatile)
/* Subtypes */
PROCESS_TYPE(formal_parameter)
PROCESS_TYPE(subrange)
/* Other types */
PROCESS_TYPE(array)
PROCESS_TYPE(base)
PROCESS_TYPE(subroutine)
PROCESS_TYPE(typedef)