+/* Initialize the type module. */
+void firm_init_type(dbg_info *builtin_db, unsigned def_cc_mask)
+{
+ default_cc_mask = def_cc_mask;
+ value_params_suffix = new_id_from_str(VALUE_PARAMS_SUFFIX);
+ value_ress_suffix = new_id_from_str(VALUE_RESS_SUFFIX);
+
+ /* construct none and unknown type. */
+ firm_none_type = new_type(tpop_none, mode_BAD, new_id_from_str("type_none"), builtin_db);
+ set_type_size_bits(firm_none_type, 0);
+ set_type_state (firm_none_type, layout_fixed);
+ remove_irp_type(firm_none_type);
+
+ firm_unknown_type = new_type(tpop_unknown, mode_ANY, new_id_from_str("type_unknown"), builtin_db);
+ set_type_size_bits(firm_unknown_type, 0);
+ set_type_state (firm_unknown_type, layout_fixed);
+ remove_irp_type(firm_unknown_type);
+}
+
+/** the global type visited flag */
+unsigned long firm_type_visited;
+
+void (set_master_type_visited)(unsigned long val) { _set_master_type_visited(val); }
+unsigned long (get_master_type_visited)(void) { return _get_master_type_visited(); }
+void (inc_master_type_visited)(void) { _inc_master_type_visited(); }
+
+/*
+ * Creates a new type representation.
+ */
+type *
+new_type(tp_op *type_op, ir_mode *mode, ident *name, dbg_info *db) {
+ type *res;
+ int node_size;
+
+ assert(type_op != type_id);
+ assert(!id_contains_char(name, ' ') && "type name should not contain spaces");
+
+ node_size = offsetof(type, attr) + type_op->attr_size;
+ res = xmalloc(node_size);
+ memset(res, 0, node_size);
+
+ res->kind = k_type;
+ res->type_op = type_op;
+ res->mode = mode;
+ res->name = name;
+ res->visibility = visibility_external_allocated;
+ res->frame_type = 0;
+ res->state = layout_undefined;
+ res->size = -1;
+ res->align = -1;
+ res->visit = 0;
+ res->link = NULL;
+ res->dbi = db;
+#ifdef DEBUG_libfirm
+ res->nr = get_irp_new_node_nr();
+#endif /* defined DEBUG_libfirm */
+
+ add_irp_type(res); /* Remember the new type global. */
+
+ return res;
+}