X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firprog.c;h=5f7fdf5bc704499c183d1c7162b58a0b46fa0cf6;hb=a947c2090825c6a49b3fbfaafc00c8c34d649a40;hp=5ca65ce3401ac41974050fc001b476338ec02f97;hpb=e9acaaa06c895c2632071e8d42e8632253c3d9f8;p=libfirm diff --git a/ir/ir/irprog.c b/ir/ir/irprog.c index 5ca65ce34..5f7fdf5bc 100644 --- a/ir/ir/irprog.c +++ b/ir/ir/irprog.c @@ -24,13 +24,9 @@ * @date 2000 * @version $Id$ */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif +#include "config.h" -#ifdef HAVE_STRING_H -# include -#endif +#include #include "irprog_t.h" #include "irgraph_t.h" @@ -51,11 +47,9 @@ ir_prog *get_irp(void) { return irp; } /** * Create a new incomplete ir_prog. */ -static ir_prog *new_incomplete_ir_prog(void) { - ir_prog *res; - - res = xmalloc(sizeof(*res)); - memset(res, 0, sizeof(*res)); +static ir_prog *new_incomplete_ir_prog(void) +{ + ir_prog *res = XMALLOCZ(ir_prog); res->kind = k_ir_prog; res->graphs = NEW_ARR_F(ir_graph *, 0); @@ -67,9 +61,9 @@ static ir_prog *new_incomplete_ir_prog(void) { res->last_region_nr = 0; res->last_label_nr = 1; /* 0 is reserved as non-label */ res->max_irg_idx = 0; - -#ifdef DEBUG_libfirm - res->max_node_nr = 0; + res->max_node_nr = 0; +#ifndef NDEBUG + res->reserved_resources = 0; #endif return res; @@ -98,13 +92,14 @@ static ir_prog *complete_ir_prog(ir_prog *irp) { /* Set these flags for debugging. */ irp->segment_types[IR_SEGMENT_GLOBAL]->flags |= tf_global_type; irp->segment_types[IR_SEGMENT_THREAD_LOCAL]->flags |= tf_tls_type; + irp->segment_types[IR_SEGMENT_CONSTRUCTORS]->flags |= tf_constructors; + irp->segment_types[IR_SEGMENT_DESTRUCTORS]->flags |= tf_destructors; /* The global type is a class, but we cannot derive from it, so set the final property to assist optimizations that checks for it. */ set_class_final(irp->segment_types[IR_SEGMENT_GLOBAL], 1); - irp->const_code_irg = new_const_code_irg(); - + irp->const_code_irg = new_const_code_irg(); irp->phase_state = phase_building; irp->outs_state = outs_none; irp->ip_outedges = NULL; @@ -190,26 +185,28 @@ void add_irp_irg(ir_graph *irg) { /* Removes irg from the list or irgs, shrinks the list by one. */ void remove_irp_irg_from_list(ir_graph *irg){ - int i, found = 0; + int i, l, found = 0; assert(irg); - for (i = 0; i < (ARR_LEN (irp->graphs)); i++) { + l = ARR_LEN(irp->graphs); + for (i = 0; i < l; i++) { if (irp->graphs[i] == irg) { found = 1; - for(; i < (ARR_LEN (irp->graphs)) - 1; i++) { + for(; i < l - 1; i++) { irp->graphs[i] = irp->graphs[i+1]; } - ARR_SETLEN(ir_graph*, irp->graphs, (ARR_LEN(irp->graphs)) - 1); + ARR_SETLEN(ir_graph*, irp->graphs, l - 1); break; } } if (!found) { - for (i = 0; i < (ARR_LEN (irp->pseudo_graphs)); i++) { + l = ARR_LEN(irp->pseudo_graphs); + for (i = 0; i < l; i++) { if (irp->pseudo_graphs[i] == irg) { - for(; i < (ARR_LEN (irp->pseudo_graphs)) - 1; i++) { + for(; i < l - 1; i++) { irp->pseudo_graphs[i] = irp->pseudo_graphs[i+1]; } - ARR_SETLEN(ir_graph*, irp->pseudo_graphs, (ARR_LEN(irp->pseudo_graphs)) - 1); + ARR_SETLEN(ir_graph*, irp->pseudo_graphs, l - 1); break; } } @@ -218,7 +215,6 @@ void remove_irp_irg_from_list(ir_graph *irg){ /* Removes irg from the list or irgs, shrinks the list by one. */ void remove_irp_irg(ir_graph *irg){ - assert(irg); free_ir_graph(irg); remove_irp_irg_from_list(irg); } @@ -263,15 +259,15 @@ ir_graph *get_irp_allirg(int pos) { void add_irp_type(ir_type *typ) { assert(typ != NULL); assert(irp); - ARR_APP1 (ir_type *, irp->types, typ); + ARR_APP1(ir_type *, irp->types, typ); } -/* Remove type form the list of types in irp. */ +/* Remove type from the list of types in irp. */ void remove_irp_type(ir_type *typ) { int i; assert(typ); - for (i = ARR_LEN(irp->types) -1; i >= 0; i--) { + for (i = ARR_LEN(irp->types) - 1; i >= 0; i--) { if (irp->types[i] == typ) { for(; i < (ARR_LEN(irp->types)) - 1; i++) { irp->types[i] = irp->types[i+1]; @@ -431,6 +427,23 @@ int get_irp_n_asms(void) { /* Return the global asm include at position pos. */ ident *get_irp_asm(int pos) { - assert(pos <= 0 && pos < get_irp_n_asms()); + assert(0 <= pos && pos < get_irp_n_asms()); return irp->global_asms[pos]; } + +#ifndef NDEBUG +void irp_reserve_resources(ir_prog *irp, ir_resources_t resources) { + assert((resources & ~IR_RESOURCE_GLOBAL_MASK) == 0); + assert((irp->reserved_resources & resources) == 0); + irp->reserved_resources |= resources; +} + +void irp_free_resources(ir_prog *irp, ir_resources_t resources) { + assert((irp->reserved_resources & resources) == resources); + irp->reserved_resources &= ~resources; +} + +ir_resources_t irp_resources_reserved(const ir_prog *irp) { + return irp->reserved_resources; +} +#endif