X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fdebug%2Fdbginfo.c;h=0aa2642c801b668a2e8947172337bd84a68a4b5b;hb=5af0c3e521bf6375f0249b661605f9f5570c6e4e;hp=4f124340e6c56f86c2fa88c6b145603758c5a868;hpb=a096e63d97586ab1d31aab2bd293c691dfd4bd28;p=libfirm diff --git a/ir/debug/dbginfo.c b/ir/debug/dbginfo.c index 4f124340e..0aa2642c8 100644 --- a/ir/debug/dbginfo.c +++ b/ir/debug/dbginfo.c @@ -1,20 +1,17 @@ /* -** 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$ */ + * Project: libFIRM + * File name: ir/debug/dbginfo.c + * Purpose: Implements the Firm interface to debug information. + * Author: Goetz Lindenmaier + * Modified by: Michael Beck + * Created: 2001 + * CVS-ID: $Id$ + * Copyright: (c) 2001-2006 Universität Karlsruhe + * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. + */ #ifdef HAVE_CONFIG_H -# include +# include "config.h" #endif #include "dbginfo_t.h" @@ -22,62 +19,99 @@ #include "type_t.h" #include "entity_t.h" +merge_pair_func *__dbg_info_merge_pair = default_dbg_info_merge_pair; -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)); -} +merge_sets_func *__dbg_info_merge_sets = 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) { -} +snprint_dbg_func *__dbg_info_snprint = (snprint_dbg_func *)0; +void dbg_init( merge_pair_func *mpf, merge_sets_func *msf, snprint_dbg_func *snprint_dbg ) +{ + __dbg_info_merge_pair = mpf ? mpf : default_dbg_info_merge_pair; + __dbg_info_merge_sets = msf ? msf : default_dbg_info_merge_sets; + __dbg_info_snprint = snprint_dbg; +} /* dbg_init */ -static void (*__dbg_info_merge_pair)(ir_node *nw, ir_node *old, dbg_action info) - = &dbg_info_merge_pair; -static 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 set_irn_dbg_info(ir_node *n, dbg_info *db) { + n->dbi = db; +} /* set_irn_dbg_info */ - -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; -} - - -INLINE void -set_irn_dbg_info(ir_node *n, struct dbg_info* db) { - n->dbi = db; -} - -INLINE struct dbg_info * -get_irn_dbg_info(ir_node *n) { - return n->dbi; -} +struct dbg_info *get_irn_dbg_info(const ir_node *n) { + return n->dbi; +} /* get_irn_dbg_info */ /* 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 set_entity_dbg_info(ir_entity *ent, dbg_info *db) { + ent->dbi = db; +} /* set_entity_dbg_info */ + +dbg_info *get_entity_dbg_info(const ir_entity *ent) { + return ent->dbi; +} /* get_entity_dbg_info */ + /* 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; -} -INLINE dbg_info *get_type_dbg_info(type *tp) { - return tp->dbi; -} +void set_type_dbg_info(ir_type *tp, dbg_info *db) { + tp->dbi = db; +} /* set_type_dbg_info */ + +dbg_info *get_type_dbg_info(const ir_type *tp) { + return tp->dbi; +} /* get_type_dbg_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_backend); + default: + if (a <= dbg_max) + return "string conversion not implemented"; + else + assert(!"Missing debug action in dbg_action_2_str()"); + return NULL; + } +#undef CASE +} /* dbg_action_2_str */ + + +void default_dbg_info_merge_pair(ir_node *nw, ir_node *old, dbg_action info) { + dbg_info *new_db = get_irn_dbg_info(nw); + if (new_db == NULL) + set_irn_dbg_info(nw, get_irn_dbg_info(old)); +} /* default_dbg_info_merge_pair */ + +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) { + 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); + } +} /* default_dbg_info_merge_sets */