add documentation make target, fix docu bugs
[libfirm] / include / libfirm / firm_types.h
1 /*
2  * Copyright (C) 1995-2010 University of Karlsruhe.  All right reserved.
3  *
4  * This file is part of libFirm.
5  *
6  * This file may be distributed and/or modified under the terms of the
7  * GNU General Public License version 2 as published by the Free Software
8  * Foundation and appearing in the file LICENSE.GPL included in the
9  * packaging of this file.
10  *
11  * Licensees holding valid libFirm Professional Edition licenses may use
12  * this file in accordance with the libFirm Commercial License.
13  * Agreement provided with the Software.
14  *
15  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE.
18  */
19
20 /**
21  * @file
22  * @brief      Definition of opaque firm types
23  * @author     Michael Beck
24  */
25 #ifndef FIRM_COMMON_FIRM_TYPES_H
26 #define FIRM_COMMON_FIRM_TYPES_H
27
28 #include "begin.h"
29
30 typedef unsigned long ir_visited_t;
31 typedef unsigned long ir_exc_region_t;
32 typedef unsigned long ir_label_t;
33
34 /** @ingroup dbg_info */
35 typedef struct dbg_info             dbg_info,            *dbg_info_ptr;
36 /** @ingroup dbg_info */
37 typedef struct type_dbg_info        type_dbg_info,       *type_dbg_info_ptr;
38 /** @ingroup ir_ident */
39 typedef struct ident                ident,               *ir_ident_ptr;
40 /** @ingroup ir_node */
41 typedef struct ir_node              ir_node,             *ir_node_ptr;
42 /** @ingroup ir_op */
43 typedef struct ir_op                ir_op,               *ir_op_ptr;
44 /** @ingroup ir_mode */
45 typedef struct ir_mode              ir_mode,             *ir_mode_ptr;
46 /** @ingroup iredges */
47 typedef struct ir_edge_t            ir_edge_t,           *ir_edge_ptr;
48 /** @ingroup ir_heights */
49 typedef struct ir_heights_t         ir_heights_t;
50 /** @ingroup ir_tarval */
51 typedef struct ir_tarval            ir_tarval,           *ir_tarval_ptr;
52 typedef struct ir_enum_const        ir_enum_const,       *ir_enum_const_ptr;
53 /** @ingroup ir_type */
54 typedef struct ir_type              ir_type,             *ir_type_ptr;
55 /** @ingroup ir_graph */
56 typedef struct ir_graph             ir_graph,            *ir_graph_ptr;
57 /** @ingroup ir_prog */
58 typedef struct ir_prog              ir_prog,             *ir_prog_ptr;
59 /** @ingroup ir_loop */
60 typedef struct ir_loop              ir_loop,             *ir_loop_ptr;
61 typedef struct ir_region            ir_region,           *ir_region_ptr;
62 /** @ingroup ir_entity */
63 typedef struct ir_entity            ir_entity,           *ir_entity_ptr;
64 typedef struct ir_extblk            ir_extblk,           *ir_extblk_ptr;
65 /** @ingroup execfreq */
66 typedef struct ir_exec_freq         ir_exec_freq,        *ir_exec_freq_ptr;
67 /** @ingroup ir_cdep */
68 typedef struct ir_cdep              ir_cdep,             *ir_cdep_ptr;
69 typedef struct sn_entry             *seqno_t;
70 /** @ingroup ir_op */
71 typedef struct arch_irn_ops_t       arch_irn_ops_t;
72 typedef struct ir_graph_pass_t      ir_graph_pass_t;
73 typedef struct ir_prog_pass_t       ir_prog_pass_t;
74
75 typedef struct ir_graph_pass_manager_t      ir_graph_pass_manager_t;
76 typedef struct ir_prog_pass_manager_t       ir_prog_pass_manager_t;
77
78 /** @ingroup ir_initializer */
79 typedef union  ir_initializer_t     ir_initializer_t,    *ir_initializer_ptr;
80
81 typedef void irg_walk_func(ir_node *, void *);
82 typedef void irg_reg_walk_func(ir_region *, void *);
83
84 /**
85  * A switch table mapping integer numbers to proj-numbers of a Switch-node.
86  * Entries map a continuous range of integer numbers to a proj-number.
87  * There must never be two different entries matching the same integer number.
88  */
89 typedef struct ir_switch_table  ir_switch_table;
90
91 /* Needed for MSVC to suppress warnings because it doest NOT handle const right. */
92 typedef const ir_node *ir_node_cnst_ptr;
93
94 /* states */
95
96 /**
97  * This function is called, whenever a local variable is used before definition
98  *
99  * @param irg       the IR graph on which this happens
100  * @param mode      the mode of the local var
101  * @param pos       position chosen be the frontend for this variable (n_loc)
102  *
103  * @return a firm node of mode @p mode that initializes the var at position pos
104  *
105  * @note
106  *      Do not return NULL!
107  *      If this function is not set, FIRM will create a const node with tarval BAD.
108  *      Use set_irg_loc_description()/get_irg_loc_description() to assign additional
109  *      informations to local variables.
110  */
111 typedef ir_node *uninitialized_local_variable_func_t(ir_graph *irg, ir_mode *mode, int pos);
112
113 #ifdef __cplusplus
114 # define ENUM_BITSET(type) \
115         extern "C++" { \
116                 static inline type operator ~  (type  a)         { return     (type)~(int)a;           } \
117                 static inline type operator &  (type  a, type b) { return     (type)((int)a & (int)b); } \
118                 static inline type operator &= (type& a, type b) { return a = (type)((int)a & (int)b); } \
119                 static inline type operator ^  (type  a, type b) { return     (type)((int)a ^ (int)b); } \
120                 static inline type operator ^= (type& a, type b) { return a = (type)((int)a ^ (int)b); } \
121                 static inline type operator |  (type  a, type b) { return     (type)((int)a | (int)b); } \
122                 static inline type operator |= (type& a, type b) { return a = (type)((int)a | (int)b); } \
123         }
124 #else
125 # define ENUM_BITSET(type)
126 #endif
127
128 #ifdef __cplusplus
129 # define ENUM_COUNTABLE(type) \
130         extern "C++" { \
131                 static inline type operator ++(type& a) { return a = (type)((int)a + 1); } \
132                 static inline type operator --(type& a) { return a = (type)((int)a - 1); } \
133         }
134 #else
135 # define ENUM_COUNTABLE(type)
136 #endif
137
138 /**
139  * Relations for comparing numbers
140  */
141 typedef enum ir_relation {
142         ir_relation_false              = 0,       /**< always false */
143         ir_relation_equal              = 1u << 0, /**< equal */
144         ir_relation_less               = 1u << 1, /**< less */
145         ir_relation_greater            = 1u << 2, /**< greater */
146         ir_relation_unordered          = 1u << 3, /**< unordered */
147         ir_relation_less_equal         = ir_relation_equal|ir_relation_less,    /**< less or equal */
148         ir_relation_greater_equal      = ir_relation_equal|ir_relation_greater, /**< greater or equal */
149         ir_relation_less_greater       = ir_relation_less|ir_relation_greater,  /** less or greater ('not equal' for integer numbers) */
150         ir_relation_less_equal_greater = ir_relation_equal|ir_relation_less|ir_relation_greater, /**< less equal or greater ('not unordered') */
151         ir_relation_unordered_equal    = ir_relation_unordered|ir_relation_equal, /**< unordered or equal */
152         ir_relation_unordered_less     = ir_relation_unordered|ir_relation_less,  /**< unordered or less */
153         ir_relation_unordered_less_equal = ir_relation_unordered|ir_relation_less|ir_relation_equal, /**< unordered, less or equal */
154         ir_relation_unordered_greater    = ir_relation_unordered|ir_relation_greater, /**< unordered or greater */
155         ir_relation_unordered_greater_equal = ir_relation_unordered|ir_relation_greater|ir_relation_equal, /**< unordered, greater or equal */
156         ir_relation_unordered_less_greater  = ir_relation_unordered|ir_relation_less|ir_relation_greater, /**< unordered, less or greater ('not equal' for floatingpoint numbers) */
157         ir_relation_true                    = ir_relation_equal|ir_relation_less|ir_relation_greater|ir_relation_unordered, /**< always true */
158 } ir_relation;
159 ENUM_BITSET(ir_relation)
160
161 /**
162  * constrained flags for memory operations.
163  */
164 typedef enum ir_cons_flags {
165         cons_none             = 0,        /**< No constrains. */
166         cons_volatile         = 1U << 0,  /**< Memory operation is volatile. */
167         cons_unaligned        = 1U << 1,  /**< Memory operation is unaligned. */
168         cons_floats           = 1U << 2,  /**< Memory operation can float. */
169         cons_throws_exception = 1U << 3,  /**< fragile op throws exception (and
170                                                produces X_regular and X_except
171                                                values) */
172 } ir_cons_flags;
173 ENUM_BITSET(ir_cons_flags)
174
175 /** op_pin_state_pinned states. */
176 typedef enum op_pin_state {
177         op_pin_state_floats = 0,    /**< Nodes of this opcode can be placed in any basic block. */
178         op_pin_state_pinned = 1,    /**< Nodes must remain in this basic block. */
179         op_pin_state_exc_pinned,    /**< Node must be remain in this basic block if it can throw an
180                                          exception, else can float. Used internally. */
181         op_pin_state_mem_pinned     /**< Node must be remain in this basic block if it can throw an
182                                          exception or uses memory, else can float. Used internally. */
183 } op_pin_state;
184
185 /**
186  * A type to express conditional jump predictions.
187  */
188 typedef enum cond_jmp_predicate {
189         COND_JMP_PRED_NONE,        /**< No jump prediction. Default. */
190         COND_JMP_PRED_TRUE,        /**< The True case is predicted. */
191         COND_JMP_PRED_FALSE        /**< The False case is predicted. */
192 } cond_jmp_predicate;
193
194 /**
195  * Additional method type properties:
196  * Tell about special properties of a method type. Some
197  * of these may be discovered by analyses.
198  */
199 typedef enum mtp_additional_properties {
200         mtp_no_property            = 0x00000000, /**< no additional properties, default */
201         mtp_property_const         = 0x00000001, /**< This method did not access memory and calculates
202                                                       its return values solely from its parameters.
203                                                       The only observable effect of a const function must be its
204                                                       return value. So they must not exhibit infinite loops or wait
205                                                       for user input. The return value must not depend on any
206                                                       global variables/state.
207                                                       GCC: __attribute__((const)). */
208         mtp_property_pure          = 0x00000002, /**< This method did NOT write to memory and calculates
209                                                       its return values solely from its parameters and
210                                                       the memory they points to (or global vars).
211                                                       The only observable effect of a const function must be its
212                                                       return value. So they must not exhibit infinite loops or wait
213                                                       for user input.
214                                                       GCC: __attribute__((pure)). */
215         mtp_property_noreturn      = 0x00000004, /**< This method did not return due to an aborting system
216                                                       call.
217                                                       GCC: __attribute__((noreturn)). */
218         mtp_property_nothrow       = 0x00000008, /**< This method cannot throw an exception.
219                                                       GCC: __attribute__((nothrow)). */
220         mtp_property_naked         = 0x00000010, /**< This method is naked.
221                                                       GCC: __attribute__((naked)). */
222         mtp_property_malloc        = 0x00000020, /**< This method returns newly allocate memory.
223                                                       GCC: __attribute__((malloc)). */
224         mtp_property_returns_twice = 0x00000040, /**< This method can return more than one (typically setjmp).
225                                                   GCC: __attribute__((returns_twice)). */
226         mtp_property_intrinsic     = 0x00000080, /**< This method is intrinsic. It is expected that
227                                                       a lowering phase will remove all calls to it. */
228         mtp_property_runtime       = 0x00000100, /**< This method represents a runtime routine. */
229         mtp_property_private       = 0x00000200, /**< All method invocations are known, the backend is free to
230                                                       optimize the call in any possible way. */
231         mtp_property_has_loop      = 0x00000400, /**< Set, if this method contains one possible endless loop. */
232         mtp_property_inherited     = (1<<31)     /**< Internal. Used only in irg's, means property is
233                                                       inherited from type. */
234 } mtp_additional_properties;
235 ENUM_BITSET(mtp_additional_properties)
236
237 /**  This enum names the different kinds of symbolic Constants represented by
238  * SymConst.  The content of the attribute symconst_symbol depends on this tag.
239  * Use the proper access routine after testing this flag. */
240 typedef enum symconst_kind {
241         symconst_type_size,   /**< The SymConst is the size of the given type.
242                                    symconst_symbol is type *. */
243         symconst_type_align,  /**< The SymConst is the alignment of the given type.
244                                    symconst_symbol is type *. */
245         symconst_addr_ent,    /**< The SymConst is a symbolic pointer to be filled in
246                                    by the linker.  The pointer is represented by an entity.
247                                    symconst_symbol is entity *. */
248         symconst_ofs_ent,     /**< The SymConst is the offset of its entity in the entities
249                                    owner type. */
250         symconst_enum_const   /**< The SymConst is a enumeration constant of an
251                                    enumeration type. */
252 } symconst_kind;
253
254 /** SymConst attribute.
255  *
256  *  This union contains the symbolic information represented by the node.
257  *  @ingroup SymConst
258  */
259 typedef union symconst_symbol {
260         ir_type       *type_p;    /**< The type of a SymConst. */
261         ir_entity     *entity_p;  /**< The entity of a SymConst. */
262         ir_enum_const *enum_p;    /**< The enumeration constant of a SymConst. */
263 } symconst_symbol;
264
265 /** The allocation place.
266  * @ingroup Alloc
267  */
268 typedef enum ir_where_alloc {
269         stack_alloc,          /**< Alloc allocates the object on the stack. */
270         heap_alloc            /**< Alloc allocates the object on the heap. */
271 } ir_where_alloc;
272
273 /** A input/output constraint attribute.
274  * @ingroup ASM
275  */
276 typedef struct ir_asm_constraint {
277         unsigned       pos;           /**< The inputs/output position for this constraint. */
278         ident          *constraint;   /**< The constraint for this input/output. */
279         ir_mode        *mode;         /**< The mode of the constraint. */
280 } ir_asm_constraint;
281
282 /** Supported libFirm builtins.
283  * @ingroup Builtin
284  */
285 typedef enum ir_builtin_kind {
286         ir_bk_trap,                   /**< GCC __builtin_trap(): insert trap */
287         ir_bk_debugbreak,             /**< MS __debugbreak(): insert debug break */
288         ir_bk_return_address,         /**< GCC __builtin_return_address() */
289         ir_bk_frame_address,          /**< GCC __builtin_frame_address() */
290         ir_bk_prefetch,               /**< GCC __builtin_prefetch() */
291         ir_bk_ffs,                    /**< GCC __builtin_ffs(): find first (least) significant 1 bit */
292         ir_bk_clz,                    /**< GCC __builtin_clz(): count leading zero */
293         ir_bk_ctz,                    /**< GCC __builtin_ctz(): count trailing zero */
294         ir_bk_popcount,               /**< GCC __builtin_popcount(): population count */
295         ir_bk_parity,                 /**< GCC __builtin_parity(): parity */
296         ir_bk_bswap,                  /**< byte swap */
297         ir_bk_inport,                 /**< in port */
298         ir_bk_outport,                /**< out port */
299         ir_bk_inner_trampoline,       /**< address of a trampoline for GCC inner functions */
300         ir_bk_last = ir_bk_inner_trampoline,
301 } ir_builtin_kind;
302
303 /**
304  * Possible return values of value_classify().
305  */
306 typedef enum ir_value_classify_sign {
307         value_classified_unknown  = 0,   /**< could not classify */
308         value_classified_positive = 1,   /**< value is positive, i.e. >= 0 */
309         value_classified_negative = -1   /**< value is negative, i.e. <= 0 if
310                                               no signed zero exists or < 0 else */
311 } ir_value_classify_sign;
312
313 /**
314  * This enumeration flags the volatility of entities and Loads/Stores.
315  */
316 typedef enum {
317         volatility_non_volatile,    /**< The entity is not volatile. Default. */
318         volatility_is_volatile      /**< The entity is volatile. */
319 } ir_volatility;
320
321 /**
322  * This enumeration flags the align of Loads/Stores.
323  */
324 typedef enum {
325         align_is_aligned = 0, /**< The entity is aligned. Default */
326         align_non_aligned,    /**< The entity is not aligned. */
327 } ir_align;
328
329 #include "end.h"
330
331 #endif