X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firprofile.c;h=8828375d7243f7b1f39049936e1563a954e77148;hb=a55fde3f4de84e78a1b47ce266e9828adf72a8a8;hp=8cc237917459b69905637f263003fa9053d2cbae;hpb=cd066637f50d6dcf70021c87a8ee91ce5ac1e9d5;p=libfirm diff --git a/ir/ir/irprofile.c b/ir/ir/irprofile.c index 8cc237917..8828375d7 100644 --- a/ir/ir/irprofile.c +++ b/ir/ir/irprofile.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. * @@ -24,9 +24,7 @@ * @date 06.04.2006 * @version $Id$ */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif #include @@ -36,6 +34,7 @@ #include "set.h" #include "list.h" #include "pmap.h" +#include "array_t.h" #include "irprintf.h" #include "irgwalk.h" @@ -112,7 +111,6 @@ static void instrument_block(ir_node *bb, ir_node *address, unsigned int id) { ir_graph *irg = get_irn_irg(bb); - ir_node *start_block = get_irg_start_block(irg); ir_node *load, *store, *offset, *add, *projm, *proji, *unknown; ir_node *cnst; @@ -123,14 +121,14 @@ instrument_block(ir_node *bb, ir_node *address, unsigned int id) return; unknown = new_r_Unknown(irg, mode_M); - cnst = new_r_Const_long(irg, start_block, mode_Iu, get_mode_size_bytes(mode_Iu) * id); - offset = new_r_Add(irg, bb, address, cnst, mode_P); - load = new_r_Load(irg, bb, unknown, offset, mode_Iu); + cnst = new_r_Const_long(irg, mode_Iu, get_mode_size_bytes(mode_Iu) * id); + offset = new_r_Add(irg, bb, address, cnst, get_modeP_data()); + load = new_r_Load(irg, bb, unknown, offset, mode_Iu, 0); projm = new_r_Proj(irg, bb, load, mode_M, pn_Load_M); proji = new_r_Proj(irg, bb, load, mode_Iu, pn_Load_res); - cnst = new_r_Const_long(irg, start_block, mode_Iu, 1); + cnst = new_r_Const_long(irg, mode_Iu, 1); add = new_r_Add(irg, bb, proji, cnst, mode_Iu); - store = new_r_Store(irg, bb, projm, offset, add); + store = new_r_Store(irg, bb, projm, offset, add, 0); projm = new_r_Proj(irg, bb, store, mode_M, pn_Store_M); set_irn_link(bb, projm); set_irn_link(projm, load); @@ -172,6 +170,23 @@ fix_ssa(ir_node * bb, void * data) set_Load_mem(get_irn_link(get_irn_link(bb)), mem); } +static void add_constructor(ir_entity *method) +{ + ir_type *method_type = get_entity_type(method); + ident *id = id_unique("constructor_ptrt.%u"); + ir_type *ptr_type = new_type_pointer(id, method_type, mode_P_code); + + ir_type *constructors = get_segment_type(IR_SEGMENT_CONSTRUCTORS); + ident *ide = id_unique("constructor_ptr.%u"); + 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); + + set_entity_compiler_generated(ptr, 1); + set_entity_variability(ptr, variability_constant); + set_atomic_ent_value(ptr, val); +} /** * Generates a new irg which calls the initializer @@ -201,8 +216,8 @@ gen_initializer_irg(ir_entity * ent_filename, ir_entity * bblock_id, ir_entity * set_entity_ld_ident(ent, name); uint = new_type_primitive(new_id_from_str("__uint"), mode_Iu); - uintptr = new_type_pointer(new_id_from_str("__uintptr"), uint, mode_P); - string = new_type_pointer(new_id_from_str("__charptr"), new_type_primitive(new_id_from_str("__char"), mode_Bs), mode_P); + uintptr = new_type_pointer(new_id_from_str("__uintptr"), uint, get_modeP_data()); + string = new_type_pointer(new_id_from_str("__charptr"), new_type_primitive(new_id_from_str("__char"), mode_Bs), get_modeP_data()); set_method_param_type(init_type, 0, string); set_method_param_type(init_type, 1, uintptr); @@ -220,15 +235,15 @@ gen_initializer_irg(ir_entity * ent_filename, ir_entity * bblock_id, ir_entity * start_block = get_irg_start_block(irg); sym.entity_p = init_ent; - symconst = new_r_SymConst(irg, start_block, sym, symconst_addr_ent); + symconst = new_r_SymConst(irg, start_block, mode_P_data, sym, symconst_addr_ent); sym.entity_p = ent_filename; - ins[0] = new_r_SymConst(irg, start_block, sym, symconst_addr_ent); + ins[0] = new_r_SymConst(irg, start_block, mode_P_data, sym, symconst_addr_ent); sym.entity_p = bblock_id; - ins[1] = new_r_SymConst(irg, start_block, sym, symconst_addr_ent); + ins[1] = new_r_SymConst(irg, start_block, mode_P_data, sym, symconst_addr_ent); sym.entity_p = bblock_counts; - ins[2] = new_r_SymConst(irg, start_block, sym, symconst_addr_ent); - ins[3] = new_r_Const_long(irg, start_block, mode_Iu, n_blocks); + ins[2] = new_r_SymConst(irg, start_block, mode_P_data, sym, symconst_addr_ent); + ins[3] = new_r_Const_long(irg, mode_Iu, n_blocks); call = new_r_Call(irg, bb, get_irg_initial_mem(irg), symconst, 4, ins, init_type); ret = new_r_Return(irg, bb, new_r_Proj(irg, bb, call, mode_M, pn_Call_M_regular), 0, NULL); @@ -239,6 +254,8 @@ gen_initializer_irg(ir_entity * ent_filename, ir_entity * bblock_id, ir_entity * irg_finalize_cons(irg); + add_constructor(ent); + return irg; } @@ -274,7 +291,7 @@ 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 = alloca(sizeof(*tarval_string) * (len)); + tarval_string = ALLOCAN(tarval*, len); for (i = 0; i < len; ++i) { tarval_string[i] = new_tarval_from_long(fname[i], mode_Bs); } @@ -422,7 +439,7 @@ 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 = alloca(sizeof(*tarval_string) * (filename_len)); + tarval_string = ALLOCAN(tarval*, filename_len); for (i = 0; i < filename_len; ++i) { tarval_string[i] = new_tarval_from_long(filename[i], mode_Bs); } @@ -449,7 +466,7 @@ ir_profile_instrument(const char *filename, unsigned flags) /* generate a symbolic constant pointing to the count array */ sym.entity_p = bblock_counts; - wd.symconst = new_r_SymConst(irg, get_irg_start_block(irg), sym, symconst_addr_ent); + wd.symconst = new_r_SymConst(irg, get_irg_start_block(irg), mode_P_data, sym, symconst_addr_ent); irg_block_walk_graph(irg, block_id_walker, NULL, &wd); start_block = get_irg_start_block(irg); @@ -500,7 +517,7 @@ 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(mode_Iu, tv), path); + add_compound_ent_value_w_path(ent_locations, new_Const(tv), path); /* name */ path = new_compound_graph_path(loc_type, 2); @@ -509,9 +526,9 @@ 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(sym, symconst_addr_ent); + n = new_SymConst(mode_P_data, sym, symconst_addr_ent); } else { - n = new_Const(mode_P_data, get_mode_null(mode_P_data)); + n = new_Const(get_mode_null(mode_P_data)); } add_compound_ent_value_w_path(ent_locations, n, path); }