From: Michael Beck Date: Thu, 14 Jul 2005 16:28:47 +0000 (+0000) Subject: added %g for writing debug info with ir_printf X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=9a2601dd7ccb1996780fbe36d2b68134b998b9c5;p=libfirm added %g for writing debug info with ir_printf [r6231] --- diff --git a/ir/ir/irargs.c b/ir/ir/irargs.c index 978f9844e..c16a9a27b 100644 --- a/ir/ir/irargs.c +++ b/ir/ir/irargs.c @@ -24,6 +24,7 @@ #include "entity_t.h" #include "irloop_t.h" #include "tv_t.h" +#include "dbginfo_t.h" /** * identify a firm object type @@ -64,6 +65,23 @@ static int bitset_emit(appendable_t *app, const arg_occ_t *occ, const arg_value_ return res; } +/** + * emit an opaque Firm dbg_info object + */ +static int firm_emit_dbg(appendable_t *app, const arg_occ_t *occ, const arg_value_t *arg) +{ + char buf[1024]; + ir_node *irn = arg->v_ptr; + dbg_info *dbg = get_irn_dbg_info(irn); + + buf[0] = '\0'; + if (dbg && __dbg_info_snprint) { + if (__dbg_info_snprint(buf, sizeof(buf), dbg) <= 0) + buf[0] = '\0'; + } + return arg_append(app, occ, buf, strlen(buf)); +} + /** * emit a Firm object */ @@ -75,7 +93,7 @@ static int firm_emit(appendable_t *app, const arg_occ_t *occ, const arg_value_t firm_kind *obj = X; int i, n; ir_node *block; - char add[64]; + char add[64]; char buf[256]; char tv[256]; @@ -195,7 +213,6 @@ static int firm_emit_indent(appendable_t *app, const arg_occ_t *occ, const arg_v */ static int firm_emit_pnc(appendable_t *app, const arg_occ_t *occ, const arg_value_t *arg) { - int i; int value = arg->v_int; const char *p = get_pnc_string(value); @@ -213,6 +230,7 @@ arg_env_t *firm_get_arg_env(void) static arg_handler_t indent_handler = { firm_get_arg_type_int, firm_emit_indent }; static arg_handler_t pnc_handler = { firm_get_arg_type_int, firm_emit_pnc }; static arg_handler_t bitset_handler = { bitset_get_arg_type, bitset_emit }; + static arg_handler_t debug_handler = { firm_get_arg_type, firm_emit_dbg }; static struct { const char *name; @@ -236,13 +254,15 @@ arg_env_t *firm_get_arg_env(void) env = arg_new_env(); arg_add_std(env); - arg_register(env, "firm", 'F', &firm_handler); + arg_register(env, "firm", 'F', &firm_handler); for (i = 0; i < sizeof(args)/sizeof(args[0]); ++i) arg_register(env, args[i].name, args[i].letter, &firm_handler); arg_register(env, "firm:ident", 'I', &ident_handler); - arg_register(env, "firm:indent", 'D', &indent_handler); - /* arg_register(env, "firm:bitset", 'b', &bitset_handler); */ + arg_register(env, "firm:indent", 'D', &indent_handler); + arg_register(env, "firm:pnc", '=', &pnc_handler); + arg_register(env, "firm:dbg_info", 'g', &debug_handler); + /* arg_register(env, "firm:bitset", 'b', &bitset_handler); */ } return env; diff --git a/ir/ir/irprintf.c b/ir/ir/irprintf.c index cb20f5818..5440da30e 100644 --- a/ir/ir/irprintf.c +++ b/ir/ir/irprintf.c @@ -46,6 +46,7 @@ #include "pset.h" #include "iterator.h" #include "bitset.h" +#include "dbginfo_t.h" #define STRNIL "(nil)" @@ -449,16 +450,17 @@ static void ir_common_vprintf(const appender_t *app, void *object, case 'n': { ir_node *irn = va_arg(args, ir_node *); - if (irn) + if (irn) { if (is_Const(irn)) { char tbuf[128]; tarval_snprintf(tbuf, sizeof(tbuf), get_Const_tarval(irn)); snprintf(buf, sizeof(buf), "%s%s<%s>:%ld", get_irn_opname(irn), get_mode_name(get_irn_mode(irn)), tbuf, get_irn_node_nr(irn)); - } - else + } + else snprintf(buf, sizeof(buf), "%s%s:%ld", get_irn_opname(irn), get_mode_name(get_irn_mode(irn)), get_irn_node_nr(irn)); + } else strncpy(buf, STRNIL, sizeof(buf)); } @@ -535,11 +537,21 @@ static void ir_common_vprintf(const appender_t *app, void *object, case '=': str = get_pnc_string(va_arg(args, int)); break; + case 'g': + { + ir_node *irn = va_arg(args, ir_node *); + dbg_info *dbg = get_irn_dbg_info(irn); + buf[0] = '\0'; + if (dbg && __dbg_info_snprint) { + if (__dbg_info_snprint(buf, sizeof(buf), dbg) <= 0) + buf[0] = '\0'; + } + break; + } } dump_with_settings(app, object, limit, &settings, str); } - else DUMP_CH(ch); } diff --git a/ir/ir/irprintf.h b/ir/ir/irprintf.h index f31833f6b..7fe8081db 100644 --- a/ir/ir/irprintf.h +++ b/ir/ir/irprintf.h @@ -50,6 +50,9 @@ typedef void (ir_printf_cb_t)(const appender_t *app, void *object, size_t limit, /** * A string formatting routine for ir objects. + * + * @param fmt The format string. + * * This function rudimentary implements a kind of printf(3) for ir * nodes. Following conversion specifiers. No length, special or field * width specifiers are accepted. @@ -73,6 +76,7 @@ typedef void (ir_printf_cb_t)(const appender_t *app, void *object, size_t limit, * - @%B The block node number of the nodes block. * - @%b A bitset. * - @%= A pnc value + * - @%g A debug info (if available) * * Each of these can be prepend by a '+' which means, that the given * pointer is a collection of items specified by the format. In this @@ -105,8 +109,6 @@ typedef void (ir_printf_cb_t)(const appender_t *app, void *object, size_t limit, * * ir_printf("A set of xyz\'s: %*C\n", it_pset, xyzs, xyz_dump); * @endcode - * - * @param fmt The format string. */ void ir_printf(const char *fmt, ...);