+
+#ifdef DEBUG_libfirm
+/* Returns a new, unique number to number nodes or the like. */
+int get_irp_new_node_nr(void);
+#endif
+
+/* Suffixes added to types used for pass-by-value representations. */
+static ident *value_params_suffix = NULL;
+static ident *value_ress_suffix = NULL;
+
+/** The default calling convention for method types. */
+static unsigned default_cc_mask;
+
+/* return the default calling convention for method types */
+unsigned get_default_cc_mask(void) {
+ return default_cc_mask;
+}
+
+/* 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.
+ */
+ir_type *
+new_type(tp_op *type_op, ir_mode *mode, ident *name, dbg_info *db) {
+ ir_type *res;
+ int node_size;
+
+ assert(type_op != type_id);
+ assert(!id_contains_char(name, ' ') && "type name should not contain spaces");
+
+ node_size = offsetof(ir_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->flags = tf_none;
+ res->size = -1;
+ res->align = -1;
+ res->visit = 0;
+ res->link = NULL;
+ res->dbi = db;
+ res->assoc_type = NULL;
+#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;
+}
+
+void free_type(ir_type *tp) {
+ const tp_op *op = get_type_tpop(tp);
+
+ if ((get_type_tpop(tp) == tpop_none) || (get_type_tpop(tp) == tpop_unknown))
+ return;