+tp_op *get_tpop_primitive(void);
+
+/**
+ * This type opcode is an auxiliary opcode dedicated to support transformations
+ * of the type structure.
+ *
+ * If a type is changed to another type with another
+ * opcode the new type will be allocated with new memory. All nodes refering
+ * to the old type need to be changed to refer to the new one. This is simplified
+ * by turning the old type into an id type that merely forwards to the new type
+ * that now replaces the old one.
+ * type_ids should never be visible out of the type module. All access routines
+ * should automatically check for type_id and eventually follow the forward in
+ * type_id. Two types are exchanged by a call to exchange_types.
+ * If a type_id is visible externally report this as bug. If it is assured that
+ * this never happens this extern variable can be moved to tpop_t.h.
+ * This struct is dynamically allocated but constant for the lifetime
+ * of the library.
+ */
+extern tp_op *type_id;
+tp_op *get_tpop_id(void);
+
+/**
+ * This type opcode is an auxiliary opcode dedicated to support type analyses.
+ *
+ * Types with this opcode represents that there is no type.
+ * The type can be used to initialize fields of the type* that actually can not
+ * contain a type or that are initialized for an analysis. There exists exactly
+ * one type with this opcode.
+ */
+extern tp_op *tpop_none;
+tp_op *get_tpop_none(void);
+
+/**
+ * This type opcode is an auxiliary opcode dedicated to support type analyses.
+ *
+ * Types with this opcode represents that there could be a type, but it is not
+ * known. This type can be used to initialize fields before an analysis (not known
+ * yet) or to represent the top of a lattice (could not be determined). There exists
+ * exactly one type with this opcode.
+ */
+extern tp_op *tpop_unknown;
+tp_op *get_tpop_unknown(void);