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 * Control Dependence Analysis Results */
99 typedef struct ir_cdep ir_cdep;
101 * Target Architecture specific node operations */
102 typedef struct arch_irn_ops_t arch_irn_ops_t;
103 /** A graph transformation pass */
104 typedef struct ir_graph_pass_t ir_graph_pass_t;
105 /** A whole program transformation pass */
106 typedef struct ir_prog_pass_t ir_prog_pass_t;
108 /** A graph pass manager */
109 typedef struct ir_graph_pass_manager_t ir_graph_pass_manager_t;
110 /** A program pass manager */
111 typedef struct ir_prog_pass_manager_t ir_prog_pass_manager_t;
113 /** @ingroup ir_initializer
114 * Initializer (for entities) */
115 typedef union ir_initializer_t ir_initializer_t;
119 * type for graph-walk callbacks */
120 typedef void irg_walk_func(ir_node *, void *);
124 * A switch table mapping integer numbers to proj-numbers of a Switch-node.
125 * Entries map a continuous range of integer numbers to a proj-number.
126 * There must never be two different entries matching the same integer number.
128 typedef struct ir_switch_table ir_switch_table;
132 * This function is called, whenever a local variable is used before definition
134 * @param irg the IR graph on which this happens
135 * @param mode the mode of the local var
136 * @param pos position chosen be the frontend for this variable (n_loc)
138 * @return a firm node of mode @p mode that initializes the var at position pos
141 * Do not return NULL!
142 * If this function is not set, FIRM will create an Unknown node.
143 * Use set_irg_loc_description()/get_irg_loc_description() to assign additional
144 * informations to local variables.
146 typedef ir_node *uninitialized_local_variable_func_t(ir_graph *irg, ir_mode *mode, int pos);
149 # define ENUM_BITSET(type) \
151 static inline type operator ~ (type a) { return (type)~(int)a; } \
152 static inline type operator & (type a, type b) { return (type)((int)a & (int)b); } \
153 static inline type operator &= (type& a, type b) { return a = (type)((int)a & (int)b); } \
154 static inline type operator ^ (type a, type b) { return (type)((int)a ^ (int)b); } \
155 static inline type operator ^= (type& a, type b) { return a = (type)((int)a ^ (int)b); } \
156 static inline type operator | (type a, type b) { return (type)((int)a | (int)b); } \
157 static inline type operator |= (type& a, type b) { return a = (type)((int)a | (int)b); } \
160 /** Marks an enum type as bitset enum. That is the enumeration values will
161 * probably be combined to form a (bit)set of flags.
162 * When compiling for C++ this macro will define the ~, &, &=, ^, ^=, | and |=
163 * operators for the enum values. */
164 # define ENUM_BITSET(type)
168 # define ENUM_COUNTABLE(type) \
170 static inline type operator ++(type& a) { return a = (type)((int)a + 1); } \
171 static inline type operator --(type& a) { return a = (type)((int)a - 1); } \
174 /** Marks an enum type as countable enum. The enumeration values will be a
175 * linear sequence of numbers which can be iterated through by incrementing
177 * When compiling for C++ this macro will define the ++ and -- operators. */
178 # define ENUM_COUNTABLE(type)
183 * Relations for comparing numbers
185 typedef enum ir_relation {
186 ir_relation_false = 0, /**< always false */
187 ir_relation_equal = 1u << 0, /**< equal */
188 ir_relation_less = 1u << 1, /**< less */
189 ir_relation_greater = 1u << 2, /**< greater */
190 ir_relation_unordered = 1u << 3, /**< unordered */
191 ir_relation_less_equal = ir_relation_equal|ir_relation_less, /**< less or equal */
192 ir_relation_greater_equal = ir_relation_equal|ir_relation_greater, /**< greater or equal */
193 ir_relation_less_greater = ir_relation_less|ir_relation_greater, /** less or greater ('not equal' for integer numbers) */
194 ir_relation_less_equal_greater = ir_relation_equal|ir_relation_less|ir_relation_greater, /**< less equal or greater ('not unordered') */
195 ir_relation_unordered_equal = ir_relation_unordered|ir_relation_equal, /**< unordered or equal */
196 ir_relation_unordered_less = ir_relation_unordered|ir_relation_less, /**< unordered or less */
197 ir_relation_unordered_less_equal = ir_relation_unordered|ir_relation_less|ir_relation_equal, /**< unordered, less or equal */
198 ir_relation_unordered_greater = ir_relation_unordered|ir_relation_greater, /**< unordered or greater */
199 ir_relation_unordered_greater_equal = ir_relation_unordered|ir_relation_greater|ir_relation_equal, /**< unordered, greater or equal */
200 ir_relation_unordered_less_greater = ir_relation_unordered|ir_relation_less|ir_relation_greater, /**< unordered, less or greater ('not equal' for floatingpoint numbers) */
201 ir_relation_true = ir_relation_equal|ir_relation_less|ir_relation_greater|ir_relation_unordered, /**< always true */
203 ENUM_BITSET(ir_relation)
207 * constrained flags for memory operations.
209 typedef enum ir_cons_flags {
210 cons_none = 0, /**< No constrains. */
211 cons_volatile = 1U << 0, /**< Memory operation is volatile. */
212 cons_unaligned = 1U << 1, /**< Memory operation is unaligned. */
213 cons_floats = 1U << 2, /**< Memory operation can float. */
214 cons_throws_exception = 1U << 3, /**< fragile op throws exception (and
215 produces X_regular and X_except
218 ENUM_BITSET(ir_cons_flags)
224 typedef enum op_pin_state {
225 op_pin_state_floats = 0, /**< Nodes of this opcode can be placed in any basic block. */
226 op_pin_state_pinned = 1, /**< Nodes must remain in this basic block. */
227 op_pin_state_exc_pinned, /**< Node must be remain in this basic block if it can throw an
228 exception, else can float. Used internally. */
229 op_pin_state_mem_pinned /**< Node must be remain in this basic block if it can throw an
230 exception or uses memory, else can float. Used internally. */
235 * A type to express conditional jump predictions.
237 typedef enum cond_jmp_predicate {
238 COND_JMP_PRED_NONE, /**< No jump prediction. Default. */
239 COND_JMP_PRED_TRUE, /**< The True case is predicted. */
240 COND_JMP_PRED_FALSE /**< The False case is predicted. */
241 } cond_jmp_predicate;
244 * @ingroup method_type
245 * Additional method type properties:
246 * Tell about special properties of a method type. Some
247 * of these may be discovered by analyses.
249 typedef enum mtp_additional_properties {
250 /** no additional properties */
252 /** This method did not access memory and calculates its return values
253 * solely from its parameters. The only observable effect of a const
254 * function must be its return value. So they must not exhibit infinite
255 * loops or wait for user input. The return value must not depend on any
256 * global variables/state.
257 * GCC: __attribute__((const)). */
258 mtp_property_const = 1u << 0,
259 /** This method did NOT write to memory and calculates its return values
260 * solely from its parameters and the memory they points to (or global
261 * vars). The only observable effect of a const function must be its return
262 * value. So they must not exhibit infinite loops or wait for user input.
263 * GCC: __attribute__((pure)). */
264 mtp_property_pure = 1u << 1,
265 /** This method did not return due to an aborting system call.
266 * GCC: __attribute__((noreturn)). */
267 mtp_property_noreturn = 1u << 2,
268 /** This method cannot throw an exception. GCC: __attribute__((nothrow)). */
269 mtp_property_nothrow = 1u << 3,
270 /** This method is naked. GCC: __attribute__((naked)). */
271 mtp_property_naked = 1u << 4,
272 /** This method returns newly allocate memory.
273 * GCC: __attribute__((malloc)). */
274 mtp_property_malloc = 1u << 5,
275 /** This method can return more than one (typically setjmp).
276 * GCC: __attribute__((returns_twice)). */
277 mtp_property_returns_twice = 1u << 6,
278 /** This method is intrinsic. It is expected that a lowering phase will
279 * remove all calls to it. */
280 mtp_property_intrinsic = 1u << 7,
281 /** This method represents a runtime routine. */
282 mtp_property_runtime = 1u << 8,
283 /** All method invocations are known, the backend is free to optimize the
284 * call in any possible way. */
285 mtp_property_private = 1u << 9,
286 /** Set, if this method contains one possibly endless loop. */
287 mtp_property_has_loop = 1u << 10,
288 /** try to always inline this function, even if it seems nonprofitable */
289 mtp_property_always_inline = 1u << 11,
290 /** the function should not be inlined */
291 mtp_property_noinline = 1u << 12,
292 /** the programmer recommends to inline the function */
293 mtp_property_inline_recommended = 1u << 13,
294 /** stupid hack used by opt_funccall... */
295 mtp_temporary = 1u << 31,
296 } mtp_additional_properties;
297 ENUM_BITSET(mtp_additional_properties)
301 * This enum names the different kinds of symbolic Constants represented by
302 * SymConst. The content of the attribute symconst_symbol depends on this tag.
303 * Use the proper access routine after testing this flag.
305 typedef enum symconst_kind {
306 symconst_type_size, /**< The SymConst is the size of the given type.
307 symconst_symbol is type *. */
308 symconst_type_align, /**< The SymConst is the alignment of the given type.
309 symconst_symbol is type *. */
310 symconst_addr_ent, /**< The SymConst is a symbolic pointer to be filled in
311 by the linker. The pointer is represented by an entity.
312 symconst_symbol is entity *. */
313 symconst_ofs_ent, /**< The SymConst is the offset of its entity in the entities
315 symconst_enum_const /**< The SymConst is a enumeration constant of an
321 * SymConst attribute.
323 * This union contains the symbolic information represented by the node.
326 typedef union symconst_symbol {
327 ir_type *type_p; /**< The type of a SymConst. */
328 ir_entity *entity_p; /**< The entity of a SymConst. */
329 ir_enum_const *enum_p; /**< The enumeration constant of a SymConst. */
334 * The allocation place.
336 typedef enum ir_where_alloc {
337 stack_alloc, /**< Alloc allocates the object on the stack. */
338 heap_alloc /**< Alloc allocates the object on the heap. */
341 /** A input/output constraint attribute.
344 typedef struct ir_asm_constraint {
345 unsigned pos; /**< The inputs/output position for this constraint. */
346 ident *constraint; /**< The constraint for this input/output. */
347 ir_mode *mode; /**< The mode of the constraint. */
350 /** Supported libFirm builtins.
353 typedef enum ir_builtin_kind {
354 ir_bk_trap, /**< GCC __builtin_trap(): insert trap */
355 ir_bk_debugbreak, /**< MS __debugbreak(): insert debug break */
356 ir_bk_return_address, /**< GCC __builtin_return_address() */
357 ir_bk_frame_address, /**< GCC __builtin_frame_address() */
358 ir_bk_prefetch, /**< GCC __builtin_prefetch() */
359 ir_bk_ffs, /**< GCC __builtin_ffs(): find first (least) significant 1 bit */
360 ir_bk_clz, /**< GCC __builtin_clz(): count leading zero */
361 ir_bk_ctz, /**< GCC __builtin_ctz(): count trailing zero */
362 ir_bk_popcount, /**< GCC __builtin_popcount(): population count */
363 ir_bk_parity, /**< GCC __builtin_parity(): parity */
364 ir_bk_bswap, /**< byte swap */
365 ir_bk_inport, /**< in port */
366 ir_bk_outport, /**< out port */
367 ir_bk_inner_trampoline, /**< address of a trampoline for GCC inner functions */
368 ir_bk_last = ir_bk_inner_trampoline,
372 * Possible return values of value_classify().
374 typedef enum ir_value_classify_sign {
375 value_classified_unknown = 0, /**< could not classify */
376 value_classified_positive = 1, /**< value is positive, i.e. >= 0 */
377 value_classified_negative = -1 /**< value is negative, i.e. <= 0 if
378 no signed zero exists or < 0 else */
379 } ir_value_classify_sign;
382 * This enumeration flags the volatility of entities and Loads/Stores.
385 volatility_non_volatile, /**< The entity is not volatile. Default. */
386 volatility_is_volatile /**< The entity is volatile. */
390 * This enumeration flags the align of Loads/Stores.
393 align_is_aligned = 0, /**< The entity is aligned. Default */
394 align_non_aligned, /**< The entity is not aligned. */