2 * This file is part of libFirm.
3 * Copyright (C) 2012 University of Karlsruhe.
8 * @brief Implements the Firm interface to debug information.
9 * @author Goetz Lindenmaier, Michael Beck
14 #include "dbginfo_t.h"
20 merge_pair_func *__dbg_info_merge_pair = default_dbg_info_merge_pair;
21 merge_sets_func *__dbg_info_merge_sets = default_dbg_info_merge_sets;
23 void dbg_init(merge_pair_func *mpf, merge_sets_func *msf)
25 __dbg_info_merge_pair = mpf ? mpf : default_dbg_info_merge_pair;
26 __dbg_info_merge_sets = msf ? msf : default_dbg_info_merge_sets;
30 * Converts a debug_action into a string.
32 const char *dbg_action_2_str(dbg_action a)
34 #define CASE(a) case a: return #a
39 CASE(dbg_opt_auxnode);
42 CASE(dbg_straightening);
43 CASE(dbg_if_simplification);
44 CASE(dbg_algebraic_simplification);
45 CASE(dbg_write_after_write);
46 CASE(dbg_write_after_read);
47 CASE(dbg_read_after_write);
48 CASE(dbg_read_after_read);
49 CASE(dbg_read_a_const);
50 CASE(dbg_rem_poly_call);
52 CASE(dbg_opt_confirm);
55 CASE(dbg_jumpthreading);
59 return "string conversion not implemented";
61 panic("Missing debug action");
66 void default_dbg_info_merge_pair(ir_node *nw, ir_node *old, dbg_action info)
68 dbg_info *new_db = get_irn_dbg_info(nw);
71 set_irn_dbg_info(nw, get_irn_dbg_info(old));
74 void default_dbg_info_merge_sets(ir_node **new_nodes, int n_new_nodes,
75 ir_node **old_nodes, int n_old_nodes,
79 if (n_old_nodes == 1) {
80 dbg_info *old_db = get_irn_dbg_info(old_nodes[0]);
83 for (i = 0; i < n_new_nodes; ++i)
84 if (get_irn_dbg_info(new_nodes[i]) == NULL)
85 set_irn_dbg_info(new_nodes[i], old_db);
89 static src_loc_t default_retrieve_dbg(dbg_info const *const dbg)
92 src_loc_t const loc = { NULL, 0, 0 };
96 /** The debug info retriever function. */
97 static retrieve_dbg_func retrieve_dbg = default_retrieve_dbg;
98 static retrieve_type_dbg_func retrieve_type_dbg = NULL;
100 void ir_set_debug_retrieve(retrieve_dbg_func func)
102 retrieve_dbg = func ? func : default_retrieve_dbg;
105 src_loc_t ir_retrieve_dbg_info(dbg_info const *const dbg)
107 return retrieve_dbg(dbg);
110 void ir_set_type_debug_retrieve(retrieve_type_dbg_func func)
112 retrieve_type_dbg = func;
115 void ir_retrieve_type_dbg_info(char *buffer, size_t buffer_size,
116 const type_dbg_info *tdbgi)
119 if (retrieve_type_dbg)
120 retrieve_type_dbg(buffer, buffer_size, tdbgi);
121 assert(buffer_size > 0);
122 buffer[buffer_size-1] = '\0';
125 void ir_dbg_info_snprint(char *buf, size_t bufsize, const dbg_info *dbg)
127 src_loc_t const loc = ir_retrieve_dbg_info(dbg);
134 if (loc.column == 0) {
135 snprintf(buf, bufsize, "%s:%u", loc.file, loc.line);
137 snprintf(buf, bufsize, "%s:%u:%u", loc.file, loc.line, loc.column);