[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20241121204220.2378181-30-samitolvanen@google.com>
Date: Thu, 21 Nov 2024 20:42:31 +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>,
Gary Guo <gary@...yguo.net>, Petr Pavlu <petr.pavlu@...e.com>,
Daniel Gomez <da.gomez@...sung.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>,
Sedat Dilek <sedat.dilek@...il.com>, 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 v6 10/18] 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>
Reviewed-by: Petr Pavlu <petr.pavlu@...e.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 3ea7583e6c3f..cf6d2c2844dc 100644
--- a/scripts/gendwarfksyms/dwarf.c
+++ b/scripts/gendwarfksyms/dwarf.c
@@ -145,6 +145,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);
}
@@ -593,6 +595,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:
@@ -602,6 +606,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:
@@ -670,6 +676,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));
+
process_cached(state, cache, die);
die_map_add_die(parent, cache);
@@ -677,6 +686,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)
@@ -712,6 +724,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 7552fde495ef..ed6d8c585268 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 7b29d8f07aa0..10fb476a7b76 100644
--- a/scripts/gendwarfksyms/gendwarfksyms.h
+++ b/scripts/gendwarfksyms/gendwarfksyms.h
@@ -26,6 +26,7 @@
*/
extern int debug;
extern int dump_dies;
+extern int dump_die_map;
/*
* Output helpers
@@ -48,6 +49,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.47.0.371.ga323438b13-goog
Powered by blists - more mailing lists