X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fana%2Firtypeinfo.c;h=3ec3895f30b69a3613d0daf43697915ec6036f65;hb=ff0e8d7fcb34481652f0bf521ba04b1eca5e2106;hp=e14cedb133fd002b89670166465725039166c4df;hpb=a763f0583a07c4be377c0f1b9908dc166dce835b;p=libfirm diff --git a/ir/ana/irtypeinfo.c b/ir/ana/irtypeinfo.c index e14cedb13..3ec3895f3 100644 --- a/ir/ana/irtypeinfo.c +++ b/ir/ana/irtypeinfo.c @@ -35,6 +35,7 @@ #include "irgraph_t.h" /* for setting the state flag. */ #include "irprog_t.h" +#include "irnode_t.h" #include "pmap.h" /* ------------ The map. ---------------------------------------------- */ @@ -49,8 +50,7 @@ static pmap *type_node_map = NULL; * variable is set by init_irtypeinfo. The type is freed by * free_irtypeinfo. */ -type *initial_type = NULL; - +ir_type *initial_type = NULL; /* ------------ Initializing this module. ----------------------------- */ @@ -60,7 +60,7 @@ type *initial_type = NULL; * in the order of MIN(, #irnodes). */ void init_irtypeinfo(void) { - int i; + int i, n; if (!initial_type) initial_type = new_type_class(new_id_from_str("initial_type")); @@ -69,102 +69,90 @@ void init_irtypeinfo(void) { 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); + n = get_irp_n_irgs(); + for (i = 0; i < n; ++i) + set_irg_typeinfo_state(get_irp_irg(i), ir_typeinfo_none); } void free_irtypeinfo(void) { - int i; + int i, n; if (initial_type) { free_type(initial_type); initial_type = NULL; - } else - assert(0 && "call init_type_info before freeing"); + } + //else assert(0 && "call init_type_info before freeing"); if (type_node_map) { pmap_destroy(type_node_map); type_node_map = NULL; - } else - assert(0 && "call init_type_info before freeing"); + } + //else assert(0 && "call init_type_info before freeing"); - for (i = 0; i < get_irp_n_irgs(); ++i) - set_irg_typeinfo_state(get_irp_irg(i), irg_typeinfo_none); + n = get_irp_n_irgs(); + for (i = 0; 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, irg_typeinfo_state s) { +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; } -irg_typeinfo_state get_irg_typeinfo_state(ir_graph *irg) { +ir_typeinfo_state get_irg_typeinfo_state(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; +} +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; +} + + /* ------------ Irnode type information. ------------------------------ */ /* These routines only work properly if the ir_graph is in state - * irg_typeinfo_consistent or irg_typeinfo_inconsistent. They + * ir_typeinfo_consistent or ir_typeinfo_inconsistent. They * assume current_ir_graph set properly. */ -type *get_irn_typeinfo_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(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 ); - if (pmap_contains(type_node_map, (void *)n)) - res = (type *) pmap_get(type_node_map, (void *)n); + entry = pmap_find(type_node_map, n); + if (entry) + res = entry->value; return res; } -void set_irn_typeinfo_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(current_ir_graph) == ir_typeinfo_consistent || + get_irg_typeinfo_state(current_ir_graph) == ir_typeinfo_inconsistent ); pmap_insert(type_node_map, (void *)n, (void *)tp); } - -type *get_irn_type(ir_node *n) { - type *tp = NULL; - switch(get_irn_opcode(n)) { - case iro_Const: tp = get_Const_type(n); break; - case iro_SymConst: tp = get_SymConst_value_type(n); break; - case iro_Cast: tp = get_Cast_type(n); break; - case iro_Proj: { - ir_node *pred = get_Proj_pred(n); - switch (get_irn_opcode(pred)) { - case iro_Proj: { - ir_node *pred_pred; - /* Deal with Start / Call here: we need to know the Proj Nr. */ - assert(get_irn_mode(pred) == mode_T); - pred_pred = get_Proj_pred(pred); - if (get_irn_op(pred_pred) == op_Start) { - type *mtp = get_entity_type(get_irg_entity(get_irn_irg(pred_pred))); - tp = get_method_param_type(mtp, get_Proj_proj(n)); - } else if (get_irn_op(pred_pred) == op_Call) { - type *mtp = get_Call_type(pred_pred); - tp = get_method_res_type(mtp, get_Proj_proj(n)); - } - } break; - case iro_Start: break; - case iro_Call: break; - case iro_Load: { - ir_node *a = get_Load_ptr(pred); - if (get_irn_op(a) == op_Sel) - tp = get_entity_type(get_Sel_entity(a)); - } break; - default: - break; - } - } break; /* iro_Proj */ - default: - tp = NULL; - } - - return tp; -}