Remove the unused parameter const arch_env_t *env from arch_irn_get_flags(), arch_irn...
[libfirm] / ir / ir / irprofile.c
index c6595d1..408a8ac 100644 (file)
@@ -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.
  *
@@ -36,6 +36,7 @@
 #include "set.h"
 #include "list.h"
 #include "pmap.h"
+#include "array_t.h"
 
 #include "irprintf.h"
 #include "irgwalk.h"
@@ -172,6 +173,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
@@ -220,14 +238,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 +257,8 @@ gen_initializer_irg(ir_entity * ent_filename, ir_entity * bblock_id, ir_entity *
 
        irg_finalize_cons(irg);
 
+       add_constructor(ent);
+
        return irg;
 }
 
@@ -395,13 +415,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 +469,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 +529,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));
                        }