beifg: Simplify the quite complicated way to divide a number by 2 in be_ifg_stat().
[libfirm] / ir / debug / dbginfo.c
index 08591d1..afbdebd 100644 (file)
@@ -1,20 +1,6 @@
 /*
- * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
- *
  * This file is part of libFirm.
- *
- * This file may be distributed and/or modified under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation and appearing in the file LICENSE.GPL included in the
- * packaging of this file.
- *
- * Licensees holding valid libFirm Professional Edition licenses may use
- * this file in accordance with the libFirm Commercial License.
- * Agreement provided with the Software.
- *
- * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
- * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE.
+ * Copyright (C) 2012 University of Karlsruhe.
  */
 
 /**
@@ -22,7 +8,6 @@
  * @brief    Implements the Firm interface to debug information.
  * @author   Goetz Lindenmaier, Michael Beck
  * @date     2001
- * @version  $Id$
  */
 #include "config.h"
 
@@ -30,6 +15,7 @@
 #include "irnode_t.h"
 #include "type_t.h"
 #include "entity_t.h"
+#include "error.h"
 
 merge_pair_func *__dbg_info_merge_pair = default_dbg_info_merge_pair;
 merge_sets_func *__dbg_info_merge_sets = default_dbg_info_merge_sets;
@@ -72,8 +58,7 @@ const char *dbg_action_2_str(dbg_action a)
                if (a <= dbg_max)
                        return "string conversion not implemented";
                else
-                       assert(!"Missing debug action in dbg_action_2_str()");
-               return NULL;
+                       panic("Missing debug action");
        }
 #undef CASE
 }
@@ -101,22 +86,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 +115,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[0] = 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);
+       }
 }