mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-05 11:01:06 -04:00
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@google.com> Reviewed-by: Petr Pavlu <petr.pavlu@suse.com> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
This commit is contained in:
committed by
Masahiro Yamada
parent
f936c129fd
commit
d2ffdc1c9a
@@ -146,6 +146,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);
|
||||
}
|
||||
|
||||
@@ -594,6 +596,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:
|
||||
@@ -603,6 +607,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:
|
||||
@@ -671,6 +677,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);
|
||||
|
||||
@@ -678,6 +687,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)
|
||||
@@ -713,6 +725,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;
|
||||
|
||||
@@ -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);
|
||||
@@ -75,6 +78,7 @@ int main(int argc, char **argv)
|
||||
static const 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 }
|
||||
};
|
||||
@@ -95,6 +99,9 @@ int main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
if (dump_die_map)
|
||||
dump_dies = 1;
|
||||
|
||||
if (optind >= argc) {
|
||||
usage();
|
||||
error("no input files?");
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
*/
|
||||
extern int debug;
|
||||
extern int dump_dies;
|
||||
extern int dump_die_map;
|
||||
|
||||
/*
|
||||
* Output helpers
|
||||
@@ -43,6 +44,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
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user