added %g for writing debug info with ir_printf
authorMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Thu, 14 Jul 2005 16:28:47 +0000 (16:28 +0000)
committerMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Thu, 14 Jul 2005 16:28:47 +0000 (16:28 +0000)
[r6231]

ir/ir/irargs.c
ir/ir/irprintf.c
ir/ir/irprintf.h

index 978f984..c16a9a2 100644 (file)
@@ -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;
index cb20f58..5440da3 100644 (file)
@@ -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);
        }
index f31833f..7fe8081 100644 (file)
@@ -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, ...);