Fix inconsistency between reg_req and ins of Push: reg_req expected the stack in...
[libfirm] / ir / ir / irprofile.c
index fbcf08f..7ff8805 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.
  *
@@ -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
@@ -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;
 }