remove symconst_type_tag
[libfirm] / include / libfirm / firm_types.h
index c3c5236..3a356af 100644 (file)
@@ -21,7 +21,6 @@
  * @file
  * @brief      Definition of opaque firm types
  * @author     Michael Beck
- * @version    $Id$
  */
 #ifndef FIRM_COMMON_FIRM_TYPES_H
 #define FIRM_COMMON_FIRM_TYPES_H
@@ -47,14 +46,12 @@ typedef struct ir_graph             ir_graph,            *ir_graph_ptr;
 typedef struct ir_prog              ir_prog,             *ir_prog_ptr;
 typedef struct ir_loop              ir_loop,             *ir_loop_ptr;
 typedef struct ir_region            ir_region,           *ir_region_ptr;
-typedef struct ir_reg_tree          ir_reg_tree,         *ir_reg_tree_ptr;
 typedef struct ir_entity            ir_entity,           *ir_entity_ptr;
 typedef struct ir_extblk            ir_extblk,           *ir_extblk_ptr;
 typedef struct ir_exec_freq         ir_exec_freq,        *ir_exec_freq_ptr;
 typedef struct ir_cdep              ir_cdep,             *ir_cdep_ptr;
 typedef struct sn_entry             *seqno_t;
 typedef struct arch_irn_ops_t       arch_irn_ops_t;
-typedef struct type_identify_if_t   type_identify_if_t;
 typedef struct ir_graph_pass_t      ir_graph_pass_t;
 typedef struct ir_prog_pass_t       ir_prog_pass_t;
 
@@ -66,9 +63,12 @@ typedef union  ir_initializer_t     ir_initializer_t,    *ir_initializer_ptr;
 typedef void irg_walk_func(ir_node *, void *);
 typedef void irg_reg_walk_func(ir_region *, void *);
 
-/* settings */
-typedef struct ir_settings_arch_dep_t ir_settings_arch_dep_t;
-typedef struct ir_settings_if_conv_t  ir_settings_if_conv_t;
+/**
+ * A switch table mapping integer numbers to proj-numbers of a Switch-node.
+ * Entries map a continuous range of integer numbers to a proj-number.
+ * There must never be two different entries matching the same integer number.
+ */
+typedef struct ir_switch_table  ir_switch_table;
 
 /* Needed for MSVC to suppress warnings because it doest NOT handle const right. */
 typedef const ir_node *ir_node_cnst_ptr;
@@ -93,7 +93,7 @@ typedef const ir_node *ir_node_cnst_ptr;
 typedef ir_node *uninitialized_local_variable_func_t(ir_graph *irg, ir_mode *mode, int pos);
 
 #ifdef __cplusplus
