X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firprog.c;h=4890c5885459a50290c58d2b273d5e2e598916e6;hb=31ef53136fdb86d4a98919c2148c95cadea4ea81;hp=7a36119e96fe8396da13c756a018c7803efca995;hpb=6bafccc2dd89340dfe5b8fe16bb5ec00c0dd0a58;p=libfirm diff --git a/ir/ir/irprog.c b/ir/ir/irprog.c index 7a36119e9..4890c5885 100644 --- a/ir/ir/irprog.c +++ b/ir/ir/irprog.c @@ -36,6 +36,7 @@ #include "irgraph_t.h" #include "pseudo_irg.h" #include "array.h" +#include "error.h" #include "obst.h" #include "irop_t.h" #include "irmemory.h" @@ -50,11 +51,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); @@ -62,6 +61,7 @@ static ir_prog *new_incomplete_ir_prog(void) { res->types = NEW_ARR_F(ir_type *, 0); res->modes = NEW_ARR_F(ir_mode *, 0); res->opcodes = NEW_ARR_F(ir_op *, 0); + res->global_asms = NEW_ARR_F(ident *, 0); res->last_region_nr = 0; res->last_label_nr = 1; /* 0 is reserved as non-label */ res->max_irg_idx = 0; @@ -103,12 +103,12 @@ static ir_prog *complete_ir_prog(ir_prog *irp) { irp->const_code_irg = new_const_code_irg(); - irp->phase_state = phase_building; - irp->outs_state = outs_none; - irp->ip_outedges = NULL; - irp->trouts_state = outs_none; - irp->class_cast_state = ir_class_casts_transitive; - irp->globals_adr_taken_state = ir_address_taken_not_computed; + irp->phase_state = phase_building; + irp->outs_state = outs_none; + irp->ip_outedges = NULL; + irp->trouts_state = outs_none; + irp->class_cast_state = ir_class_casts_transitive; + irp->globals_entity_usage_state = ir_entity_usage_not_computed; return irp; #undef IDENT @@ -126,7 +126,7 @@ void init_irprog_2(void) { /* Create a new ir prog. Automatically called by init_firm through init_irprog. */ -ir_prog *new_ir_prog (void) { +ir_prog *new_ir_prog(void) { return complete_ir_prog(new_incomplete_ir_prog()); } @@ -138,12 +138,15 @@ void free_ir_prog(void) { free_type(irp->segment_types[i]); } + free_ir_graph(irp->const_code_irg); DEL_ARR_F(irp->graphs); DEL_ARR_F(irp->pseudo_graphs); DEL_ARR_F(irp->types); DEL_ARR_F(irp->modes); + + finish_op(); DEL_ARR_F(irp->opcodes); - free_ir_graph(irp->const_code_irg); + DEL_ARR_F(irp->global_asms); irp->name = NULL; irp->const_code_irg = NULL; @@ -160,7 +163,7 @@ ir_graph *get_irp_main_irg(void) { } void set_irp_main_irg(ir_graph *main_irg) { - assert (irp); + assert(irp); irp->main_irg = main_irg; } @@ -322,14 +325,15 @@ void remove_irp_opcode(ir_op *opcode) { assert(opcode); for (i = ARR_LEN(irp->opcodes) -1; i >= 0; i--) { - if (irp->opcodes[i] == opcode) { - 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); - break; + 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"); } /* Returns the number of all opcodes in the irp. */ @@ -395,7 +399,6 @@ ir_node** get_irp_ip_outedges(void) { return irp->ip_outedges; } - irg_callee_info_state get_irp_callee_info_state(void) { return irp->callee_info_state; } @@ -413,3 +416,19 @@ ir_exc_region_t (get_irp_next_region_nr)(void) { ir_label_t (get_irp_next_label_nr)(void) { return _get_irp_next_label_nr(); } + +/* Add a new global asm include */ +void add_irp_asm(ident *asm_string) { + ARR_APP1(ident *, irp->global_asms, asm_string); +} + +/* Return the number of global asm includes. */ +int get_irp_n_asms(void) { + return ARR_LEN(irp->global_asms); +} + +/* Return the global asm include at position pos. */ +ident *get_irp_asm(int pos) { + assert(pos <= 0 && pos < get_irp_n_asms()); + return irp->global_asms[pos]; +}