bearch: Dump the output requirement and the assigned register in the same line for...
[libfirm] / ir / debug / dbginfo.c
index b688337..28a2853 100644 (file)
@@ -22,7 +22,6 @@
  * @brief    Implements the Firm interface to debug information.
  * @author   Goetz Lindenmaier, Michael Beck
  * @date     2001
- * @version  $Id$
  */
 #include "config.h"
 
@@ -73,7 +72,7 @@ const char *dbg_action_2_str(dbg_action a)
                if (a <= dbg_max)
                        return "string conversion not implemented";
                else
-                       panic("Missing debug action in dbg_action_2_str()");
+                       panic("Missing debug action");
        }
 #undef CASE
 }
@@ -101,22 +100,25 @@ void default_dbg_info_merge_sets(ir_node **new_nodes, int n_new_nodes,
        }
 }
 
+static src_loc_t default_retrieve_dbg(dbg_info const *const dbg)
+{
+       (void)dbg;
+       src_loc_t const loc = { NULL, 0, 0 };
+       return loc;
+}
+
 /** The debug info retriever function. */
-static retrieve_dbg_func      retrieve_dbg      = NULL;
+static retrieve_dbg_func      retrieve_dbg      = default_retrieve_dbg;
 static retrieve_type_dbg_func retrieve_type_dbg = NULL;
 
 void ir_set_debug_retrieve(retrieve_dbg_func func)
 {
-       retrieve_dbg = func;
+       retrieve_dbg = func ? func : default_retrieve_dbg;
 }
 
-const char *ir_retrieve_dbg_info(const dbg_info *dbg, unsigned *line)
+src_loc_t ir_retrieve_dbg_info(dbg_info const *const dbg)
 {
-       if (retrieve_dbg)
-               return retrieve_dbg(dbg, line);
-
-       *line = 0;
-       return NULL;
+       return retrieve_dbg(dbg);
 }
 
 void ir_set_type_debug_retrieve(retrieve_type_dbg_func func)
@@ -127,21 +129,25 @@ void ir_set_type_debug_retrieve(retrieve_type_dbg_func func)
 void ir_retrieve_type_dbg_info(char *buffer, size_t buffer_size,
                                const type_dbg_info *tdbgi)
 {
+       buffer[0] = '\0';
        if (retrieve_type_dbg)
                retrieve_type_dbg(buffer, buffer_size, tdbgi);
        assert(buffer_size > 0);
-       buffer[buffer_size-1] = 0;
+       buffer[buffer_size-1] = '\0';
 }
 
 void ir_dbg_info_snprint(char *buf, size_t bufsize, const dbg_info *dbg)
 {
-       unsigned    line;
-       const char *source = ir_retrieve_dbg_info(dbg, &line);
+       src_loc_t const loc = ir_retrieve_dbg_info(dbg);
 
-       if (source == NULL) {
+       if (!loc.file) {
                assert(bufsize > 0);
                buf[0] = 0;
                return;
        }
-       snprintf(buf, bufsize, "%s:%u", source, line);
+       if (loc.column == 0) {
+               snprintf(buf, bufsize, "%s:%u", loc.file, loc.line);
+       } else {
+               snprintf(buf, bufsize, "%s:%u:%u", loc.file, loc.line, loc.column);
+       }
 }