X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firprofile.c;h=7ff880585ff6708def776f6149904273a2a9b86c;hb=7e8388fa7996ff182d3aa4e0cdd41b27bed4982f;hp=69d3098eb6c7183b2d23f34981e01ce09ff2a4cd;hpb=721d08dd4a61263775f451e29b05b90138d155e2;p=libfirm diff --git a/ir/ir/irprofile.c b/ir/ir/irprofile.c index 69d3098eb..7ff880585 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. * @@ -172,6 +172,22 @@ 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_constructors_type(); + 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_atomic_ent_value(ptr, val); +} /** * Generates a new irg which calls the initializer @@ -220,14 +236,14 @@ 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[2] = new_r_SymConst(irg, start_block, mode_P_data, sym, symconst_addr_ent); ins[3] = new_r_Const_long(irg, start_block, mode_Iu, n_blocks); call = new_r_Call(irg, bb, get_irg_initial_mem(irg), symconst, 4, ins, init_type); @@ -239,6 +255,8 @@ gen_initializer_irg(ir_entity * ent_filename, ir_entity * bblock_id, ir_entity * irg_finalize_cons(irg); + add_constructor(ent); + return irg; } @@ -337,7 +355,7 @@ ir_profile_instrument(const char *filename, unsigned flags) tarval *tv; int filename_len = strlen(filename)+1; ident *cur_ident; - int align_l, align_n, size; + unsigned align_l, align_n, size; ir_graph *rem; block_id_walker_data_t wd; symconst_symbol sym; @@ -395,13 +413,13 @@ ir_profile_instrument(const char *filename, unsigned flags) align_n = get_type_size_bytes(charptr_type); set_type_alignment_bytes(charptr_type, align_n); loc_name = new_entity(loc_type, IDENT("name"), charptr_type); - size = (size + align_n - 1) & -align_n; + size = (size + align_n - 1) & ~(align_n - 1); set_entity_offset(loc_name, size); size += align_n; if (align_n > align_l) align_l = align_n; - size = (size + align_l - 1) & -align_l; + size = (size + align_l - 1) & ~(align_l - 1); set_type_size_bytes(loc_type, size); set_type_state(loc_type, layout_fixed); @@ -449,7 +467,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); @@ -509,7 +527,7 @@ 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)); }