FIRM_API void dbg_init(merge_pair_func *dbg_info_merge_pair,
merge_sets_func *dbg_info_merge_sets);
+typedef struct src_loc_t {
+ char const *file;
+ unsigned line;
+ unsigned column;
+} src_loc_t;
+
/**
* The type of the debug info retriever function.
- * When given a dbg_info returns the name (usually the filename) of the
- * compilation unit defining it. @p line is set to the line number of the
- * definition.
+ * When given a dbg_info returns the name (usually the filename), line number
+ * and column number of the definition.
+ * Any part of the returned information may be NULL/0, which means it is not
+ * available.
*/
-typedef const char *(*retrieve_dbg_func)(const dbg_info *dbg, unsigned *line);
+typedef src_loc_t (*retrieve_dbg_func)(dbg_info const *dbg);
/**
* Sets a debug info retriever.
/**
* Retrieve the debug info.
*/
-FIRM_API const char *ir_retrieve_dbg_info(const dbg_info *dbg, unsigned *line);
+FIRM_API src_loc_t ir_retrieve_dbg_info(dbg_info const *dbg);
/**
* Retrieve type debug info
static void dwarf_set_dbg_info(dbg_handle *h, dbg_info *dbgi)
{
- dwarf_t *env = (dwarf_t*) h;
- const char *filename;
- unsigned lineno;
- unsigned column = 0;
- unsigned filenum;
+ dwarf_t *const env = (dwarf_t*)h;
+ src_loc_t const loc = ir_retrieve_dbg_info(dbgi);
+ unsigned filenum;
- if (dbgi == NULL)
+ if (!loc.file)
return;
- filename = ir_retrieve_dbg_info(dbgi, &lineno);
- if (filename == NULL)
- return;
- filenum = insert_file(env, filename);
-
- be_emit_irprintf("\t.loc %u %u %u\n", filenum, lineno, column);
+ filenum = insert_file(env, loc.file);
+ be_emit_irprintf("\t.loc %u %u %u\n", filenum, loc.line, loc.column);
be_emit_write_line();
}
*/
static void emit_dbginfo(dwarf_t *env, const dbg_info *dbgi)
{
- const char *filename;
- unsigned line;
- unsigned file;
-
- if (dbgi == NULL) {
- emit_uleb128(0);
- emit_uleb128(0);
- return;
- }
- filename = ir_retrieve_dbg_info(dbgi, &line);
- if (filename == NULL) {
- emit_uleb128(0);
- emit_uleb128(0);
- return;
- }
-
- file = insert_file(env, filename);
+ src_loc_t const loc = ir_retrieve_dbg_info(dbgi);
+ unsigned const file = loc.file ? insert_file(env, loc.file) : 0;
emit_uleb128(file);
- emit_uleb128(line);
+ emit_uleb128(loc.line);
}
static void emit_subprogram_abbrev(void)
void be_emit_finish_line_gas(const ir_node *node)
{
dbg_info *dbg;
- const char *sourcefile;
- unsigned lineno;
+ src_loc_t loc;
if (node == NULL) {
be_emit_char('\n');
be_emit_cstring("/* ");
be_emit_irprintf("%+F ", node);
- dbg = get_irn_dbg_info(node);
- sourcefile = ir_retrieve_dbg_info(dbg, &lineno);
- if (sourcefile != NULL) {
- be_emit_string(sourcefile);
- be_emit_irprintf(":%u", lineno);
+ dbg = get_irn_dbg_info(node);
+ loc = ir_retrieve_dbg_info(dbg);
+ if (loc.file) {
+ be_emit_string(loc.file);
+ if (loc.line != 0) {
+ be_emit_irprintf(":%u", loc.line);
+ if (loc.column != 0) {
+ be_emit_irprintf(":%u", loc.column);
+ }
+ }
}
be_emit_cstring(" */\n");
be_emit_write_line();
static void stabs_set_dbg_info(dbg_handle *h, dbg_info *dbgi)
{
- stabs_handle *handle = (stabs_handle*) h;
- unsigned lineno;
- const char *fname = ir_retrieve_dbg_info(dbgi, &lineno);
+ stabs_handle *const handle = (stabs_handle*) h;
+ src_loc_t const loc = ir_retrieve_dbg_info(dbgi);
- if (fname == NULL)
+ if (!loc.file)
return;
- if (handle->curr_file != fname) {
- if (fname != handle->main_file) {
- be_emit_irprintf("\t.stabs\t\"%s\",%d,0,0,0\n", fname, N_SOL);
+ if (handle->curr_file != loc.file) {
+ if (handle->main_file != loc.file) {
+ be_emit_irprintf("\t.stabs\t\"%s\",%d,0,0,0\n", loc.file, N_SOL);
be_emit_write_line();
}
- handle->curr_file = fname;
+ handle->curr_file = loc.file;
}
- if (handle->last_line != lineno) {
+ if (handle->last_line != loc.line) {
char label[64];
snprintf(label, sizeof(label), ".LM%u", ++handle->label_num);
- handle->last_line = lineno;
+ handle->last_line = loc.line;
- be_emit_irprintf("\t.stabn\t%d, 0, %u, %s-%s\n", N_SLINE, lineno,
- label, get_entity_ld_name(handle->cur_ent));
+ be_emit_irprintf("\t.stabn\t%d, 0, %u, %s-%s\n", N_SLINE, loc.line, label, get_entity_ld_name(handle->cur_ent));
be_emit_write_line();
be_emit_string(label);
}
}
+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)
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);
+ }
}