+/** Completes an incomplete irprog. */
+static ir_prog *complete_ir_prog(ir_prog *irp) {
+
+ irp->name = new_id_from_str(INITAL_PROG_NAME);
+
+ irp->glob_type = new_type_class(new_id_from_str (GLOBAL_TYPE_NAME));
+ /* Remove type from type list. Must be treated differently than
+ other types. */
+ remove_irp_type(irp->glob_type);
+
+ irp->const_code_irg = new_const_code_irg();
+
+ irp->phase_state = phase_building;
+ irp->outs_state = outs_none;
+ irp->ip_outedges = NULL;
+ irp->trouts_state = outs_none;
+ irp->class_cast_state = ir_class_casts_transitive;
+
+ return irp;
+}
+
+/* initializes ir_prog. Constructs only the basic lists */
+void init_irprog_1(void) {
+ new_incomplete_ir_prog();
+}
+
+/* Completes ir_prog. */
+void init_irprog_2(void) {
+ complete_ir_prog(irp);
+}
+
+/* Create a new ir prog. Automatically called by init_firm through
+ init_irprog. */
+ir_prog *new_ir_prog (void) {
+ return complete_ir_prog(new_incomplete_ir_prog());
+}
+
+/* frees all memory used by irp. Types in type list, irgs in irg
+ list and entities in global type must be freed by hand before. */
+void free_ir_prog(void) {
+ if (irp->glob_type)
+ free_type(irp->glob_type);
+
+ /* @@@ * free_ir_graph(irp->const_code_irg); * ?? End has no in?? */
+ DEL_ARR_F(irp->graphs);
+ DEL_ARR_F(irp->pseudo_graphs);
+ DEL_ARR_F(irp->types);
+ DEL_ARR_F(irp->modes);
+ DEL_ARR_F(irp->opcodes);
+
+ irp->name = NULL;
+ irp->const_code_irg = NULL;
+ irp->kind = k_BAD;
+}
+
+/*- Functions to access the fields of ir_prog -*/