4 * Purpose: A specification of Firm for use with GrGen
8 * Copyright: (c) 2004 Universitaet Karlsruhe
14 node class FIRM_node extends Node {
18 edge class FIRM_edge extends Edge {
23 /**********************************************
25 **********************************************/
28 auxiliary, control_flow, memory, internal_boolean,
29 int_number, float_number, reference, character
31 enum ENUM_arithmetic_kind {
32 uninitialized, none, twos_complement, ones_complement,
33 int_BCD, ieee754, float_BCD, max, unknown
36 irm_BB, irm_X, irm_F, irm_D, irm_E, irm_Bs,
37 irm_Bu, irm_Hs, irm_Hu, irm_Is, irm_Iu, irm_Ls,
38 irm_Lu, irm_C, irm_P, irm_b, irm_M, irm_T,
39 irm_U, irm_ANY, irm_BAD, irm_max
42 node class Mode extends FIRM_node {
46 /* code : ENUM_modecode; */
48 arithmetic : ENUM_arithmetic_kind;
53 node class Mode_BB extends Mode;
54 node class Mode_X extends Mode;
55 node class Mode_F extends Mode;
56 node class Mode_D extends Mode;
57 node class Mode_E extends Mode;
58 node class Mode_Bs extends Mode;
59 node class Mode_Bu extends Mode;
60 node class Mode_Hs extends Mode;
61 node class Mode_Hu extends Mode;
62 node class Mode_Is extends Mode;
63 node class Mode_Iu extends Mode;
64 node class Mode_Ls extends Mode;
65 node class Mode_Lu extends Mode;
66 node class Mode_C extends Mode;
67 node class Mode_P extends Mode;
68 node class Mode_b extends Mode;
69 node class Mode_M extends Mode;
70 node class Mode_T extends Mode;
71 node class Mode_U extends Mode;
72 node class Mode_ANY extends Mode;
73 node class Mode_BAD extends Mode;
74 node class Mode_max extends Mode;
75 node class Mode_DLu extends Mode;
76 node class Mode_LLu extends Mode;
80 /**********************************************
82 **********************************************/
84 enum ENUM_state { layout_undefined, layout_fixed }
86 /************* Type Nodes *************/
88 node class Type extends FIRM_node {
96 node class Compound extends Type;
97 node class Class extends Compound;
98 node class Struct extends Compound;
99 node class Union extends Compound;
100 node class Method extends Type {
101 n_params : int; // number of calling paramters
102 n_ress : int; // number of results
103 variadic : boolean; // true: additional variadic parameters allowed
105 node class Array extends Type {
108 node class Enum extends Type;
109 node class Pointer extends Type;
110 node class Primitive extends Type;
112 /************* Type Edges *************/
114 // Class (Sub) -> Class (Super)
115 edge class is_subtype_of extends FIRM_edge
116 connect Class [*] -> Class [*]; // Subclass -> Superclass
117 edge class member extends FIRM_edge
118 // Entities may or may not be an Compound member: [0:1]
119 connect Compound [*] -> Entity [0:1];
120 edge class parameter extends FIRM_edge
121 connect Method [*] -> Type [*] {
124 edge class result extends FIRM_edge
125 connect Method [*] -> Type [*] {
128 edge class element_type extends FIRM_edge
129 connect Array [1] -> Type [*];
130 edge class element_ent extends FIRM_edge
131 connect Array [1] -> Entity [*];
134 /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
135 TODO XXX const_code_irg is not walked by wif.do_block
136 TODO: Implement upper / lower in firm2grs.c
137 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
139 edge class lower extends FIRM_edge // TODO: multidim arrays???
140 connect Array [*] -> IR_node [*] {
143 edge class upper extends FIRM_edge
144 connect Array [*] -> IR_node [*] {
148 edge class named_value extends FIRM_edge // Enum -> Tarval
149 connect Enum [*] -> Tarval [*] { // TODO: empty Enums [+]???
152 edge class has_type extends FIRM_edge
153 connect Call [1] -> Type [*],
154 SymConst [0:1] -> Type [*],
155 Pointer [1] -> Type [*];
158 /**********************************************
160 **********************************************/
162 node class Tarval extends FIRM_node {
163 value : string; // is this aprobate
166 edge class has_mode extends FIRM_edge
167 connect Tarval [1] -> Mode [*],
168 Pointer [1] -> Mode [*],
169 Primitive [1] -> Mode [*],
170 Method [1] -> Mode [*],
171 IR_node [1] -> Mode [*],
172 Struct [0:1]->Mode [*],
173 Enum [1] -> Mode [*];
174 edge class has_entity extends FIRM_edge
175 connect SymConst[0:1] -> Entity [*];
178 /**********************************************
180 **********************************************/
182 enum ENUM_allocation { automatic, parameter, dynamic, static }
183 enum ENUM_visibility { local, global, extern }
184 enum ENUM_variability { uninitialized, initialized, partly_constant, constant }
185 enum ENUM_peculiarity { description, inherited, existent }
187 /************* Entity Nodes *************/
189 node class Entity extends FIRM_node {
190 name : string; // the (source) name of the entity
191 ld_name : string; // the linker name of the entity
193 allocation : ENUM_allocation;
194 visibility : ENUM_visibility;
195 variability : ENUM_variability;
196 peculiarity : ENUM_peculiarity;
197 volatility : boolean;
200 /************* Entity Edges *************/
202 edge class overwrites extends FIRM_edge
203 connect Entity -> Entity; // TODO arity ???
205 edge class init_node extends FIRM_edge;
206 // connect Entity -> Node (of Init); // TODO arity ???
208 edge class init_entity extends FIRM_edge;
209 // connect Entity -> Entity (of Init); // TODO arity ???
211 edge class graph extends FIRM_edge
212 connect Entity [0:1] -> Method_IRG [*];
214 edge class type extends FIRM_edge
215 connect Entity [1] -> Type [*];
218 /**********************************************
220 **********************************************/
223 * Firm IRG the IR graph of a method.
224 * Pointing to Start and End nodes as well as its Entity
226 node class Method_IRG extends FIRM_node {
227 main_method : boolean; // set, if this method is the main entry point
230 edge class meth_start extends FIRM_edge
231 connect Method_IRG -> Start;
233 edge class meth_end extends FIRM_edge
234 connect Method_IRG -> End;
236 edge class frame_type extends FIRM_edge
237 connect Method_IRG -> Type;
239 edge class belong_to extends FIRM_edge
240 connect Block -> Method_IRG;
242 node class IR_node extends FIRM_node {
243 index : int; //quickfix for using vprojs
249 node class Arithmetic extends Ordinary;
250 node class Controlflow;
258 node class Commutative;
259 node class Associative;
262 /**********************************************
264 **********************************************/
266 node class Complex extends IR_node;
267 node class Block extends IR_node, Special;
268 node class Start extends IR_node, Special;
269 node class End extends IR_node, Special;
271 node class Jmp extends IR_node, Controlflow;
272 node class Cond extends IR_node, Controlflow, Ordinary;
273 node class Return extends IR_node, Controlflow;
274 node class Raise extends IR_node, Controlflow;
276 node class Const extends IR_node, Ordinary {
277 value : string; // tarval coded as string
279 node class IntConst extends Const {
281 // value inherited from Const is set to "<INTCONST>" and may not be used
282 intval : int; // tarval coded as string
285 node class SymConst extends IR_node, Ordinary {
290 node class Sel extends IR_node, VectorBase;
291 node class InstOf extends IR_node;
292 node class Call extends IR_node;
293 node class Add extends IR_node, Arithmetic, Binary, Commutative;
294 node class Sub extends IR_node, Arithmetic, Binary;
295 node class Minus extends IR_node, Arithmetic, Unary;
296 node class Mul extends IR_node, Arithmetic, Binary, Commutative;
297 node class Mulh extends IR_node, Arithmetic, Binary, Commutative;
298 node class Quot extends IR_node, Arithmetic, Binary;
299 node class DivMod extends IR_node, Arithmetic, Binary;
300 node class Div extends IR_node, Arithmetic, Binary;
301 node class Mod extends IR_node, Arithmetic, Binary;
302 node class Abs extends IR_node, Arithmetic, Unary;
303 node class And extends IR_node, Arithmetic, Binary, Commutative;
304 node class Or extends IR_node, Arithmetic, Binary, Commutative;
305 node class Eor extends IR_node, Arithmetic, Binary, Commutative;
306 node class Not extends IR_node, Arithmetic, Unary;
307 node class Cmp extends IR_node, Ordinary;
308 node class Shl extends IR_node, Arithmetic, Binary;
309 node class Shr extends IR_node, Arithmetic, Binary;
310 node class Shrs extends IR_node, Arithmetic, Binary;
311 node class Rot extends IR_node, Arithmetic, Binary;
312 node class Conv extends IR_node, Ordinary;
313 node class Cast extends IR_node; // TODO classify
314 node class Phi extends IR_node, Ordinary;
315 node class Mux extends IR_node, Trinary; // TODO classify
317 node class MemNode extends IR_node, Memory {
318 volatility : boolean;
321 node class Load extends MemNode;
322 node class Store extends MemNode;
324 enum ENUM_alloc_where { stack_alloc, heap_alloc }
326 node class Alloc extends IR_node, Memory {
327 where : ENUM_alloc_where;
329 node class Free extends IR_node, Memory;
330 node class Sync extends IR_node, Memory {
334 node class SyncArity2 extends Sync;// A sync with arity 2, that has a wrong arity attribute
335 node class IgnoreCF; // it is not important to which block this node is connected
337 node class Proj extends IR_node, Ordinary, VectorBase {
341 // TODO classify the following IR_nodes
342 node class Tuple extends IR_node;
343 node class Id extends IR_node;
344 node class Bad extends IR_node;
345 node class NoMem extends IR_node;
346 node class Confirm extends IR_node;
347 node class Unknown extends IR_node;
348 node class Filter extends IR_node;
349 node class Break extends IR_node, Controlflow;
350 node class CallBegin extends IR_node;
351 node class EndReg extends IR_node;
352 node class EndExcept extends IR_node, Controlflow;
354 /**********************************************
355 * IR Intrinsic Nodes *
356 **********************************************/
357 node class Intrinsic extends IR_node, Ordinary
362 node class IntrinsicGP extends Intrinsic; // a intrinsic with gp registers
363 node class IntrinsicGP3 extends Intrinsic; // a intrinsic with 3 gp registers
364 node class IntrinsicFP extends Intrinsic; // a intrinsic with fp registers
365 node class IntrinsicMMX extends Intrinsic; // a intrinsic with mmx registers
366 node class IntrinsicSSE extends Intrinsic; // a intrinsic with sse registers
368 node class Intrinsic_sse_sse_sse extends Intrinsic; // a intrinsic
369 node class Intrinsic_sse_sse extends Intrinsic; // a intrinsic
370 node class Intrinsic_sse_addr_sse extends Intrinsic; // a intrinsic
371 node class Intrinsic_addr_sse_store extends Intrinsic; // a intrinsic
372 node class Intrinsic_reg_sse_sse extends Intrinsic; // a intrinsic
373 node class Intrinsic_sse_reg_sse extends Intrinsic; // a intrinsic
374 node class Intrinsic_sse_addr_store extends Intrinsic; // a intrinsic
375 node class Intrinsic_addr_addr_store extends Intrinsic; // a intrinsic
376 node class Intrinsic_addr_sse extends Intrinsic; // a intrinsic
377 node class Intrinsic_addr_addr_sse extends Intrinsic; // a intrinsic
379 node class max extends IntrinsicGP; // a max instruction
380 node class min extends IntrinsicGP; // a min instruction
382 node class CMOV extends IntrinsicGP; // a conditional move instruction
384 node class CCopy extends IntrinsicGP; // a conditional copy instruction
385 // CCopy(val0:df, val1:df, cond:bool):df
389 node class IntrinsicMatch extends Match{
394 /************* IR Edges *************/
396 edge class flow extends FIRM_edge
397 connect IR_node [*] -> IR_node [*] {
401 edge class df extends flow; // IR_node -> IR_node, data flow
402 edge class mem extends df; // IR_node -> IR_node, memory
403 edge class tuple extends df; // Edges of Mode Tuple
404 edge class cf extends flow // control flow
405 connect IR_node [1] -> Block [*],
406 // We cannot distinguish ProjI etc from ProjXi: therefor 0
407 // ProjX form Start has 2 successors
408 Block [*] -> Proj [0:2];
411 /**********************************************
413 **********************************************/
415 node class Vector extends IR_node;
417 node class V2 extends Vector;
418 node class V4 extends Vector;
422 node class V2pi_1 extends V2, pi;
423 node class V2pi_2 extends V2, pi;
425 node class V4pi_1 extends V4, pi;
426 node class V4pi_2 extends V4, pi;
427 node class V4pi_3 extends V4, pi;
428 node class V4pi_4 extends V4, pi;
430 node class V2Load extends V2;
431 node class V2Store extends V2;
433 node class V2Sub extends V2;
439 node class StartBlock;
446 //select parts of a register (e.g. 32 bit of a 128 bit register)
447 node class VProj extends IR_node, Ordinary
452 // Add wich can have several operands
453 node class MultipleAdd extends IR_node
458 // A node which represents the base pointer of a vector
459 node class VectorBase extends IR_node;
461 // A backend node we need to copy simd -> gp register on ia32
462 node class IR_Keep extends IR_node;