X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fdebug%2Fdbginfo.c;h=28a285385ee3d603e42d89a73c3f513bceb011b1;hb=199ea1a4479a4d8dcbebfde81820286935e64b0c;hp=53233aad8bdc832fd5d95e0d97eb730aefff059b;hpb=de3ad6fcd245b88094f28f89284f2d62d4d50d3c;p=libfirm diff --git a/ir/debug/dbginfo.c b/ir/debug/dbginfo.c index 53233aad8..28a285385 100644 --- a/ir/debug/dbginfo.c +++ b/ir/debug/dbginfo.c @@ -1,83 +1,153 @@ /* -* Copyright (C) 2001 by Universitaet Karlsruhe -* All rights reserved. -* -* Authors: Goetz Lindenmaier -* -* dbginfo: This is a empty implementation of the Firm interface to -* debugging support. It only guarantees that the Firm library compiles -* and runs without any real debugging support. -* The functions herein are declared weak so that they can be overriden -* by a real implementation. -*/ - -/* $Id$ */ - -#ifdef HAVE_CONFIG_H -# include -#endif + * 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. + */ + +/** + * @file + * @brief Implements the Firm interface to debug information. + * @author Goetz Lindenmaier, Michael Beck + * @date 2001 + */ +#include "config.h" #include "dbginfo_t.h" #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; -INLINE void -dbg_info_merge_pair(ir_node *nw, ir_node *old, dbg_action info) { - set_irn_dbg_info(nw, get_irn_dbg_info(old)); +void dbg_init(merge_pair_func *mpf, merge_sets_func *msf) +{ + __dbg_info_merge_pair = mpf ? mpf : default_dbg_info_merge_pair; + __dbg_info_merge_sets = msf ? msf : default_dbg_info_merge_sets; } -INLINE void -dbg_info_merge_sets(ir_node **new_nodes, int n_new_nodes, - ir_node **old_nodes, int n_old_nodes, - dbg_action info) { +/* + * Converts a debug_action into a string. + */ +const char *dbg_action_2_str(dbg_action a) +{ +#define CASE(a) case a: return #a + + switch (a) { + CASE(dbg_error); + CASE(dbg_opt_ssa); + CASE(dbg_opt_auxnode); + CASE(dbg_const_eval); + CASE(dbg_opt_cse); + CASE(dbg_straightening); + CASE(dbg_if_simplification); + CASE(dbg_algebraic_simplification); + CASE(dbg_write_after_write); + CASE(dbg_write_after_read); + CASE(dbg_read_after_write); + CASE(dbg_read_after_read); + CASE(dbg_read_a_const); + CASE(dbg_rem_poly_call); + CASE(dbg_dead_code); + CASE(dbg_opt_confirm); + CASE(dbg_gvn_pre); + CASE(dbg_combo); + CASE(dbg_jumpthreading); + CASE(dbg_backend); + default: + if (a <= dbg_max) + return "string conversion not implemented"; + else + panic("Missing debug action"); + } +#undef CASE } +void default_dbg_info_merge_pair(ir_node *nw, ir_node *old, dbg_action info) +{ + dbg_info *new_db = get_irn_dbg_info(nw); + (void) info; + if (new_db == NULL) + set_irn_dbg_info(nw, get_irn_dbg_info(old)); +} -void (*__dbg_info_merge_pair)(ir_node *nw, ir_node *old, dbg_action info) - = &dbg_info_merge_pair; - -void (*__dbg_info_merge_sets)(ir_node **new_nodes, int n_new_nodes, - ir_node **old_nodes, int n_old_nodes, - dbg_action info) - = &dbg_info_merge_sets; - +void default_dbg_info_merge_sets(ir_node **new_nodes, int n_new_nodes, + ir_node **old_nodes, int n_old_nodes, + dbg_action info) +{ + (void) info; + if (n_old_nodes == 1) { + dbg_info *old_db = get_irn_dbg_info(old_nodes[0]); + int i; + + for (i = 0; i < n_new_nodes; ++i) + if (get_irn_dbg_info(new_nodes[i]) == NULL) + set_irn_dbg_info(new_nodes[i], old_db); + } +} -void dbg_init( void (merge_pair)(ir_node *nw, ir_node *old, dbg_action info) , - void (merge_sets)(ir_node **new_nodes, int n_new_nodes, - ir_node **old_nodes, int n_old_nodes, - dbg_action info) - ) { - __dbg_info_merge_pair = merge_pair; - __dbg_info_merge_sets = merge_sets; +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 = default_retrieve_dbg; +static retrieve_type_dbg_func retrieve_type_dbg = NULL; -INLINE void -set_irn_dbg_info(ir_node *n, struct dbg_info* db) { - n->dbi = db; +void ir_set_debug_retrieve(retrieve_dbg_func func) +{ + retrieve_dbg = func ? func : default_retrieve_dbg; } -INLINE struct dbg_info * -get_irn_dbg_info(ir_node *n) { - return n->dbi; +src_loc_t ir_retrieve_dbg_info(dbg_info const *const dbg) +{ + return retrieve_dbg(dbg); } - -/* Routines to access the field of an entity containing the - debugging information. */ -INLINE void set_entity_dbg_info(entity *ent, dbg_info* db) { - ent->dbi = db; -} -INLINE dbg_info *get_entity_dbg_info(entity *ent) { - return ent->dbi; +void ir_set_type_debug_retrieve(retrieve_type_dbg_func func) +{ + retrieve_type_dbg = func; } -/* Routines to access the field of a type containing the - debugging information. */ -INLINE void set_type_dbg_info(type *tp, dbg_info* db) { - tp->dbi = db; + +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'; } -INLINE dbg_info *get_type_dbg_info(type *tp) { - return tp->dbi; + +void ir_dbg_info_snprint(char *buf, size_t bufsize, const dbg_info *dbg) +{ + src_loc_t const loc = ir_retrieve_dbg_info(dbg); + + if (!loc.file) { + assert(bufsize > 0); + buf[0] = 0; + return; + } + 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); + } }