Add linebreaks and indentation to --debug output. This will be particularly useful for more complex structures. Example output with --debug: variable pointer_type <unnamed> { base_type char byte_size(1) }; And the same with --debug --no-pretty-print: variable pointer_type <unnamed> {base_type char byte_size(1)}; Signed-off-by: Sami Tolvanen <samitolvanen@xxxxxxxxxx> --- tools/gendwarfksyms/cache.c | 13 +++++++++++++ tools/gendwarfksyms/gendwarfksyms.c | 3 +++ tools/gendwarfksyms/gendwarfksyms.h | 5 ++++- tools/gendwarfksyms/types.c | 22 ++++++++++++++++++++++ 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/tools/gendwarfksyms/cache.c b/tools/gendwarfksyms/cache.c index 9adda113e0b6..85a2adeb649d 100644 --- a/tools/gendwarfksyms/cache.c +++ b/tools/gendwarfksyms/cache.c @@ -133,6 +133,19 @@ int cache_add_string(struct cached_die *cd, const char *str) return 0; } +int cache_add_linebreak(struct cached_die *cd, int linebreak) +{ + struct cached_item *ci; + + if (!cd) + return 0; + + check(append_item(cd, &ci)); + ci->data.linebreak = linebreak; + ci->type = LINEBREAK; + return 0; +} + int cache_add_die(struct cached_die *cd, Dwarf_Die *die) { struct cached_item *ci; diff --git a/tools/gendwarfksyms/gendwarfksyms.c b/tools/gendwarfksyms/gendwarfksyms.c index 38ccaeb72426..7095f0ecccab 100644 --- a/tools/gendwarfksyms/gendwarfksyms.c +++ b/tools/gendwarfksyms/gendwarfksyms.c @@ -17,6 +17,8 @@ bool debug; /* Don't use caching */ bool no_cache; +/* Don't pretty-print (with --debug) */ +bool no_pretty_print; static const struct { const char *arg; @@ -24,6 +26,7 @@ static const struct { } options[] = { { "--debug", &debug }, { "--no-cache", &no_cache }, + { "--no-pretty-print", &no_pretty_print }, }; static int usage(void) diff --git a/tools/gendwarfksyms/gendwarfksyms.h b/tools/gendwarfksyms/gendwarfksyms.h index d5ebfe405445..43eff91e2f2f 100644 --- a/tools/gendwarfksyms/gendwarfksyms.h +++ b/tools/gendwarfksyms/gendwarfksyms.h @@ -19,6 +19,7 @@ */ extern bool debug; extern bool no_cache; +extern bool no_pretty_print; /* * Output helpers @@ -76,12 +77,13 @@ extern void symbol_print_versions(void); /* * cache.c */ -enum cached_item_type { EMPTY, STRING, DIE }; +enum cached_item_type { EMPTY, STRING, LINEBREAK, DIE }; struct cached_item { enum cached_item_type type; union { char *str; + int linebreak; uintptr_t addr; } data; struct cached_item *next; @@ -99,6 +101,7 @@ struct cached_die { extern int cache_get(Dwarf_Die *die, enum cached_die_state state, struct cached_die **res); extern int cache_add_string(struct cached_die *pd, const char *str); +extern int cache_add_linebreak(struct cached_die *pd, int linebreak); extern int cache_add_die(struct cached_die *pd, Dwarf_Die *die); extern void cache_free(void); diff --git a/tools/gendwarfksyms/types.c b/tools/gendwarfksyms/types.c index 27169c77937f..74b3755c3e16 100644 --- a/tools/gendwarfksyms/types.c +++ b/tools/gendwarfksyms/types.c @@ -6,6 +6,17 @@ #include "gendwarfksyms.h" #include "crc32.h" +static bool do_linebreak; +static int indentation_level; + +/* Line breaks and indentation for pretty-printing */ +static int process_linebreak(struct cached_die *cache, int n) +{ + indentation_level += n; + do_linebreak = true; + return check(cache_add_linebreak(cache, n)); +} + #define DEFINE_GET_ATTR(attr, type) \ static bool get_##attr##_attr(Dwarf_Die *die, unsigned int id, \ type *value) \ @@ -76,6 +87,12 @@ static int process(struct state *state, struct cached_die *cache, const char *s) { s = s ?: "<null>"; + if (debug && !no_pretty_print && do_linebreak) { + fputs("\n", stderr); + for (int i = 0; i < indentation_level; i++) + fputs(" ", stderr); + do_linebreak = false; + } if (debug) fputs(s, stderr); @@ -196,7 +213,9 @@ static int __process_type(struct state *state, struct cached_die *cache, check(process(state, cache, type)); check(process_fqn(state, cache, die)); check(process(state, cache, " {")); + check(process_linebreak(cache, 1)); check(process_type_attr(state, cache, die)); + check(process_linebreak(cache, -1)); check(process(state, cache, "}")); check(process_byte_size_attr(state, cache, die)); return check(process_alignment_attr(state, cache, die)); @@ -241,6 +260,9 @@ static int process_cached(struct state *state, struct cached_die *cache, case STRING: check(process(state, NULL, ci->data.str)); break; + case LINEBREAK: + check(process_linebreak(NULL, ci->data.linebreak)); + break; case DIE: if (!dwarf_die_addr_die(state->dbg, (void *)ci->data.addr, -- 2.45.2.627.g7a2c4fd464-goog