X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firprog.c;h=3ff354267b1911889a535fd6c614b909ac14fda3;hb=c25b0f5781313f72027722783ce6286978bdd757;hp=e48f791f3f7378213db2f3d499c64d073de2c2b4;hpb=10e8d8749b8740ef7e585698cc254dc2e9fbaae8;p=libfirm diff --git a/ir/ir/irprog.c b/ir/ir/irprog.c index e48f791f3..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))); @@ -394,3 +407,8 @@ void set_irp_callee_info_state(irg_callee_info_state s) { 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(); +}