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
25 #ifndef FIRM_COMMON_FIRM_TYPES_H
26 #define FIRM_COMMON_FIRM_TYPES_H
31 * @page visited_counters Visited Counters
32 * A visited counter is an alternative to a visited flag for elements of a
33 * graph datastructure.
34 * A visited counter is an integer number added to the elements of a graph.
35 * There is also a global reference number for the whole datastructure. It is
36 * now possible to mark nodes by setting their visited counter to the global
37 * reference counter. Testing is done by comparing with the global reference
39 * The advantage to simple boolean flag variables is that you can clear all
40 * element marks by increasing the global reference counter and don't need to
41 * visit the whole structure.
42 * This makes it more efficient when you only visit/mark a small amount of
46 /** Type for visited counters
47 * @see visited_counters */
48 typedef unsigned long ir_visited_t;
49 /** A label in the code (usually attached to a @ref Block) */
50 typedef unsigned long ir_label_t;
54 typedef struct dbg_info dbg_info;
56 * Source Type Reference */
57 typedef struct type_dbg_info type_dbg_info;
60 typedef struct ident ident;
62 * Procedure Graph Node */
63 typedef struct ir_node ir_node;
66 typedef struct ir_op ir_op;
69 typedef struct ir_mode ir_mode;
71 * Dynamic Reverse Edge */
72 typedef struct ir_edge_t ir_edge_t;
73 /** @ingroup ir_heights
74 * Computed graph Heights */
75 typedef struct ir_heights_t ir_heights_t;
76 /** @ingroup ir_tarval
77 * Target Machine Value */
78 typedef struct ir_tarval ir_tarval;
79 /** @ingroup enumeration_type
80 * Enumeration constant */
81 typedef struct ir_enum_const ir_enum_const;
84 typedef struct ir_type ir_type;
87 typedef struct ir_graph ir_graph;
90 typedef struct ir_prog ir_prog;
93 typedef struct ir_loop ir_loop;
94 /** @ingroup ir_entity
96 typedef struct ir_entity ir_entity;
98 * Execution Frequency Analysis Results */
99 typedef struct ir_exec_freq ir_exec_freq;
101 * Control Dependence Analysis Results */
102 typedef struct ir_cdep ir_cdep;
104 * Target Architecture specific node operations */
105 typedef struct arch_irn_ops_t arch_irn_ops_t;
106 /** A graph transformation pass */
107 typedef struct ir_graph_pass_t ir_graph_pass_t;
108 /** A whole program transformation pass */
109 typedef struct ir_prog_pass_t ir_prog_pass_t;
111 /** A graph pass manager */
112 typedef struct ir_graph_pass_manager_t ir_graph_pass_manager_t;
113 /** A program pass manager */
114 typedef struct ir_prog_pass_manager_t ir_prog_pass_manager_t;
116 /** @ingroup ir_initializer
117 * Initializer (for entities) */
118 typedef union ir_initializer_t ir_initializer_t;
122 * type for graph-walk callbacks */
123 typedef void irg_walk_func(ir_node *, void *);
127 * A switch table mapping integer numbers to proj-numbers of a Switch-node.
128 * Entries map a continuous range of integer numbers to a proj-number.
129 * There must never be two different entries matching the same integer number.
131 typedef struct ir_switch_table ir_switch_table;
135 * This function is called, whenever a local variable is used before definition
137 * @param irg the IR graph on which this happens
138 * @param mode the mode of the local var
139 * @param pos position chosen be the frontend for this variable (n_loc)
141 * @return a firm node of mode @p mode that initializes the var at position pos
144 * Do not return NULL!
145 * If this function is not set, FIRM will create a const node with tarval BAD.
146 * Use set_irg_loc_description()/get_irg_loc_description() to assign additional
147 * informations to local variables.
149 typedef ir_node *uninitialized_local_variable_func_t(ir_graph *irg, ir_mode *mode, int pos);
152 # define ENUM_BITSET(type) \
154 static inline type operator ~ (type a) { return (type)~(int)a; } \
155 static inline type operator & (type a, type b) { return (type)((int)a & (int)b); } \
156 static inline type operator &= (type& a, type b) { return a = (type)((int)a & (int)b); } \
157 static inline type operator ^ (type a, type b) { return (type)((int)a ^ (int)b); } \
158 static inline type operator ^= (type& a, type b) { return a = (type)((int)a ^ (int)b); } \
159 static inline type operator | (type a, type b) { return (type)((int)a | (int)b); } \
160 static inline type operator |= (type& a, type b) { return a = (type)((int)a | (int)b); } \
163 /** Marks an enum type as bitset enum. That is the enumeration values will
164 * probably be combined to form a (bit)set of flags.
165 * When compiling for C++ this macro will define the ~, &, &=, ^, ^=, | and |=
166 * operators for the enum values. */
167 # define ENUM_BITSET(type)
171 # define ENUM_COUNTABLE(type) \
173 static inline type operator ++(type& a) { return a = (type)((int)a + 1); } \
174 static inline type operator --(type& a) { return a = (type)((int)a - 1); } \
177 /** Marks an enum type as countable enum. The enumeration values will be a
178 * linear sequence of numbers which can be iterated through by incrementing
180 * When compiling for C++ this macro will define the ++ and -- operators. */
181 # define ENUM_COUNTABLE(type)
186 * Relations for comparing numbers
188 typedef enum ir_relation {
189 ir_relation_false = 0, /**< always false */
190 ir_relation_equal = 1u << 0, /**< equal */
191 ir_relation_less = 1u << 1, /**< less */
192 ir_relation_greater = 1u << 2, /**< greater */
193 ir_relation_unordered = 1u << 3, /**< unordered */
194 ir_relation_less_equal = ir_relation_equal|ir_relation_less, /**< less or equal */
195 ir_relation_greater_equal = ir_relation_equal|ir_relation_greater, /**< greater or equal */
196 ir_relation_less_greater = ir_relation_less|ir_relation_greater, /** less or greater ('not equal' for integer numbers) */
197 ir_relation_less_equal_greater = ir_relation_equal|ir_relation_less|ir_relation_greater, /**< less equal or greater ('not unordered') */
198 ir_relation_unordered_equal = ir_relation_unordered|ir_relation_equal, /**< unordered or equal */
199 ir_relation_unordered_less = ir_relation_unordered|ir_relation_less, /**< unordered or less */
200 ir_relation_unordered_less_equal = ir_relation_unordered|ir_relation_less|ir_relation_equal, /**< unordered, less or equal */
201 ir_relation_unordered_greater = ir_relation_unordered|ir_relation_greater, /**< unordered or greater */
202 ir_relation_unordered_greater_equal = ir_relation_unordered|ir_relation_greater|ir_relation_equal, /**< unordered, greater or equal */
203 ir_relation_unordered_less_greater = ir_relation_unordered|ir_relation_less|ir_relation_greater, /**< unordered, less or greater ('not equal' for floatingpoint numbers) */
204 ir_relation_true = ir_relation_equal|ir_relation_less|ir_relation_greater|ir_relation_unordered, /**< always true */
206 ENUM_BITSET(ir_relation)
210 * constrained flags for memory operations.
212 typedef enum ir_cons_flags {
213 cons_none = 0, /**< No constrains. */
214 cons_volatile = 1U << 0, /**< Memory operation is volatile. */
215 cons_unaligned = 1U << 1, /**< Memory operation is unaligned. */
216 cons_floats = 1U << 2, /**< Memory operation can float. */
217 cons_throws_exception = 1U << 3, /**< fragile op throws exception (and
218 produces X_regular and X_except
221 ENUM_BITSET(ir_cons_flags)
227 typedef enum op_pin_state {
228 op_pin_state_floats = 0, /**< Nodes of this opcode can be placed in any basic block. */
229 op_pin_state_pinned = 1, /**< Nodes must remain in this basic block. */
230 op_pin_state_exc_pinned, /**< Node must be remain in this basic block if it can throw an
231 exception, else can float. Used internally. */
232 op_pin_state_mem_pinned /**< Node must be remain in this basic block if it can throw an
233 exception or uses memory, else can float. Used internally. */
238 * A type to express conditional jump predictions.
240 typedef enum cond_jmp_predicate {
241 COND_JMP_PRED_NONE, /**< No jump prediction. Default. */
242 COND_JMP_PRED_TRUE, /**< The True case is predicted. */
243 COND_JMP_PRED_FALSE /**< The False case is predicted. */
244 } cond_jmp_predicate;
247 * @ingroup method_type
248 * Additional method type properties:
249 * Tell about special properties of a method type. Some
250 * of these may be discovered by analyses.
252 typedef enum mtp_additional_properties {
253 mtp_no_property = 0x00000000, /**< no additional properties, default */
254 mtp_property_const = 0x00000001, /**< This method did not access memory and calculates
255 its return values solely from its parameters.
256 The only observable effect of a const function must be its
257 return value. So they must not exhibit infinite loops or wait
258 for user input. The return value must not depend on any
259 global variables/state.
260 GCC: __attribute__((const)). */
261 mtp_property_pure = 0x00000002, /**< This method did NOT write to memory and calculates
262 its return values solely from its parameters and
263 the memory they points to (or global vars).
264 The only observable effect of a const function must be its
265 return value. So they must not exhibit infinite loops or wait
267 GCC: __attribute__((pure)). */
268 mtp_property_noreturn = 0x00000004, /**< This method did not return due to an aborting system
270 GCC: __attribute__((noreturn)). */
271 mtp_property_nothrow = 0x00000008, /**< This method cannot throw an exception.
272 GCC: __attribute__((nothrow)). */
273 mtp_property_naked = 0x00000010, /**< This method is naked.
274 GCC: __attribute__((naked)). */
275 mtp_property_malloc = 0x00000020, /**< This method returns newly allocate memory.
276 GCC: __attribute__((malloc)). */
277 mtp_property_returns_twice = 0x00000040, /**< This method can return more than one (typically setjmp).
278 GCC: __attribute__((returns_twice)). */
279 mtp_property_intrinsic = 0x00000080, /**< This method is intrinsic. It is expected that
280 a lowering phase will remove all calls to it. */
281 mtp_property_runtime = 0x00000100, /**< This method represents a runtime routine. */
282 mtp_property_private = 0x00000200, /**< All method invocations are known, the backend is free to
283 optimize the call in any possible way. */
284 mtp_property_has_loop = 0x00000400, /**< Set, if this method contains one possible endless loop. */
285 mtp_property_inherited = (1<<31) /**< Internal. Used only in irg's, means property is
286 inherited from type. */
287 } mtp_additional_properties;
288 ENUM_BITSET(mtp_additional_properties)
292 * This enum names the different kinds of symbolic Constants represented by
293 * SymConst. The content of the attribute symconst_symbol depends on this tag.
294 * Use the proper access routine after testing this flag.
296 typedef enum symconst_kind {
297 symconst_type_size, /**< The SymConst is the size of the given type.
298 symconst_symbol is type *. */
299 symconst_type_align, /**< The SymConst is the alignment of the given type.
300 symconst_symbol is type *. */
301 symconst_addr_ent, /**< The SymConst is a symbolic pointer to be filled in
302 by the linker. The pointer is represented by an entity.
303 symconst_symbol is entity *. */
304 symconst_ofs_ent, /**< The SymConst is the offset of its entity in the entities
306 symconst_enum_const /**< The SymConst is a enumeration constant of an
312 * SymConst attribute.
314 * This union contains the symbolic information represented by the node.
317 typedef union symconst_symbol {
318 ir_type *type_p; /**< The type of a SymConst. */
319 ir_entity *entity_p; /**< The entity of a SymConst. */
320 ir_enum_const *enum_p; /**< The enumeration constant of a SymConst. */
325 * The allocation place.
327 typedef enum ir_where_alloc {
328 stack_alloc, /**< Alloc allocates the object on the stack. */
329 heap_alloc /**< Alloc allocates the object on the heap. */
332 /** A input/output constraint attribute.
335 typedef struct ir_asm_constraint {
336 unsigned pos; /**< The inputs/output position for this constraint. */
337 ident *constraint; /**< The constraint for this input/output. */
338 ir_mode *mode; /**< The mode of the constraint. */
341 /** Supported libFirm builtins.
344 typedef enum ir_builtin_kind {
345 ir_bk_trap, /**< GCC __builtin_trap(): insert trap */
346 ir_bk_debugbreak, /**< MS __debugbreak(): insert debug break */
347 ir_bk_return_address, /**< GCC __builtin_return_address() */
348 ir_bk_frame_address, /**< GCC __builtin_frame_address() */
349 ir_bk_prefetch, /**< GCC __builtin_prefetch() */
350 ir_bk_ffs, /**< GCC __builtin_ffs(): find first (least) significant 1 bit */
351 ir_bk_clz, /**< GCC __builtin_clz(): count leading zero */
352 ir_bk_ctz, /**< GCC __builtin_ctz(): count trailing zero */
353 ir_bk_popcount, /**< GCC __builtin_popcount(): population count */
354 ir_bk_parity, /**< GCC __builtin_parity(): parity */
355 ir_bk_bswap, /**< byte swap */
356 ir_bk_inport, /**< in port */
357 ir_bk_outport, /**< out port */
358 ir_bk_inner_trampoline, /**< address of a trampoline for GCC inner functions */
359 ir_bk_last = ir_bk_inner_trampoline,
363 * Possible return values of value_classify().
365 typedef enum ir_value_classify_sign {
366 value_classified_unknown = 0, /**< could not classify */
367 value_classified_positive = 1, /**< value is positive, i.e. >= 0 */
368 value_classified_negative = -1 /**< value is negative, i.e. <= 0 if
369 no signed zero exists or < 0 else */
370 } ir_value_classify_sign;
373 * This enumeration flags the volatility of entities and Loads/Stores.
376 volatility_non_volatile, /**< The entity is not volatile. Default. */
377 volatility_is_volatile /**< The entity is volatile. */
381 * This enumeration flags the align of Loads/Stores.
384 align_is_aligned = 0, /**< The entity is aligned. Default */
385 align_non_aligned, /**< The entity is not aligned. */