From 507c9bcd2509a41adb4d4ab7962d70029498f5de Mon Sep 17 00:00:00 2001 From: Petr Machata Date: Thu, 15 Jan 2009 15:33:26 +0100 Subject: [PATCH] Add location expression formatting function to dwarfstrings.h * and fix a buglet along the way --- src/ChangeLog | 4 ++++ src/dwarfstrings.h | 40 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 9115dd0d2..3bfa90494 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,7 @@ +2009-01-14 Petr Machata + + * dwarfstrings.h (dwarf_locexpr_opcode_string): New. + 2009-01-14 Petr Machata * dwarflint.c: Validation .debug_pubtypes. diff --git a/src/dwarfstrings.h b/src/dwarfstrings.h index f70392ef6..9987b2fd4 100644 --- a/src/dwarfstrings.h +++ b/src/dwarfstrings.h @@ -1,6 +1,8 @@ #ifndef DWARFSTRINGS_H #define DWARFSTRINGS_H 1 +#include "../libdw/known-dwarf.h" + static __attribute__ ((unused)) const char * dwarf_tag_string (unsigned int tag) { @@ -356,8 +358,11 @@ dwarf_form_string (unsigned int form) result = known_forms[form]; if (unlikely (result == NULL)) - snprintf (buf, sizeof buf, gettext ("unknown form %" PRIx64), - (uint64_t) form); + { + snprintf (buf, sizeof buf, gettext ("unknown form %" PRIx64), + (uint64_t) form); + result = buf; + } return result; } @@ -585,4 +590,35 @@ dwarf_discr_list_string (unsigned int code) return "???"; } + +static __attribute__ ((unused)) const char * +dwarf_locexpr_opcode_string (unsigned int code) +{ + static const char *const known[] = + { + /* Normally we can't affort building huge table of 64K entries, + most of them zero, just because there are a couple defined + values at the far end. In case of opcodes, it's OK. */ +#define ONE_KNOWN_DW_OP_DESC(NAME, CODE, DESC) ONE_KNOWN_DW_OP(NAME, CODE) +#define ONE_KNOWN_DW_OP(NAME, CODE) [CODE] = #NAME, + ALL_KNOWN_DW_OP +#undef ONE_KNOWN_DW_OP +#undef ONE_KNOWN_DW_OP_DESC + }; + + const char *ret = NULL; + if (likely (code < sizeof (known) / sizeof (known[0]))) + ret = known[code]; + + if (ret == NULL) + { + static char buf[40]; + snprintf (buf, sizeof buf, gettext ("unknown opcode %" PRIx64), + (uint64_t) code); + ret = buf; + } + + return ret; +} + #endif /* dwarfstrings.h */ -- 2.47.3