X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firprog.c;h=9aa961267e1c229a4f727374622f7d349ad62620;hb=1852308bd33b77378f0fca9e5347d4f9082464c4;hp=81ba986773cd307ce58a90450d6f97548f446316;hpb=296dfbcbe4da36ca193f81c60443dda80890fab4;p=libfirm diff --git a/ir/ir/irprog.c b/ir/ir/irprog.c index 81ba98677..9aa961267 100644 --- a/ir/ir/irprog.c +++ b/ir/ir/irprog.c @@ -30,6 +30,7 @@ #include "irprog_t.h" #include "irgraph_t.h" +#include "irpass_t.h" #include "pseudo_irg.h" #include "array.h" #include "error.h" @@ -69,13 +70,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")); @@ -118,13 +124,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 @@ -317,7 +323,7 @@ void add_irp_opcode(ir_op *opcode) { assert(irp); len = ARR_LEN(irp->opcodes); code = opcode->code; - if (code >= len) { + if ((int) code >= len) { ARR_RESIZE(ir_op*, irp->opcodes, code+1); memset(&irp->opcodes[len], 0, (code-len+1) * sizeof(irp->opcodes[0])); } @@ -328,7 +334,7 @@ void add_irp_opcode(ir_op *opcode) { /* Removes opcode from the list of opcodes and shrinks the list by one. */ void remove_irp_opcode(ir_op *opcode) { - assert(opcode->code < ARR_LEN(irp->opcodes)); + assert((int) opcode->code < ARR_LEN(irp->opcodes)); irp->opcodes[opcode->code] = NULL; } @@ -359,10 +365,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); } @@ -379,6 +385,45 @@ void set_irp_phase_state(irg_phase_state s) { irp->phase_state = s; } +struct pass_t { + ir_prog_pass_t pass; + irg_phase_state state; +}; + +/** + * Wrapper for setting the state of a whole ir_prog. + */ +static int set_irp_phase_state_wrapper(ir_prog *irp, void *context) { + struct pass_t *pass = context; + irg_phase_state state = pass->state; + int i; + + (void)irp; + + /* set the phase of all graphs */ + for (i = get_irp_n_irgs() - 1; i >= 0; --i) + set_irg_phase_state(get_irp_irg(i), state); + + /* set the irp phase */ + set_irp_phase_state(state); + + return 0; +} + +ir_prog_pass_t *set_irp_phase_state_pass(const char *name, irg_phase_state state) { + struct pass_t *pass = XMALLOCZ(struct pass_t); + + def_prog_pass_constructor( + &pass->pass, name ? name : "set_irp_phase", set_irp_phase_state_wrapper); + pass->state = state; + + /* no dump/verify */ + pass->pass.verify_irprog = ir_prog_no_verify; + pass->pass.dump_irprog = ir_prog_no_dump; + + return &pass->pass; +} + irg_outs_state get_irp_ip_outs_state(void) { return irp->outs_state; }