X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firprog.c;h=8941410f2d28ef5928df76570caa997eb9bdd634;hb=5c1ded548038459acf350812d820d8bbd7901ab0;hp=2f46876d088c04b917fca0dfc2a0970025a9e72b;hpb=48b0fa8564962b17e136a0f925eff458ca16abef;p=libfirm diff --git a/ir/ir/irprog.c b/ir/ir/irprog.c index 2f46876d0..8941410f2 100644 --- a/ir/ir/irprog.c +++ b/ir/ir/irprog.c @@ -61,10 +61,7 @@ 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; -#endif #ifndef NDEBUG res->reserved_resources = 0; #endif @@ -72,13 +69,18 @@ static ir_prog *new_incomplete_ir_prog(void) return res; } -/** Completes an incomplete irprog. */ -static ir_prog *complete_ir_prog(ir_prog *irp) { +/** + * Completes an incomplete irprog. + * + * @param irp the (yet incomplete) irp + * @param module_name the (module) name for this irp + */ +static ir_prog *complete_ir_prog(ir_prog *irp, const char *module_name) { int i; -#define IDENT(s) new_id_from_chars(s, sizeof(s)-1) - irp->name = IDENT(INITAL_PROG_NAME); +#define IDENT(x) new_id_from_chars(x, sizeof(x) - 1) + irp->name = new_id_from_str(module_name); irp->segment_types[IR_SEGMENT_GLOBAL] = new_type_class(IDENT("GlobalType")); irp->segment_types[IR_SEGMENT_THREAD_LOCAL] = new_type_struct(IDENT("ThreadLocal")); @@ -95,13 +97,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; @@ -120,13 +123,13 @@ void init_irprog_1(void) { /* Completes ir_prog. */ void init_irprog_2(void) { - complete_ir_prog(irp); + (void)complete_ir_prog(irp, INITAL_PROG_NAME); } /* Create a new ir prog. Automatically called by init_firm through init_irprog. */ -ir_prog *new_ir_prog(void) { - return complete_ir_prog(new_incomplete_ir_prog()); +ir_prog *new_ir_prog(const char *name) { + return complete_ir_prog(new_incomplete_ir_prog(), name); } /* frees all memory used by irp. Types in type list, irgs in irg @@ -313,27 +316,25 @@ void add_irp_mode(ir_mode *mode) { /* Adds opcode to the list of opcodes in irp. */ void add_irp_opcode(ir_op *opcode) { + int len; + size_t code; assert(opcode != NULL); assert(irp); - assert(opcode->code == (unsigned) ARR_LEN(irp->opcodes) && "new_ir_op() called in wrong order"); - ARR_APP1(ir_op *, irp->opcodes, opcode); + len = ARR_LEN(irp->opcodes); + code = opcode->code; + if ((int) code >= len) { + ARR_RESIZE(ir_op*, irp->opcodes, code+1); + memset(&irp->opcodes[len], 0, (code-len+1) * sizeof(irp->opcodes[0])); + } + + assert(irp->opcodes[code] == NULL && "opcode registered twice"); + irp->opcodes[code] = opcode; } /* Removes opcode from the list of opcodes and shrinks the list by one. */ void remove_irp_opcode(ir_op *opcode) { - int i; - - assert(opcode); - for (i = ARR_LEN(irp->opcodes) -1; i >= 0; i--) { - if (irp->opcodes[i] != opcode) - continue; - for (; i < (ARR_LEN(irp->opcodes)) - 1; i++) { - irp->opcodes[i] = irp->opcodes[i+1]; - } - ARR_SETLEN(ir_op *, irp->opcodes, (ARR_LEN(irp->opcodes)) - 1); - return; - } - panic("Deleting unknown opcode"); + assert(opcode->code < ARR_LEN(irp->opcodes)); + irp->opcodes[opcode->code] = NULL; } /* Returns the number of all opcodes in the irp. */ @@ -363,10 +364,10 @@ void set_irp_prog_name(ident *name) { int irp_prog_name_is_set(void) { return irp->name != new_id_from_str(INITAL_PROG_NAME); } -ident *get_irp_prog_ident(void) { +ident *get_irp_ident(void) { return irp->name; } -const char *get_irp_prog_name(void) { +const char *get_irp_name(void) { return get_id_str(irp->name); } @@ -429,7 +430,7 @@ 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]; }