2 * Copyright (C) 1995-2010 University of Karlsruhe. All right reserved.
4 * This file is part of libFirm.
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.
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.
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
22 * @brief Definition of opaque firm types
23 * @author Michael Beck
26 #ifndef FIRM_COMMON_FIRM_TYPES_H
27 #define FIRM_COMMON_FIRM_TYPES_H
31 typedef unsigned long ir_visited_t;
32 typedef unsigned long ir_exc_region_t;
33 typedef unsigned long ir_label_t;
35 typedef struct dbg_info dbg_info, *dbg_info_ptr;
36 typedef struct type_dbg_info type_dbg_info, *type_dbg_info_ptr;
37 typedef struct ident ident, *ir_ident_ptr;
38 typedef struct ir_node ir_node, *ir_node_ptr;
39 typedef struct ir_op ir_op, *ir_op_ptr;
40 typedef struct ir_mode ir_mode, *ir_mode_ptr;
41 typedef struct ir_edge_t ir_edge_t, *ir_edge_ptr;
42 typedef struct ir_heights_t ir_heights_t;
43 typedef struct ir_tarval ir_tarval, *ir_tarval_ptr;
44 typedef struct ir_enum_const ir_enum_const, *ir_enum_const_ptr;
45 typedef struct ir_type ir_type, *ir_type_ptr;
46 typedef struct ir_graph ir_graph, *ir_graph_ptr;
47 typedef struct ir_prog ir_prog, *ir_prog_ptr;
48 typedef struct ir_loop ir_loop, *ir_loop_ptr;
49 typedef struct ir_region ir_region, *ir_region_ptr;
50 typedef struct ir_entity ir_entity, *ir_entity_ptr;
51 typedef struct ir_extblk ir_extblk, *ir_extblk_ptr;
52 typedef struct ir_exec_freq ir_exec_freq, *ir_exec_freq_ptr;
53 typedef struct ir_cdep ir_cdep, *ir_cdep_ptr;
54 typedef struct sn_entry *seqno_t;
55 typedef struct arch_irn_ops_t arch_irn_ops_t;
56 typedef struct ir_graph_pass_t ir_graph_pass_t;
57 typedef struct ir_prog_pass_t ir_prog_pass_t;
59 typedef struct ir_graph_pass_manager_t ir_graph_pass_manager_t;
60 typedef struct ir_prog_pass_manager_t ir_prog_pass_manager_t;
62 typedef union ir_initializer_t ir_initializer_t, *ir_initializer_ptr;
64 typedef void irg_walk_func(ir_node *, void *);
65 typedef void irg_reg_walk_func(ir_region *, void *);
68 * A switch table mapping integer numbers to proj-numbers of a Switch-node.
69 * Entries map a continuous range of integer numbers to a proj-number.
70 * There must never be two different entries matching the same integer number.
72 typedef struct ir_switch_table ir_switch_table;
74 /* Needed for MSVC to suppress warnings because it doest NOT handle const right. */
75 typedef const ir_node *ir_node_cnst_ptr;
80 * This function is called, whenever a local variable is used before definition
82 * @param irg the IR graph on which this happens
83 * @param mode the mode of the local var
84 * @param pos position chosen be the frontend for this variable (n_loc)
86 * @return a firm node of mode @p mode that initializes the var at position pos
90 * If this function is not set, FIRM will create a const node with tarval BAD.
91 * Use set_irg_loc_description()/get_irg_loc_description() to assign additional
92 * informations to local variables.
94 typedef ir_node *uninitialized_local_variable_func_t(ir_graph *irg, ir_mode *mode, int pos);
97 # define ENUM_BITSET(type) \
99 static inline type operator ~ (type a) { return (type)~(int)a; } \
100 static inline type operator & (type a, type b) { return (type)((int)a & (int)b); } \
101 static inline type operator &= (type& a, type b) { return a = (type)((int)a & (int)b); } \
102 static inline type operator ^ (type a, type b) { return (type)((int)a ^ (int)b); } \
103 static inline type operator ^= (type& a, type b) { return a = (type)((int)a ^ (int)b); } \
104 static inline type operator | (type a, type b) { return (type)((int)a | (int)b); } \
105 static inline type operator |= (type& a, type b) { return a = (type)((int)a | (int)b); } \
108 # define ENUM_BITSET(type)
112 # define ENUM_COUNTABLE(type) \
114 static inline type operator ++(type& a) { return a = (type)((int)a + 1); } \
115 static inline type operator --(type& a) { return a = (type)((int)a - 1); } \
118 # define ENUM_COUNTABLE(type)
122 * Relations for comparing numbers
124 typedef enum ir_relation {
125 ir_relation_false = 0, /**< always false */
126 ir_relation_equal = 1u << 0, /**< equal */
127 ir_relation_less = 1u << 1, /**< less */
128 ir_relation_greater = 1u << 2, /**< greater */
129 ir_relation_unordered = 1u << 3, /**< unordered */
130 ir_relation_less_equal = ir_relation_equal|ir_relation_less, /**< less or equal */
131 ir_relation_greater_equal = ir_relation_equal|ir_relation_greater, /**< greater or equal */
132 ir_relation_less_greater = ir_relation_less|ir_relation_greater, /** less or greater ('not equal' for integer numbers) */
133 ir_relation_less_equal_greater = ir_relation_equal|ir_relation_less|ir_relation_greater, /**< less equal or greater ('not unordered') */
134 ir_relation_unordered_equal = ir_relation_unordered|ir_relation_equal, /**< unordered or equal */
135 ir_relation_unordered_less = ir_relation_unordered|ir_relation_less, /**< unordered or less */
136 ir_relation_unordered_less_equal = ir_relation_unordered|ir_relation_less|ir_relation_equal, /**< unordered, less or equal */
137 ir_relation_unordered_greater = ir_relation_unordered|ir_relation_greater, /**< unordered or greater */
138 ir_relation_unordered_greater_equal = ir_relation_unordered|ir_relation_greater|ir_relation_equal, /**< unordered, greater or equal */
139 ir_relation_unordered_less_greater = ir_relation_unordered|ir_relation_less|ir_relation_greater, /**< unordered, less or greater ('not equal' for floatingpoint numbers) */
140 ir_relation_true = ir_relation_equal|ir_relation_less|ir_relation_greater|ir_relation_unordered, /**< always true */
142 ENUM_BITSET(ir_relation)
145 * constrained flags for memory operations.
147 typedef enum ir_cons_flags {
148 cons_none = 0, /**< No constrains. */
149 cons_volatile = 1U << 0, /**< Memory operation is volatile. */
150 cons_unaligned = 1U << 1, /**< Memory operation is unaligned. */
151 cons_floats = 1U << 2, /**< Memory operation can float. */
152 cons_throws_exception = 1U << 3, /**< fragile op throws exception (and
153 produces X_regular and X_except
156 ENUM_BITSET(ir_cons_flags)
158 /** op_pin_state_pinned states. */
159 typedef enum op_pin_state {
160 op_pin_state_floats = 0, /**< Nodes of this opcode can be placed in any basic block. */
161 op_pin_state_pinned = 1, /**< Nodes must remain in this basic block. */
162 op_pin_state_exc_pinned, /**< Node must be remain in this basic block if it can throw an
163 exception, else can float. Used internally. */
164 op_pin_state_mem_pinned /**< Node must be remain in this basic block if it can throw an
165 exception or uses memory, else can float. Used internally. */
169 * A type to express conditional jump predictions.
171 typedef enum cond_jmp_predicate {
172 COND_JMP_PRED_NONE, /**< No jump prediction. Default. */
173 COND_JMP_PRED_TRUE, /**< The True case is predicted. */
174 COND_JMP_PRED_FALSE /**< The False case is predicted. */
175 } cond_jmp_predicate;
178 * Additional method type properties:
179 * Tell about special properties of a method type. Some
180 * of these may be discovered by analyses.
182 typedef enum mtp_additional_properties {
183 mtp_no_property = 0x00000000, /**< no additional properties, default */
184 mtp_property_const = 0x00000001, /**< This method did not access memory and calculates
185 its return values solely from its parameters.
186 The only observable effect of a const function must be its
187 return value. So they must not exhibit infinite loops or wait
188 for user input. The return value must not depend on any
189 global variables/state.
190 GCC: __attribute__((const)). */
191 mtp_property_pure = 0x00000002, /**< This method did NOT write to memory and calculates
192 its return values solely from its parameters and
193 the memory they points to (or global vars).
194 The only observable effect of a const function must be its
195 return value. So they must not exhibit infinite loops or wait
197 GCC: __attribute__((pure)). */
198 mtp_property_noreturn = 0x00000004, /**< This method did not return due to an aborting system
200 GCC: __attribute__((noreturn)). */
201 mtp_property_nothrow = 0x00000008, /**< This method cannot throw an exception.
202 GCC: __attribute__((nothrow)). */
203 mtp_property_naked = 0x00000010, /**< This method is naked.
204 GCC: __attribute__((naked)). */
205 mtp_property_malloc = 0x00000020, /**< This method returns newly allocate memory.
206 GCC: __attribute__((malloc)). */
207 mtp_property_returns_twice = 0x00000040, /**< This method can return more than one (typically setjmp).
208 GCC: __attribute__((returns_twice)). */
209 mtp_property_intrinsic = 0x00000080, /**< This method is intrinsic. It is expected that
210 a lowering phase will remove all calls to it. */
211 mtp_property_runtime = 0x00000100, /**< This method represents a runtime routine. */
212 mtp_property_private = 0x00000200, /**< All method invocations are known, the backend is free to
213 optimize the call in any possible way. */
214 mtp_property_has_loop = 0x00000400, /**< Set, if this method contains one possible endless loop. */
215 mtp_property_inherited = (1<<31) /**< Internal. Used only in irg's, means property is
216 inherited from type. */
217 } mtp_additional_properties;
218 ENUM_BITSET(mtp_additional_properties)
220 /** This enum names the different kinds of symbolic Constants represented by
221 * SymConst. The content of the attribute symconst_symbol depends on this tag.
222 * Use the proper access routine after testing this flag. */
223 typedef enum symconst_kind {
224 symconst_type_tag, /**< The SymConst is a type tag for the given type.
225 symconst_symbol is type *. */
226 symconst_type_size, /**< The SymConst is the size of the given type.
227 symconst_symbol is type *. */
228 symconst_type_align, /**< The SymConst is the alignment of the given type.
229 symconst_symbol is type *. */
230 symconst_addr_ent, /**< The SymConst is a symbolic pointer to be filled in
231 by the linker. The pointer is represented by an entity.
232 symconst_symbol is entity *. */
233 symconst_ofs_ent, /**< The SymConst is the offset of its entity in the entities
235 symconst_enum_const /**< The SymConst is a enumeration constant of an
239 /** SymConst attribute.
241 * This union contains the symbolic information represented by the node.
243 typedef union symconst_symbol {
244 ir_type *type_p; /**< The type of a SymConst. */
245 ir_entity *entity_p; /**< The entity of a SymConst. */
246 ir_enum_const *enum_p; /**< The enumeration constant of a SymConst. */
249 /** The allocation place. */
250 typedef enum ir_where_alloc {
251 stack_alloc, /**< Alloc allocates the object on the stack. */
252 heap_alloc /**< Alloc allocates the object on the heap. */
255 /** A input/output constraint attribute. */
256 typedef struct ir_asm_constraint {
257 unsigned pos; /**< The inputs/output position for this constraint. */
258 ident *constraint; /**< The constraint for this input/output. */
259 ir_mode *mode; /**< The mode of the constraint. */
262 /** Supported libFirm builtins. */
263 typedef enum ir_builtin_kind {
264 ir_bk_trap, /**< GCC __builtin_trap(): insert trap */
265 ir_bk_debugbreak, /**< MS __debugbreak(): insert debug break */
266 ir_bk_return_address, /**< GCC __builtin_return_address() */
267 ir_bk_frame_address, /**< GCC __builtin_frame_address() */
268 ir_bk_prefetch, /**< GCC __builtin_prefetch() */
269 ir_bk_ffs, /**< GCC __builtin_ffs(): find first (least) significant 1 bit */
270 ir_bk_clz, /**< GCC __builtin_clz(): count leading zero */
271 ir_bk_ctz, /**< GCC __builtin_ctz(): count trailing zero */
272 ir_bk_popcount, /**< GCC __builtin_popcount(): population count */
273 ir_bk_parity, /**< GCC __builtin_parity(): parity */
274 ir_bk_bswap, /**< byte swap */
275 ir_bk_inport, /**< in port */
276 ir_bk_outport, /**< out port */
277 ir_bk_inner_trampoline, /**< address of a trampoline for GCC inner functions */
278 ir_bk_last = ir_bk_inner_trampoline,
282 * Possible return values of value_classify().
284 typedef enum ir_value_classify_sign {
285 value_classified_unknown = 0, /**< could not classify */
286 value_classified_positive = 1, /**< value is positive, i.e. >= 0 */
287 value_classified_negative = -1 /**< value is negative, i.e. <= 0 if
288 no signed zero exists or < 0 else */
289 } ir_value_classify_sign;
292 * This enumeration flags the volatility of entities and Loads/Stores.
295 volatility_non_volatile, /**< The entity is not volatile. Default. */
296 volatility_is_volatile /**< The entity is volatile. */
300 * This enumeration flags the align of Loads/Stores.
303 align_is_aligned = 0, /**< The entity is aligned. Default */
304 align_non_aligned, /**< The entity is not aligned. */