-/* (C) 2001 by Universitaet Karlsruhe */
-
-/* $Id$ */
-
-# ifndef _TYPEOP_H_
-# define _TYPEOP_H_
-
-#include "ident.h"
-
/**
- * @file tpop.h
*
- * This module specifies the kinds of types available in firm.
+ * @file tpop.h
+ *
+ * Project: libFIRM
+ * File name: ir/tr/tpop.h
+ * Purpose: Opcode of types.
+ * Author: Goetz Lindenmaier
+ * Modified by:
+ * Created:
+ * Copyright: (c) 2001-2003 Universität Karlsruhe
+ * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE.
+ * CVS-ID: $Id$
*
- * @author Goetz Lindenmaier
+ * This module specifies the kinds of types available in firm.
*
* They are called type opcodes. These include classes, structs, methods, unions,
* arrays, enumerations, pointers and primitive types.
+ * Special types with own opcodes are the id type, a type representing an unknown
+ * type and a type used to specify that something has no type.
+ *
+ * @see type.h
*/
+# ifndef _TYPEOP_H_
+# define _TYPEOP_H_
+
+#include "ident.h"
+
/**
- * an enum for the type kinds.
+ * An enum for the type kinds.
* For each type kind exists a typecode to identify it.
*/
typedef enum {
+ tpo_uninitialized = 0, /* not a type opcode */
tpo_class,
tpo_struct,
tpo_method,
tpo_enumeration,
tpo_pointer,
tpo_primitive,
- tpo_id
+ tpo_id,
+ tpo_none,
+ tpo_unknown,
+ tpo_max /* not a type opcode */
} tp_opcode;
/**
* @param op The type opcode to get the string from.
* @return a string. (@todo Null terminated???)
*/
-const char *get_tpop_name (tp_op *op);
+const char *get_tpop_name (const tp_op *op);
/**
* Returns an enum for the type opcode.
* @param op The type opcode to get the enum from.
* @return the enum.
*/
-tp_opcode get_tpop_code (tp_op *op);
+tp_opcode get_tpop_code (const tp_op *op);
/**
* Returns the ident for the type opcode.
* @param op The type opcode to get the ident from.
* @return The ident.
*/
-ident *get_tpop_ident (tp_op *op);
+ident *get_tpop_ident (const tp_op *op);
/**
* This type opcode marks that the corresponding type is a class type.
* of the library.
*/
extern tp_op *type_class;
-tp_op *get_type_class(void);
+tp_op *get_tpop_class(void);
/**
* This type opcode marks that the corresponding type is a compound type
* of the library.
*/
extern tp_op *type_struct;
-tp_op *get_type_struct(void);
+tp_op *get_tpop_struct(void);
/**
* This type opcode marks that the corresponding type is a method type.
* of the library.
*/
extern tp_op *type_method;
-tp_op *get_type_method(void);
+tp_op *get_tpop_method(void);
/**
* This type opcode marks that the corresponding type is a union type.
* of the library.
*/
extern tp_op *type_union;
-tp_op *get_type_union(void);
+tp_op *get_tpop_union(void);
/**
* This type opcode marks that the corresponding type is an array type.
* of the library.
*/
extern tp_op *type_array;
-tp_op *get_type_array(void);
+tp_op *get_tpop_array(void);
/**
* This type opcode marks that the corresponding type is an enumeration type.
*
* Consequently it contains a list of idents for the enumeration identifiers
- * and a list of tarbet values that are the constants used to implement
+ * and a list of target values that are the constants used to implement
* the enumerators.
* This struct is dynamically allocated but constant for the lifetime
* of the library.
*/
extern tp_op *type_enumeration;
-tp_op *get_type_enumeration(void);
+tp_op *get_tpop_enumeration(void);
/**
* This type opcode marks that the corresponding type is a pointer type.
* of the library.
*/
extern tp_op *type_pointer;
-tp_op *get_type_pointer(void);
+tp_op *get_tpop_pointer(void);
/**
* This type opcode marks that the corresponding type is a primitive type.
* of the library.
*/
extern tp_op *type_primitive;
-tp_op *get_type_primitive(void);
+tp_op *get_tpop_primitive(void);
/**
* This type opcode is an auxiliary opcode dedicated to support transformations
*
* 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 the new one. This is simplified
+ * 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
* of the library.
*/
extern tp_op *type_id;
-tp_op *get_type_id(void);
+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);
# endif /*_TYPEOP_H_ */