-#      define ENUM_BITSET(type) \
+# define ENUM_BITSET(type) \
        extern "C++" { \
                static inline type operator ~  (type  a)         { return     (type)~(int)a;           } \
                static inline type operator &  (type  a, type b) { return     (type)((int)a & (int)b); } \
@@ -104,20 +104,55 @@ typedef ir_node *uninitialized_local_variable_func_t(ir_graph *irg, ir_mode *mod
                static inline type operator |= (type& a, type b) { return a = (type)((int)a | (int)b); } \
        }
 #else
-#      define ENUM_BITSET(type)
+# define ENUM_BITSET(type)
 #endif
 
 #ifdef __cplusplus
-#      define ENUM_COUNTABLE(type) \
+# define ENUM_COUNTABLE(type) \
        extern "C++" { \
                static inline type operator ++(type& a) { return a = (type)((int)a + 1); } \
                static inline type operator --(type& a) { return a = (type)((int)a - 1); } \
        }
 #else
-#      define ENUM_COUNTABLE(type)
+# define ENUM_COUNTABLE(type)
 #endif
 
+/**
+ * Relations for comparing numbers
+ */
+typedef enum ir_relation {
+       ir_relation_false              = 0,       /**< always false */
+       ir_relation_equal              = 1u << 0, /**< equal */
+       ir_relation_less               = 1u << 1, /**< less */
+       ir_relation_greater            = 1u << 2, /**< greater */
+       ir_relation_unordered          = 1u << 3, /**< unordered */
+       ir_relation_less_equal         = ir_relation_equal|ir_relation_less,    /**< less or equal */
+       ir_relation_greater_equal      = ir_relation_equal|ir_relation_greater, /**< greater or equal */
+       ir_relation_less_greater       = ir_relation_less|ir_relation_greater,  /** less or greater ('not equal' for integer numbers) */
+       ir_relation_less_equal_greater = ir_relation_equal|ir_relation_less|ir_relation_greater, /**< less equal or greater ('not unordered') */
+       ir_relation_unordered_equal    = ir_relation_unordered|ir_relation_equal, /**< unordered or equal */
+       ir_relation_unordered_less     = ir_relation_unordered|ir_relation_less,  /**< unordered or less */
+       ir_relation_unordered_less_equal = ir_relation_unordered|ir_relation_less|ir_relation_equal, /**< unordered, less or equal */
+       ir_relation_unordered_greater    = ir_relation_unordered|ir_relation_greater, /**< unordered or greater */
+       ir_relation_unordered_greater_equal = ir_relation_unordered|ir_relation_greater|ir_relation_equal, /**< unordered, greater or equal */
+       ir_relation_unordered_less_greater  = ir_relation_unordered|ir_relation_less|ir_relation_greater, /**< unordered, less or greater ('not equal' for floatingpoint numbers) */
+       ir_relation_true                    = ir_relation_equal|ir_relation_less|ir_relation_greater|ir_relation_unordered, /**< always true */
+} ir_relation;
+ENUM_BITSET(ir_relation)
 
+/**
+ * constrained flags for memory operations.
+ */
+typedef enum ir_cons_flags {
+       cons_none             = 0,        /**< No constrains. */
+       cons_volatile         = 1U << 0,  /**< Memory operation is volatile. */
+       cons_unaligned        = 1U << 1,  /**< Memory operation is unaligned. */
+       cons_floats           = 1U << 2,  /**< Memory operation can float. */
+       cons_throws_exception = 1U << 3,  /**< fragile op throws exception (and
+                                              produces X_regular and X_except
+                                              values) */
+} ir_cons_flags;
+ENUM_BITSET(ir_cons_flags)
 
 /** op_pin_state_pinned states. */
 typedef enum op_pin_state {
@@ -147,10 +182,17 @@ typedef enum mtp_additional_properties {
        mtp_no_property            = 0x00000000, /**< no additional properties, default */
        mtp_property_const         = 0x00000001, /**< This method did not access memory and calculates
                                                      its return values solely from its parameters.
+                                                     The only observable effect of a const function must be its
+                                                     return value. So they must not exhibit infinite loops or wait
+                                                     for user input. The return value must not depend on any
+                                                     global variables/state.
                                                      GCC: __attribute__((const)). */
        mtp_property_pure          = 0x00000002, /**< This method did NOT write to memory and calculates
                                                      its return values solely from its parameters and
                                                      the memory they points to (or global vars).
+                                                     The only observable effect of a const function must be its
+                                                     return value. So they must not exhibit infinite loops or wait
+                                                     for user input.
                                                      GCC: __attribute__((pure)). */
        mtp_property_noreturn      = 0x00000004, /**< This method did not return due to an aborting system
                                                      call.
@@ -178,8 +220,6 @@ ENUM_BITSET(mtp_additional_properties)
  * SymConst.  The content of the attribute symconst_symbol depends on this tag.
  * Use the proper access routine after testing this flag. */
 typedef enum symconst_kind {
-       symconst_type_tag,    /**< The SymConst is a type tag for the given type.
-                                  symconst_symbol is type *. */
        symconst_type_size,   /**< The SymConst is the size of the given type.
                                   symconst_symbol is type *. */
        symconst_type_align,  /**< The SymConst is the alignment of the given type.
@@ -232,18 +272,9 @@ typedef enum ir_builtin_kind {
        ir_bk_inport,                 /**< in port */
        ir_bk_outport,                /**< out port */
        ir_bk_inner_trampoline,       /**< address of a trampoline for GCC inner functions */
+       ir_bk_last = ir_bk_inner_trampoline,
 } ir_builtin_kind;
 
-/**
- * Some projection numbers must be always equal to support automatic phi construction
- */
-enum pn_generic {
-       pn_Generic_M         = 0,  /**< The memory result. */
-       pn_Generic_X_regular = 1,  /**< Execution result if no exception occurred. */
-       pn_Generic_X_except  = 2,  /**< The control flow result branching to the exception handler */
-       pn_Generic_other     = 3   /**< First free projection number */
-};
-
 /**
  * Possible return values of value_classify().
  */
@@ -254,6 +285,22 @@ typedef enum ir_value_classify_sign {
                                              no signed zero exists or < 0 else */
 } ir_value_classify_sign;
 
+/**
+ * This enumeration flags the volatility of entities and Loads/Stores.
+ */
+typedef enum {
+       volatility_non_volatile,    /**< The entity is not volatile. Default. */
+       volatility_is_volatile      /**< The entity is volatile. */
+} ir_volatility;
+
+/**
+ * This enumeration flags the align of Loads/Stores.
+ */
+typedef enum {
+       align_is_aligned = 0, /**< The entity is aligned. Default */
+       align_non_aligned,    /**< The entity is not aligned. */
+} ir_align;
+
 #include "end.h"
 
 #endif