X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fana%2Firtypeinfo.c;h=77b871e906905d5132ef58488225e04ac9c781be;hb=555593b0aebec433b871920acc2b0a869b072055;hp=3a34fba33cf4b1b173beb14b443fa69659818d79;hpb=8dc4091a707bf66377da637d17cb20080847bf1c;p=libfirm diff --git a/ir/ana/irtypeinfo.c b/ir/ana/irtypeinfo.c index 3a34fba33..77b871e90 100644 --- a/ir/ana/irtypeinfo.c +++ b/ir/ana/irtypeinfo.c @@ -1,130 +1,138 @@ -/** +/* + * Copyright (C) 1995-2011 University of Karlsruhe. All right reserved. * - * @file irtypeinfo.c + * This file is part of libFirm. * - * Project: libFIRM - * File name: ir/ana/irtypeinfo.c - * Purpose: Data structure to hold type information for nodes. - * Author: Goetz Lindenmaier - * Modified by: - * Created: 28.8.2003 - * CVS-ID: $Id$ - * Copyright: (c) 2003 Universität Karlsruhe - * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. + * 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. * - * Data structure to hold type information for nodes. + * Licensees holding valid libFirm Professional Edition licenses may use + * this file in accordance with the libFirm Commercial License. + * Agreement provided with the Software. * - * This module defines a field "type" of type "type *" for each ir node. - * It defines a flag for irgraphs to mark whether the type info of the - * graph is valid. Further it defines an auxiliary type "initial_type". + * 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 Data structure to hold type information for nodes. + * @author Goetz Lindenmaier + * @date 28.8.2003 + * @brief + * Data structure to hold type information for nodes. * - * The module defines a map that contains pairs (irnode, type). If an irnode - * is not in the map it is assumed to be initialized, i.e., the initialization - * 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). + * This module defines a field "type" of type "type *" for each ir node. + * It defines a flag for irgraphs to mark whether the type info of the + * graph is valid. Further it defines an auxiliary type "initial_type". * + * The module defines a map that contains pairs (irnode, type). If an irnode + * is not in the map it is assumed to be initialized, i.e., the initialization + * 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 "irprog.h" +#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. --------------------------------------- */ +ir_type *initial_type = NULL; -/* This auxiliary type expresses that a field is uninitialized. The - * variable is set by init_irtypeinfo. The type is freed by - * free_irtypeinfo. - */ -type *initial_type = NULL; +void init_irtypeinfo(void) +{ + size_t i, n; + if (initial_type == NULL) + initial_type = new_type_class(new_id_from_str("initial_type")); -/* ------------ Initializing this module. ----------------------------- */ + /* We need a new, empty map. */ + if (type_node_map != NULL) + pmap_destroy(type_node_map); + type_node_map = pmap_create(); -/* 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; - - if (!initial_type) - 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(); - - for (i = 0; i < get_irp_n_irgs(); ++i) - set_irg_typeinfo_state(get_irp_irg(i), irg_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; +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; + } - for (i = 0; i < get_irp_n_irgs(); ++i) - set_irg_typeinfo_state(get_irp_irg(i), irg_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, irg_typeinfo_state s) { - assert(is_ir_graph(irg)); - irg->typeinfo_state = s; +ir_typeinfo_state get_irg_typeinfo_state(const ir_graph *irg) +{ + assert(is_ir_graph(irg)); + return irg->typeinfo_state; } -irg_typeinfo_state get_irg_typeinfo_state(ir_graph *irg) { - assert(is_ir_graph(irg)); - return irg->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_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 - * irg_typeinfo_consistent or irg_typeinfo_inconsistent. They - * assume current_ir_graph set properly. - */ -type *get_irn_type(ir_node *n) { - type *res = initial_type; - assert(get_irg_typeinfo_state(current_ir_graph) == irg_typeinfo_consistent || - get_irg_typeinfo_state(current_ir_graph) == irg_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); - if (pmap_contains(type_node_map, (void *)n)) - res = (type *) pmap_get(type_node_map, (void *)n); + res = pmap_get(ir_type, type_node_map, n); + if (res == NULL) { + res = initial_type; + } - return res; + return res; } -void set_irn_type(ir_node *n, type *tp) { - assert(get_irg_typeinfo_state(current_ir_graph) == irg_typeinfo_consistent || - get_irg_typeinfo_state(current_ir_graph) == irg_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); }