X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firprofile.c;h=af3f9952caa0b4caadced42ebd2b6be99c80bce4;hb=af300963705d97b2f596e8cf2887813c25de6ad8;hp=5ff78fec12617dae798497c00e0a5292ea47b9b4;hpb=a6e674f74ea93c3661f100088db520acb701571f;p=libfirm diff --git a/ir/ir/irprofile.c b/ir/ir/irprofile.c index 5ff78fec1..af3f9952c 100644 --- a/ir/ir/irprofile.c +++ b/ir/ir/irprofile.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2011 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -56,8 +56,8 @@ typedef struct loc_entry { unsigned int lineno; /**< line number */ } loc_entry; -typedef struct _block_id_walker_data_t { - tarval **array; /**< the entity the holds the block counts */ +typedef struct block_id_walker_data_t { + ir_tarval **array; /**< the entity the holds the block counts */ unsigned int id; /**< current block id number */ ir_node *symconst; /**< the SymConst representing array */ pmap *fname_map; /**< set containing all found filenames */ @@ -66,7 +66,7 @@ typedef struct _block_id_walker_data_t { unsigned flags; /**< profile flags */ } block_id_walker_data_t; -typedef struct _execcount_t { +typedef struct execcount_t { unsigned long block; unsigned int count; } execcount_t; @@ -76,8 +76,8 @@ typedef struct _execcount_t { */ static int cmp_execcount(const void *a, const void *b, size_t size) { - const execcount_t *ea = a; - const execcount_t *eb = b; + const execcount_t *ea = (const execcount_t*)a; + const execcount_t *eb = (const execcount_t*)b; (void) size; return ea->block != eb->block; } @@ -87,7 +87,7 @@ static int cmp_execcount(const void *a, const void *b, size_t size) */ static void block_counter(ir_node * bb, void * data) { - unsigned int *count = data; + unsigned *count = (unsigned*)data; (void) bb; *count = *count + 1; } @@ -125,12 +125,12 @@ static void instrument_block(ir_node *bb, ir_node *address, unsigned int id) unknown = new_r_Unknown(irg, mode_M); cnst = new_r_Const_long(irg, mode_Iu, get_mode_size_bytes(mode_Iu) * id); offset = new_r_Add(bb, address, cnst, get_modeP_data()); - load = new_r_Load(bb, unknown, offset, mode_Iu, 0); + load = new_r_Load(bb, unknown, offset, mode_Iu, cons_none); projm = new_r_Proj(load, mode_M, pn_Load_M); proji = new_r_Proj(load, mode_Iu, pn_Load_res); cnst = new_r_Const_long(irg, mode_Iu, 1); add = new_r_Add(bb, proji, cnst, mode_Iu); - store = new_r_Store(bb, projm, offset, add, 0); + store = new_r_Store(bb, projm, offset, add, cons_none); projm = new_r_Proj(store, mode_M, pn_Store_M); set_irn_link(bb, projm); set_irn_link(projm, load); @@ -145,7 +145,7 @@ typedef struct fix_env { */ static void fix_ssa(ir_node *bb, void *data) { - fix_env *env = data; + fix_env *env = (fix_env*)data; ir_node *mem; int arity = get_Block_n_cfgpreds(bb); @@ -156,18 +156,18 @@ static void fix_ssa(ir_node *bb, void *data) if (bb == get_irg_start_block(get_irn_irg(bb))) { mem = get_irg_initial_mem(get_irn_irg(bb)); } else if (arity == 1) { - mem = get_irn_link(get_Block_cfgpred_block(bb, 0)); + mem = (ir_node*)get_irn_link(get_Block_cfgpred_block(bb, 0)); } else { int n; ir_node **ins; NEW_ARR_A(ir_node*, ins, arity); for (n = arity - 1; n >= 0; --n) { - ins[n] = get_irn_link(get_Block_cfgpred_block(bb, n)); + ins[n] = (ir_node*)get_irn_link(get_Block_cfgpred_block(bb, n)); } mem = new_r_Phi(bb, arity, ins, mode_M); } - set_Load_mem(get_irn_link(get_irn_link(bb)), mem); + set_Load_mem((ir_node*)get_irn_link((ir_node*)get_irn_link(bb)), mem); } static void add_constructor(ir_entity *method) @@ -180,7 +180,7 @@ static void add_constructor(ir_entity *method) ir_entity *ptr = new_entity(constructors, ide, ptr_type); ir_graph *irg = get_const_code_irg(); ir_node *val = new_rd_SymConst_addr_ent(NULL, irg, mode_P_code, - method, NULL); + method); set_entity_compiler_generated(ptr, 1); set_entity_linkage(ptr, IR_LINKAGE_CONSTANT); @@ -191,7 +191,7 @@ static void add_constructor(ir_entity *method) * Generates a new irg which calls the initializer * * Pseudocode: - * void __firmprof_initializer(void) { __init_firmprof(ent_filename, bblock_id, bblock_counts, n_blocks); } + * void __firmprof_initializer(void) { __init_firmprof(ent_filename, bblock_id, bblock_counts, n_blocks); } */ static ir_graph *gen_initializer_irg(ir_entity *ent_filename, ir_entity *bblock_id, ir_entity *bblock_counts, int n_blocks) { @@ -268,11 +268,11 @@ static void create_location_data(dbg_info *dbg, block_id_walker_data_t *wd) if (! entry) { static unsigned nr = 0; - ident *id; - char buf[128]; - ir_type *arr; - int i, len = strlen(fname) + 1; - tarval **tarval_string; + ident *id; + char buf[128]; + ir_type *arr; + size_t i, len = strlen(fname) + 1; + ir_tarval **tarval_string; snprintf(buf, sizeof(buf), "firm_name_arr.%u", nr); arr = new_type_array(1, wd->tp_char); @@ -286,14 +286,14 @@ static void create_location_data(dbg_info *dbg, block_id_walker_data_t *wd) pmap_insert(wd->fname_map, (void *)fname, ent); /* initialize file name string constant */ - tarval_string = ALLOCAN(tarval*, len); + tarval_string = ALLOCAN(ir_tarval*, len); for (i = 0; i < len; ++i) { tarval_string[i] = new_tarval_from_long(fname[i], mode_Bs); } set_entity_linkage(ent, IR_LINKAGE_CONSTANT); set_array_entity_values(ent, tarval_string, len); } else { - ent = entry->value; + ent = (ir_entity*)entry->value; } wd->locs[wd->id].fname = ent; wd->locs[wd->id].lineno = lineno; @@ -309,7 +309,7 @@ static void create_location_data(dbg_info *dbg, block_id_walker_data_t *wd) */ static void block_id_walker(ir_node *bb, void *data) { - block_id_walker_data_t *wd = data; + block_id_walker_data_t *wd = (block_id_walker_data_t*)data; wd->array[wd->id] = new_tarval_from_long(get_irn_node_nr(bb), mode_Iu); instrument_block(bb, wd->symconst, wd->id); @@ -321,33 +321,32 @@ static void block_id_walker(ir_node *bb, void *data) ++wd->id; } -#define IDENT(x) new_id_from_chars(x, sizeof(x) - 1) +#define IDENT(x) new_id_from_chars(x, sizeof(x) - 1) ir_graph *ir_profile_instrument(const char *filename, unsigned flags) { int n, i; int n_blocks = 0; - ir_entity *bblock_id; - ir_entity *bblock_counts; - ir_entity *ent_filename; - ir_entity *ent_locations = NULL; - ir_entity *loc_lineno = NULL; - ir_entity *loc_name = NULL; - ir_entity *ent; - ir_type *array_type; - ir_type *uint_type; - ir_type *string_type; - ir_type *character_type; - ir_type *loc_type = NULL; - ir_type *charptr_type; - ir_type *gtp; - tarval **tarval_array; - tarval **tarval_string; - tarval *tv; + ir_entity *bblock_id; + ir_entity *bblock_counts; + ir_entity *ent_filename; + ir_entity *ent_locations = NULL; + ir_entity *loc_lineno = NULL; + ir_entity *loc_name = NULL; + ir_entity *ent; + ir_type *array_type; + ir_type *uint_type; + ir_type *string_type; + ir_type *character_type; + ir_type *loc_type = NULL; + ir_type *charptr_type; + ir_type *gtp; + ir_tarval **tarval_array; + ir_tarval **tarval_string; + ir_tarval *tv; int filename_len = strlen(filename)+1; ident *cur_ident; unsigned align_l, align_n, size; - ir_graph *rem; block_id_walker_data_t wd; symconst_symbol sym; @@ -421,7 +420,7 @@ ir_graph *ir_profile_instrument(const char *filename, unsigned flags) } /* initialize count array */ - NEW_ARR_A(tarval *, tarval_array, n_blocks); + NEW_ARR_A(ir_tarval *, tarval_array, n_blocks); tv = get_mode_null(mode_Iu); for (i = 0; i < n_blocks; ++i) { tarval_array[i] = tv; @@ -429,7 +428,7 @@ ir_graph *ir_profile_instrument(const char *filename, unsigned flags) set_array_entity_values(bblock_counts, tarval_array, n_blocks); /* initialize function name string constant */ - tarval_string = ALLOCAN(tarval*, filename_len); + tarval_string = ALLOCAN(ir_tarval*, filename_len); for (i = 0; i < filename_len; ++i) { tarval_string[i] = new_tarval_from_long(filename[i], mode_Bs); } @@ -447,19 +446,17 @@ ir_graph *ir_profile_instrument(const char *filename, unsigned flags) } for (n = get_irp_n_irgs() - 1; n >= 0; --n) { - ir_graph *irg = get_irp_irg(n); - int i; - ir_node *endbb = get_irg_end_block(irg); - fix_env env; - - set_current_ir_graph(irg); + ir_graph *irg = get_irp_irg(i); + ir_node *endbb = get_irg_end_block(irg); + int i; + fix_env env; /* generate a symbolic constant pointing to the count array */ sym.entity_p = bblock_counts; wd.symconst = new_r_SymConst(irg, mode_P_data, sym, symconst_addr_ent); irg_block_walk_graph(irg, block_id_walker, NULL, &wd); - env.end_block = get_irg_end_block(irg); + env.end_block = get_irg_end_block(irg); irg_block_walk_graph(irg, fix_ssa, NULL, &env); for (i = get_Block_n_cfgpreds(endbb) - 1; i >= 0; --i) { ir_node *node = skip_Proj(get_Block_cfgpred(endbb, i)); @@ -469,13 +466,13 @@ ir_graph *ir_profile_instrument(const char *filename, unsigned flags) switch (get_irn_opcode(node)) { case iro_Return: - ins[0] = get_irn_link(bb); + ins[0] = (ir_node*)get_irn_link(bb); ins[1] = get_Return_mem(node); sync = new_r_Sync(bb, 2, ins); set_Return_mem(node, sync); break; case iro_Raise: - ins[0] = get_irn_link(bb); + ins[0] = (ir_node*)get_irn_link(bb); ins[1] = get_Raise_mem(node); sync = new_r_Sync(bb, 2, ins); set_Raise_mem(node, sync); @@ -490,14 +487,13 @@ ir_graph *ir_profile_instrument(const char *filename, unsigned flags) set_array_entity_values(bblock_id, tarval_array, n_blocks); if (flags & profile_with_locations) { + ir_graph *irg = get_const_code_irg(); /* build the initializer for the locations */ - rem = current_ir_graph; - current_ir_graph = get_const_code_irg(); ent = get_array_element_entity(loc_type); set_entity_linkage(ent_locations, IR_LINKAGE_CONSTANT); for (i = 0; i < n_blocks; ++i) { compound_graph_path *path; - tarval *tv; + ir_tarval *tv; ir_node *n; /* lineno */ @@ -506,7 +502,7 @@ ir_graph *ir_profile_instrument(const char *filename, unsigned flags) set_compound_graph_path_node(path, 0, ent); set_compound_graph_path_node(path, 1, loc_lineno); tv = new_tarval_from_long(wd.locs[i].lineno, mode_Iu); - add_compound_ent_value_w_path(ent_locations, new_Const(tv), path); + add_compound_ent_value_w_path(ent_locations, new_r_Const(irg, tv), path); /* name */ path = new_compound_graph_path(loc_type, 2); @@ -515,14 +511,13 @@ ir_graph *ir_profile_instrument(const char *filename, unsigned flags) set_compound_graph_path_node(path, 1, loc_name); if (wd.locs[i].fname) { sym.entity_p = wd.locs[i].fname; - n = new_SymConst(mode_P_data, sym, symconst_addr_ent); + n = new_r_SymConst(irg, mode_P_data, sym, symconst_addr_ent); } else { - n = new_Const(get_mode_null(mode_P_data)); + n = new_r_Const(irg, get_mode_null(mode_P_data)); } add_compound_ent_value_w_path(ent_locations, n, path); } pmap_destroy(wd.fname_map); - current_ir_graph = rem; } return gen_initializer_irg(ent_filename, bblock_id, bblock_counts, n_blocks); } @@ -616,7 +611,7 @@ ir_profile_get_block_execcount(const ir_node *block) return 1; query.block = get_irn_node_nr(block); - ec = set_find(profile, &query, sizeof(query), get_irn_node_nr(block)); + ec = (execcount_t*)set_find(profile, &query, sizeof(query), get_irn_node_nr(block)); if (ec != NULL) { return ec->count; @@ -627,7 +622,7 @@ ir_profile_get_block_execcount(const ir_node *block) } } -typedef struct _intialize_execfreq_env_t { +typedef struct intialize_execfreq_env_t { ir_graph *irg; ir_exec_freq *execfreqs; double freq_factor; @@ -638,7 +633,7 @@ static const double MIN_EXECFREQ = 0.00001; static void initialize_execfreq(ir_node *block, void *data) { - initialize_execfreq_env_t *env = data; + initialize_execfreq_env_t *env = (initialize_execfreq_env_t*)data; double freq; if (block == get_irg_start_block(env->irg)