[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20240923181846.549877-34-samitolvanen@google.com>
Date: Mon, 23 Sep 2024 18:18:58 +0000
From: Sami Tolvanen <samitolvanen@...gle.com>
To: Masahiro Yamada <masahiroy@...nel.org>, Luis Chamberlain <mcgrof@...nel.org>,
Miguel Ojeda <ojeda@...nel.org>, Greg Kroah-Hartman <gregkh@...uxfoundation.org>
Cc: Matthew Maurer <mmaurer@...gle.com>, Alex Gaynor <alex.gaynor@...il.com>,
Wedson Almeida Filho <wedsonaf@...il.com>, Gary Guo <gary@...yguo.net>, Petr Pavlu <petr.pavlu@...e.com>,
Neal Gompa <neal@...pa.dev>, Hector Martin <marcan@...can.st>, Janne Grunau <j@...nau.net>,
Miroslav Benes <mbenes@...e.cz>, Asahi Linux <asahi@...ts.linux.dev>, linux-kbuild@...r.kernel.org,
linux-kernel@...r.kernel.org, linux-modules@...r.kernel.org,
rust-for-linux@...r.kernel.org, Sami Tolvanen <samitolvanen@...gle.com>
Subject: [PATCH v3 12/20] gendwarfksyms: Add die_map debugging
Debugging the DWARF processing can be somewhat challenging, so add
more detailed debugging output for die_map operations. Add the
--dump-die-map flag, which adds color coded tags to the output for
die_map changes.
Signed-off-by: Sami Tolvanen <samitolvanen@...gle.com>
---
scripts/gendwarfksyms/dwarf.c | 15 +++++++++++++++
scripts/gendwarfksyms/gendwarfksyms.c | 7 +++++++
scripts/gendwarfksyms/gendwarfksyms.h | 13 +++++++++++++
3 files changed, 35 insertions(+)
diff --git a/scripts/gendwarfksyms/dwarf.c b/scripts/gendwarfksyms/dwarf.c
index 5fb9eadd782c..d2c6e91a7653 100644
--- a/scripts/gendwarfksyms/dwarf.c
+++ b/scripts/gendwarfksyms/dwarf.c
@@ -103,6 +103,8 @@ static void process(struct die *cache, const char *s)
if (dump_dies)
fputs(s, stderr);
+ if (cache)
+ die_debug_r("cache %p string '%s'", cache, s);
die_map_add_string(cache, s);
}
@@ -549,6 +551,8 @@ static void process_cached(struct state *state, struct die *cache,
list_for_each_entry(df, &cache->fragments, list) {
switch (df->type) {
case FRAGMENT_STRING:
+ die_debug_b("cache %p STRING '%s'", cache,
+ df->data.str);
process(NULL, df->data.str);
break;
case FRAGMENT_LINEBREAK:
@@ -558,6 +562,8 @@ static void process_cached(struct state *state, struct die *cache,
if (!dwarf_die_addr_die(dwarf_cu_getdwarf(die->cu),
(void *)df->data.addr, &child))
error("dwarf_die_addr_die failed");
+ die_debug_b("cache %p DIE addr %" PRIxPTR " tag %x",
+ cache, df->data.addr, dwarf_tag(&child));
check(process_type(state, NULL, &child));
break;
default:
@@ -648,6 +654,9 @@ static int process_type(struct state *state, struct die *parent, Dwarf_Die *die)
cache = die_map_get(die, want_state);
if (cache->state == want_state) {
+ die_debug_g("cached addr %p tag %x -- %s", die->addr, tag,
+ die_state_name(cache->state));
+
if (want_state == DIE_COMPLETE && is_expanded_type(tag))
cache_mark_expanded(&state->expansion_cache, die->addr);
@@ -658,6 +667,9 @@ static int process_type(struct state *state, struct die *parent, Dwarf_Die *die)
return 0;
}
+ die_debug_g("addr %p tag %x -- %s -> %s", die->addr, tag,
+ die_state_name(cache->state), die_state_name(want_state));
+
switch (tag) {
/* Type modifiers */
PROCESS_TYPE(atomic)
@@ -693,6 +705,9 @@ static int process_type(struct state *state, struct die *parent, Dwarf_Die *die)
error("unexpected type: %x", tag);
}
+ die_debug_r("parent %p cache %p die addr %p tag %x", parent, cache,
+ die->addr, tag);
+
/* Update cache state and append to the parent (if any) */
cache->tag = tag;
cache->state = want_state;
diff --git a/scripts/gendwarfksyms/gendwarfksyms.c b/scripts/gendwarfksyms/gendwarfksyms.c
index 66806b0936e4..83b7eb8226dd 100644
--- a/scripts/gendwarfksyms/gendwarfksyms.c
+++ b/scripts/gendwarfksyms/gendwarfksyms.c
@@ -19,6 +19,8 @@
int debug;
/* Dump DIE contents */
int dump_dies;
+/* Print debugging information about die_map changes */
+int dump_die_map;
static void usage(void)
{
@@ -26,6 +28,7 @@ static void usage(void)
"Options:\n"
" -d, --debug Print debugging information\n"
" --dump-dies Dump DWARF DIE contents\n"
+ " --dump-die-map Print debugging information about die_map changes\n"
" -h, --help Print this message\n"
"\n",
stderr);
@@ -74,6 +77,7 @@ int main(int argc, char **argv)
struct option opts[] = { { "debug", 0, NULL, 'd' },
{ "dump-dies", 0, &dump_dies, 1 },
+ { "dump-die-map", 0, &dump_die_map, 1 },
{ "help", 0, NULL, 'h' },
{ 0, 0, NULL, 0 } };
@@ -93,6 +97,9 @@ int main(int argc, char **argv)
}
}
+ if (dump_die_map)
+ dump_dies = 1;
+
if (optind >= argc) {
usage();
error("no input files?");
diff --git a/scripts/gendwarfksyms/gendwarfksyms.h b/scripts/gendwarfksyms/gendwarfksyms.h
index 16d4746aaef9..c913a2421515 100644
--- a/scripts/gendwarfksyms/gendwarfksyms.h
+++ b/scripts/gendwarfksyms/gendwarfksyms.h
@@ -24,6 +24,7 @@
*/
extern int debug;
extern int dump_dies;
+extern int dump_die_map;
/*
* Output helpers
@@ -46,6 +47,18 @@ extern int dump_dies;
exit(1); \
} while (0)
+#define __die_debug(color, format, ...) \
+ do { \
+ if (dump_dies && dump_die_map) \
+ fprintf(stderr, \
+ "\033[" #color "m<" format ">\033[39m", \
+ __VA_ARGS__); \
+ } while (0)
+
+#define die_debug_r(format, ...) __die_debug(91, format, __VA_ARGS__)
+#define die_debug_g(format, ...) __die_debug(92, format, __VA_ARGS__)
+#define die_debug_b(format, ...) __die_debug(94, format, __VA_ARGS__)
+
/*
* Error handling helpers
*/
--
2.46.0.792.g87dc391469-goog
Powered by blists - more mailing lists