#include "entity_t.h"
#include "irloop_t.h"
#include "tv_t.h"
+#include "dbginfo_t.h"
/**
* identify a firm object type
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
*/
firm_kind *obj = X;
int i, n;
ir_node *block;
- char add[64];
+ char add[64];
char buf[256];
char tv[256];
*/
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);
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;
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;
#include "pset.h"
#include "iterator.h"
#include "bitset.h"
+#include "dbginfo_t.h"
#define STRNIL "(nil)"
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));
}
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);
}
/**
* 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.
* - @%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
*
* 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, ...);