X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fana%2Firtypeinfo.c;h=77b871e906905d5132ef58488225e04ac9c781be;hb=532ca14c1686c1b14cf923371c079055670de7e6;hp=9bb507a6fbf3b4e324052204c5191ba1107b73ce;hpb=1ce363f80e6a204d4011f85813362d9bd1d0e7e4;p=libfirm diff --git a/ir/ana/irtypeinfo.c b/ir/ana/irtypeinfo.c index 9bb507a6f..77b871e90 100644 --- a/ir/ana/irtypeinfo.c +++ b/ir/ana/irtypeinfo.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2011 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -22,8 +22,7 @@ * @brief Data structure to hold type information for nodes. * @author Goetz Lindenmaier * @date 28.8.2003 - * @version $Id$ - * @summary + * @brief * Data structure to hold type information for nodes. * * This module defines a field "type" of type "type *" for each ir node. @@ -35,134 +34,105 @@ * requires no compute time. As firm nodes can not be freed and reallocated * pointers for nodes are unique (until a call of dead_node_elimination). */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif #include "irtypeinfo.h" #include -#include "irgraph_t.h" /* for setting the state flag. */ +#include "irgraph_t.h" #include "irprog_t.h" #include "irnode_t.h" #include "pmap.h" -/* ------------ The map. ---------------------------------------------- */ - - static pmap *type_node_map = NULL; -/* ------------ Auxiliary type. --------------------------------------- */ - -/* This auxiliary type expresses that a field is uninitialized. The - * variable is set by init_irtypeinfo. The type is freed by - * free_irtypeinfo. - */ ir_type *initial_type = NULL; -/* ------------ Initializing this module. ----------------------------- */ - -/* Initializes the type information module. - * Generates a type "initial_type" and sets the type of all nodes to this type. - * Calling set/get_irn_type is invalid before calling init. Requires memory - * in the order of MIN(, #irnodes). - */ -void init_irtypeinfo(void) { - int i, n; +void init_irtypeinfo(void) +{ + size_t i, n; - if (!initial_type) - initial_type = new_type_class(new_id_from_str("initial_type")); + if (initial_type == NULL) + initial_type = new_type_class(new_id_from_str("initial_type")); - /* We need a new, empty map. */ - if (type_node_map) pmap_destroy(type_node_map); - type_node_map = pmap_create(); + /* We need a new, empty map. */ + if (type_node_map != NULL) + pmap_destroy(type_node_map); + type_node_map = pmap_create(); - n = get_irp_n_irgs(); - for (i = 0; i < n; ++i) - set_irg_typeinfo_state(get_irp_irg(i), ir_typeinfo_none); + for (i = 0, n = get_irp_n_irgs(); i < n; ++i) + set_irg_typeinfo_state(get_irp_irg(i), ir_typeinfo_none); } -void free_irtypeinfo(void) { - int i, n; +void free_irtypeinfo(void) +{ + size_t i, n; - if (initial_type) { - free_type(initial_type); - initial_type = NULL; - } - //else assert(0 && "call init_type_info before freeing"); + if (initial_type != NULL) { + free_type(initial_type); + initial_type = NULL; + } - if (type_node_map) { - pmap_destroy(type_node_map); - type_node_map = NULL; - } - //else assert(0 && "call init_type_info before freeing"); + if (type_node_map != NULL) { + pmap_destroy(type_node_map); + type_node_map = NULL; + } - n = get_irp_n_irgs(); - for (i = 0; i < n; ++i) - set_irg_typeinfo_state(get_irp_irg(i), ir_typeinfo_none); + for (i = 0, n = get_irp_n_irgs(); i < n; ++i) + set_irg_typeinfo_state(get_irp_irg(i), ir_typeinfo_none); } -/* ------------ Irgraph state handling. ------------------------------- */ - -void set_irg_typeinfo_state(ir_graph *irg, ir_typeinfo_state s) { - assert(is_ir_graph(irg)); - irg->typeinfo_state = s; - if ((irg->typeinfo_state == ir_typeinfo_consistent) && - (irp->typeinfo_state == ir_typeinfo_consistent) && - (s != ir_typeinfo_consistent) ) - irp->typeinfo_state = ir_typeinfo_inconsistent; +void set_irg_typeinfo_state(ir_graph *irg, ir_typeinfo_state s) +{ + assert(is_ir_graph(irg)); + irg->typeinfo_state = s; + if ((irg->typeinfo_state == ir_typeinfo_consistent) && + (irp->typeinfo_state == ir_typeinfo_consistent) && + (s != ir_typeinfo_consistent) ) + irp->typeinfo_state = ir_typeinfo_inconsistent; } -ir_typeinfo_state get_irg_typeinfo_state(ir_graph *irg) { - assert(is_ir_graph(irg)); - return irg->typeinfo_state; +ir_typeinfo_state get_irg_typeinfo_state(const ir_graph *irg) +{ + assert(is_ir_graph(irg)); + return irg->typeinfo_state; } -/* Returns accumulated type information state information. - * - * Returns ir_typeinfo_consistent if the type information of all irgs is - * consistent. Returns ir_typeinfo_inconsistent if at least one irg has inconsistent - * or no type information. Returns ir_typeinfo_none if no irg contains type information. - */ -ir_typeinfo_state get_irp_typeinfo_state(void) { - return irp->typeinfo_state; +ir_typeinfo_state get_irp_typeinfo_state(void) +{ + return irp->typeinfo_state; } -void set_irp_typeinfo_state(ir_typeinfo_state s) { - irp->typeinfo_state = s; +void set_irp_typeinfo_state(ir_typeinfo_state s) +{ + irp->typeinfo_state = s; } -/* If typeinfo is consistent, sets it to inconsistent. */ -void set_irp_typeinfo_inconsistent(void) { - if (irp->typeinfo_state == ir_typeinfo_consistent) - irp->typeinfo_state = ir_typeinfo_inconsistent; +void set_irp_typeinfo_inconsistent(void) +{ + if (irp->typeinfo_state == ir_typeinfo_consistent) + irp->typeinfo_state = ir_typeinfo_inconsistent; } -/* ------------ Irnode type information. ------------------------------ */ - -/* These routines only work properly if the ir_graph is in state - * ir_typeinfo_consistent or ir_typeinfo_inconsistent. They - * assume current_ir_graph set properly. - */ -ir_type *get_irn_typeinfo_type(ir_node *n) { - ir_type *res = initial_type; - pmap_entry *entry; - assert(get_irg_typeinfo_state(get_irn_irg(n)) == ir_typeinfo_consistent || - get_irg_typeinfo_state(get_irn_irg(n)) == ir_typeinfo_inconsistent ); +ir_type *get_irn_typeinfo_type(const ir_node *n) +{ + ir_type *res; + assert(get_irg_typeinfo_state(get_irn_irg(n)) != ir_typeinfo_none); - entry = pmap_find(type_node_map, n); - if (entry) - res = entry->value; + res = pmap_get(ir_type, type_node_map, n); + if (res == NULL) { + res = initial_type; + } - return res; + return res; } -void set_irn_typeinfo_type(ir_node *n, ir_type *tp) { - assert(get_irg_typeinfo_state(current_ir_graph) == ir_typeinfo_consistent || - get_irg_typeinfo_state(current_ir_graph) == ir_typeinfo_inconsistent ); +void set_irn_typeinfo_type(ir_node *n, ir_type *tp) +{ + assert(get_irg_typeinfo_state(get_irn_irg(n)) != ir_typeinfo_none); - pmap_insert(type_node_map, (void *)n, (void *)tp); + pmap_insert(type_node_map, (void *)n, (void *)tp); }