X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firprog.c;h=3ff354267b1911889a535fd6c614b909ac14fda3;hb=c25b0f5781313f72027722783ce6286978bdd757;hp=872feaa5eaf5acfbab0b543af28a9b5aba62aa08;hpb=7918ce9434713009aa50a2c85ec706bcff29e9c4;p=libfirm diff --git a/ir/ir/irprog.c b/ir/ir/irprog.c index 872feaa5e..3ff354267 100644 --- a/ir/ir/irprog.c +++ b/ir/ir/irprog.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -20,7 +20,7 @@ /** * @file * @brief Entry point to the representation of a whole program. - * @author Goetz Lindenmaier + * @author Goetz Lindenmaier, Michael Beck * @date 2000 * @version $Id$ */ @@ -44,6 +44,8 @@ #define GLOBAL_TYPE_NAME "GlobalType" /** The name of the Thread Local Storage type. */ #define TLS_TYPE_NAME "TLS" +/** The name of the constructors type. */ +#define CONSTRUCTORS_TYPE_NAME "Constructors" /** The initial name of the irp program. */ #define INITAL_PROG_NAME "no_name_set" @@ -67,6 +69,8 @@ static ir_prog *new_incomplete_ir_prog(void) { res->modes = NEW_ARR_F(ir_mode *, 0); res->opcodes = NEW_ARR_F(ir_op *, 0); 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; @@ -79,13 +83,15 @@ static ir_prog *new_incomplete_ir_prog(void) { static ir_prog *complete_ir_prog(ir_prog *irp) { #define IDENT(s) new_id_from_chars(s, sizeof(s)-1) - irp->name = IDENT(INITAL_PROG_NAME); - irp->glob_type = new_type_class(IDENT(GLOBAL_TYPE_NAME)); - irp->tls_type = new_type_struct(IDENT(TLS_TYPE_NAME)); + irp->name = IDENT(INITAL_PROG_NAME); + irp->glob_type = new_type_class(IDENT(GLOBAL_TYPE_NAME)); + irp->tls_type = new_type_struct(IDENT(TLS_TYPE_NAME)); + irp->constructors_type = new_type_struct(IDENT(CONSTRUCTORS_TYPE_NAME)); /* Remove these types from type list. Must be treated differently than other types. */ remove_irp_type(irp->glob_type); remove_irp_type(irp->tls_type); + remove_irp_type(irp->constructors_type); /* Set these flags for debugging. */ irp->glob_type->flags |= tf_global_type; @@ -127,10 +133,9 @@ ir_prog *new_ir_prog (void) { /* frees all memory used by irp. Types in type list, irgs in irg list and entities in global type must be freed by hand before. */ void free_ir_prog(void) { - if (irp->glob_type) - free_type(irp->glob_type); - if (irp->tls_type) - free_type(irp->tls_type); + free_type(irp->glob_type); + free_type(irp->tls_type); + free_type(irp->constructors_type); /* @@@ * free_ir_graph(irp->const_code_irg); * ?? End has no in?? */ DEL_ARR_F(irp->graphs); @@ -166,6 +171,10 @@ ir_type *(get_tls_type)(void) { return _get_tls_type(); } +ir_type *(get_constructors_type)(void) { + return _get_constructors_type(); +} + /* Adds irg to the list of ir graphs in irp. */ void add_irp_irg(ir_graph *irg) { assert(irg != NULL); @@ -216,6 +225,10 @@ ir_graph *(get_irp_irg)(int pos){ return _get_irp_irg(pos); } +int get_irp_last_idx(void) { + return irp->max_irg_idx; +} + void set_irp_irg(int pos, ir_graph *irg) { assert(irp && irg); assert(pos < (ARR_LEN(irp->graphs))); @@ -298,7 +311,7 @@ void add_irp_mode(ir_mode *mode) { void add_irp_opcode(ir_op *opcode) { assert(opcode != NULL); assert(irp); - assert(opcode->code == ARR_LEN(irp->opcodes) && "new_ir_op() called in wrong order"); + assert(opcode->code == (unsigned) ARR_LEN(irp->opcodes) && "new_ir_op() called in wrong order"); ARR_APP1(ir_op *, irp->opcodes, opcode); } @@ -391,6 +404,11 @@ void set_irp_callee_info_state(irg_callee_info_state s) { } /* Returns a new, unique exception region number. */ -unsigned long (get_irp_next_region_nr)(void) { +ir_exc_region_t (get_irp_next_region_nr)(void) { return _get_irp_next_region_nr(); } + +/* Returns a new, unique label number. */ +ir_label_t (get_irp_next_label_nr)(void) { + return _get_irp_next_label_nr(); +}