added ir/opt include
[libfirm] / ir / be / bearch.h
1 #ifndef _FIRM_BEARCH_H
2 #define _FIRM_BEARCH_H
3
4 #include "firm_config.h"
5
6 #ifdef WITH_LIBCORE
7 #include <libcore/lc_opts.h>
8 #endif
9
10 #include "firm_types.h"
11
12 #include "bitset.h"
13
14 #include "belistsched.h"
15 #include "beabi_t.h"
16 #include "bearch_t.h"
17 #include "be_t.h"
18
19 struct _be_node_factory_t;
20
21 typedef enum _arch_register_type_t {
22   arch_register_type_none         = 0,
23   arch_register_type_caller_save  = 1,  /**< The register must be saved by the caller
24                                              upon a function call. It thus can be overwritten
25                                              in the called function. */
26   arch_register_type_callee_save  = 2,  /**< The register must be saved by the caller
27                                              upon a function call. It thus can be overwritten
28                                              in the called function. */
29   arch_register_type_ignore       = 4,  /**< Do not consider this register when allocating. */
30   arch_register_type_joker        = 8,  /**< The emitter can choose an arbitrary register */
31   arch_register_type_virtual      = 16, /**< This is just a virtual register  */
32 } arch_register_type_t;
33
34 /**
35  * Convenience macro to check for register type.
36  * @param req   A pointer to register.
37  * @param kind  The kind of type to check for (see arch_register_type_t).
38  * @return      1, If register is of given kind, 0 if not.
39  */
40 #define arch_register_type_is(reg, kind) \
41   (((reg)->type & arch_register_type_ ## kind) != 0)
42
43 /**
44  * A register.
45  */
46 struct _arch_register_t {
47   const char *name;                         /**< The name of the register. */
48   const arch_register_class_t *reg_class;   /**< The class the register belongs to. */
49   int index;                                /**< The index of the register in the class. */
50   arch_register_type_t type;                /**< The type of the register. */
51   void *data;                               /**< Custom data. */
52 };
53
54 static INLINE const arch_register_class_t *
55 _arch_register_get_class(const arch_register_t *reg)
56 {
57   return reg->reg_class;
58 }
59
60 static INLINE int _arch_register_get_index(const arch_register_t *reg)
61 {
62   return reg->index;
63 }
64
65 static INLINE const char *_arch_register_get_name(const arch_register_t *reg)
66 {
67         return reg->name;
68 }
69
70 #define arch_register_get_class(reg)      _arch_register_get_class(reg)
71 #define arch_register_get_index(reg)      _arch_register_get_index(reg)
72 #define arch_register_get_name(reg)       _arch_register_get_name(reg)
73
74 /**
75  * A class of registers.
76  * Like general purpose or floating point.
77  */
78 struct _arch_register_class_t {
79   const char *name;               /**< The name of the register class. */
80   int n_regs;                     /**< Number of registers in this class. */
81   ir_mode *mode;                  /**< The mode of the register class. */
82   const arch_register_t *regs;    /**< The array of registers. */
83 };
84
85 /** return the number of registers in this register class */
86 #define arch_register_class_n_regs(cls) ((cls)->n_regs)
87
88 /** return the largest mode of this register class */
89 #define arch_register_class_mode(cls) ((cls)->mode)
90
91 /** return the name of this register class */
92 #define arch_register_class_name(cls) ((cls)->name)
93
94 /**
95  * Put all registers in a class into a bitset.
96  * @param cls The class.
97  * @param bs The bitset. May be NULL.
98  * @return The number of registers in the class.
99  */
100 extern int arch_register_class_put(const arch_register_class_t *cls, bitset_t *bs);
101
102 static INLINE const arch_register_t *
103 _arch_register_for_index(const arch_register_class_t *cls, int idx)
104 {
105   assert(0 <= idx && idx < cls->n_regs);
106   return &cls->regs[idx];
107 }
108
109 #define arch_register_for_index(cls, idx) \
110   _arch_register_for_index(cls, idx)
111
112 typedef enum _arch_operand_type_t {
113   arch_operand_type_invalid,
114   arch_operand_type_memory,
115   arch_operand_type_register,
116   arch_operand_type_immediate,
117   arch_operand_type_symconst,
118   arch_operand_type_last
119 } arch_operand_type_t;
120
121 /**
122  * Different types of register allocation requirements.
123  */
124 typedef enum _arch_register_req_type_t {
125   arch_register_req_type_none = 0,        /**< No register requirement. */
126
127   arch_register_req_type_normal = 1,      /**< All registers in the class
128                                                are allowed. */
129
130   arch_register_req_type_limited = 2,     /**< Only a real subset of
131                                                the class is allowed. */
132
133   arch_register_req_type_should_be_same = 4,       /**< The register should be equal
134                                                         another one at the node. */
135
136   arch_register_req_type_should_be_different = 8,  /**< The register must be unequal
137                                                         to some other at the node. */
138
139   arch_register_req_type_should_be_different_from_all = 16, /**< The register must be different from
140                                                         all in's at the node */
141 } arch_register_req_type_t;
142
143 /**
144  * Convenience macro to check for set constraints.
145  * @param req   A pointer to register requirements.
146  * @param kind  The kind of constraint to check for (see arch_register_req_type_t).
147  * @return      1, If the kind of constraint is present, 0 if not.
148  */
149 #define arch_register_req_is(req, kind) \
150         (((req)->type & (arch_register_req_type_ ## kind)) != 0)
151
152 /**
153  * Expresses requirements to register allocation for an operand.
154  */
155 typedef struct _arch_register_req_t {
156         arch_register_req_type_t type;          /**< The type of the constraint. */
157         const arch_register_class_t *cls;       /**< The register class this constraint belongs to. */
158
159         void (*limited)(void *limited_env, bitset_t *bs);
160                                           /**< In case of the 'limited'
161                                             constraint, this function
162                                             must put all allowable
163                                             registers in the bitset and
164                                             return the number of registers
165                                             in the bitset. */
166
167         void *limited_env;                    /**< This must passed to limited. */
168
169         ir_node *other_same;                      /**< The other which shall have the same reg
170                                                                                     as this one. (for case should_be_same). */
171
172         ir_node *other_different;             /**< The other node from which this one's register
173                                                                                     must be different (case must_be_different). */
174 } arch_register_req_t;
175
176 /**
177  * Format a register requirements information into a string.
178  * @param buf The string where to put it to.
179  * @param len The size of @p buf.
180  * @param req The requirements structure to format.
181  * @return    A pointer to buf.
182  */
183 extern char *arch_register_req_format(char *buf, size_t len, const arch_register_req_t *req);
184
185
186 /**
187  * Certain node classes which are relevant for the register allocator.
188  */
189 typedef enum _arch_irn_class_t {
190   arch_irn_class_normal     = 1 << 0,
191   arch_irn_class_spill      = 1 << 1,
192   arch_irn_class_reload     = 1 << 2,
193   arch_irn_class_copy       = 1 << 3,
194   arch_irn_class_perm       = 1 << 4,
195   arch_irn_class_branch     = 1 << 5,
196   arch_irn_class_call       = 1 << 6,
197   arch_irn_class_const      = 1 << 7,
198   arch_irn_class_load       = 1 << 8,
199   arch_irn_class_store      = 1 << 9,
200   arch_irn_class_stackparam = 1 << 10,
201 } arch_irn_class_t;
202
203 /**
204  * An inverse operation returned by the backend
205  */
206 typedef struct _arch_inverse_t {
207         int      n;       /**< count of nodes returned in nodes array */
208         int      costs;   /**< costs of this remat */
209
210         /**< nodes for this inverse operation. shall be in
211          *  schedule order. last element is the target value
212          */
213         ir_node  **nodes;
214 } arch_inverse_t;
215
216 /**
217  * Some flags describing a node in more detail.
218  */
219 typedef enum _arch_irn_flags_t {
220         arch_irn_flags_none             = 0, /**< Node flags. */
221         arch_irn_flags_dont_spill       = 1, /**< This must not be spilled. */
222         arch_irn_flags_rematerializable = 2, /**< This can be replicated instead of spilled/reloaded. */
223         arch_irn_flags_ignore           = 4, /**< Ignore node during register allocation. */
224         arch_irn_flags_modify_sp        = 8, /**< I modify the stack pointer. */
225         arch_irn_flags_last             = arch_irn_flags_modify_sp
226 } arch_irn_flags_t;
227
228 /**
229  * Get the string representation of a flag.
230  * This functions does not handle or'ed bitmasks of flags.
231  * @param flag The flag.
232  * @return The flag as a string.
233  */
234 extern const char *arch_irn_flag_str(arch_irn_flags_t flag);
235
236 struct _arch_irn_ops_if_t {
237
238   /**
239    * Get the register requirements for a given operand.
240    * @param self The self pointer.
241    * @param irn The node.
242    * @param pos The operand's position
243          *                                              (-1 for the result of the node, 0..n for the input
244          *                                              operands).
245    * @return    The register requirements for the selected operand.
246    *            The pointer returned is never NULL.
247    */
248   const arch_register_req_t *(*get_irn_reg_req)(const void *self,
249       arch_register_req_t *req, const ir_node *irn, int pos);
250
251   /**
252    * Set the register for an output operand.
253    * @param irn The node.
254    * @param reg The register allocated to that operand.
255    * @note      If the operand is not a register operand,
256    *            the call is ignored.
257    */
258   void (*set_irn_reg)(const void *self, ir_node *irn, const arch_register_t *reg);
259
260   /**
261    * Get the register allocated for an output operand.
262    * @param irn The node.
263    * @return    The register allocated at that operand. NULL, if
264    *            the operand was no register operand or
265    *            @c arch_register_invalid, if no register has yet been
266    *            allocated for this node.
267    */
268   const arch_register_t *(*get_irn_reg)(const void *self, const ir_node *irn);
269
270   /**
271    * Classify the node.
272    * @param irn The node.
273    * @return A classification.
274    */
275   arch_irn_class_t (*classify)(const void *self, const ir_node *irn);
276
277   /**
278    * Get the flags of a node.
279    * @param self The irn ops themselves.
280    * @param irn The node.
281    * @return A set of flags.
282    */
283   arch_irn_flags_t (*get_flags)(const void *self, const ir_node *irn);
284
285   /**
286    * Get the entity on the stack frame this node depends on.
287    * @param self The this pointer.
288    * @param irn  The node in question.
289    * @return The entity on the stack frame or NULL, if the node does not has a stack frame entity.
290    */
291   entity *(*get_frame_entity)(const void *self, const ir_node *irn);
292
293   /**
294    * Set the entity on the stack frame this node depends on.
295    * @param self The this pointer.
296    * @param irn  The node in question.
297    * @param ent  The entity to set
298    */
299   void (*set_frame_entity)(const void *self, ir_node *irn, entity *ent);
300
301   /**
302    * Set the offset of a node carrying an entity on the stack frame.
303    * @param self The this pointer.
304    * @param irn  The node.
305    * @param offset The offset of the node's stack frame entity.
306    */
307   void (*set_frame_offset)(const void *self, ir_node *irn, int offset);
308
309   /**
310    * Returns the delta of the stackpointer for nodes that increment or
311    * decrement the stackpointer with a constant value. (push, pop
312    * nodes on most architectures).
313    * A positive value stands for an expanding stack area, a negative value for
314    * a shrinking one.
315    *
316    * @param self      The this pointer
317    * @param irn       The node
318    * @return          0 if the stackpointer is not modified with a constant
319    *                  value, otherwise the increment/decrement value
320    */
321   int (*get_sp_bias)(const void *self, const ir_node *irn);
322
323   /**
324    * Returns an inverse operation which yields the i-th argument
325    * of the given node as result.
326    *
327    * @param self      The this pointer.
328    * @param irn       The original operation
329    * @param i         Index of the argument we want the inverse operation to yield
330    * @param inverse   struct to be filled with the resulting inverse op
331    * @param obstack   The obstack to use for allocation of the returned nodes array
332    * @return          The inverse operation or NULL if operation invertible
333    */
334   arch_inverse_t *(*get_inverse)(const void *self, const ir_node *irn, int i, arch_inverse_t *inverse, struct obstack *obstack);
335
336   /**
337    * Get the estimated cycle count for @p irn.
338    *
339    * @param self The this pointer.
340    * @param irn  The node.
341    *
342    * @return     The estimated cycle count for this operation
343    */
344   int (*get_op_estimated_cost)(const void *self, const ir_node *irn);
345
346   /**
347    * Asks the backend whether operand @p i of @p irn can be loaded form memory internally
348    *
349    * @param self The this pointer.
350    * @param irn  The node.
351    * @param i    Index of the argument we would like to know whether @p irn can load it form memory internally
352    *
353    * @return     nonzero if argument can be loaded or zero otherwise
354    */
355   int (*possible_memory_operand)(const void *self, const ir_node *irn, unsigned int i);
356
357   /**
358    * Ask the backend to assimilate @p reload of operand @p i into @p irn.
359    *
360    * @param self   The this pointer.
361    * @param irn    The node.
362    * @param spill  The spill.
363    * @param i      The position of the reload.
364    */
365   void (*perform_memory_operand)(const void *self, ir_node *irn, ir_node *spill, unsigned int i);
366 };
367
368 /**
369  * irn_ops base class.
370  */
371 struct _arch_irn_ops_t {
372         const arch_irn_ops_if_t *impl;
373 };
374
375 extern const arch_irn_ops_t *arch_get_irn_ops(const arch_env_t *env, const ir_node *irn);
376
377 extern void arch_set_frame_offset(const arch_env_t *env, ir_node *irn, int bias);
378
379 extern entity *arch_get_frame_entity(const arch_env_t *env, ir_node *irn);
380 extern void arch_set_frame_entity(const arch_env_t *env, ir_node *irn, entity *ent);
381 extern int arch_get_sp_bias(const arch_env_t *env, ir_node *irn);
382
383 extern int arch_get_op_estimated_cost(const arch_env_t *env, const ir_node *irn);
384 extern arch_inverse_t *arch_get_inverse(const arch_env_t *env, const ir_node *irn, int i, arch_inverse_t *inverse, struct obstack *obstack);
385 extern int arch_possible_memory_operand(const arch_env_t *env, const ir_node *irn, unsigned int i);
386 extern void arch_perform_memory_operand(const arch_env_t *env, ir_node *irn, ir_node *spill, unsigned int i);
387
388 /**
389  * Get the register requirements for a node.
390  * @param env The architecture environment.
391  * @param req A pointer to a requirements structure, where the data can
392  *            be put into.
393  * @param irn The node.
394  * @param pos The position of the operand you're interested in.
395  * @return    A pointer to the register requirements which may <b>not</b>
396  *            neccessarily be equal to @p req. If NULL is returned, the
397  *            operand was no register operand.
398  */
399 extern const arch_register_req_t *
400 arch_get_register_req(const arch_env_t *env, arch_register_req_t *req,
401     const ir_node *irn, int pos);
402
403 /**
404  * Check if an operand is a register operand.
405  * @param env The environment.
406  * @param irn The node.
407  * @param pos The position of the operand.
408  * @return 1, if the operand is significant for register allocation, 0
409  * if not.
410  */
411 extern int arch_is_register_operand(const arch_env_t *env,
412     const ir_node *irn, int pos);
413
414 /**
415  * Get the number of allocatable registers concerning
416  * a register class for an operand of a node.
417  * @param env The environment.
418  * @param irn The node.
419  * @param pos The postition of the node's operand.
420  * @param bs  The bitset all allocatable registers shall be put into.
421  *            Note, that you can also pass NULL here. If you don't,
422  *            make sure, the bitset is as large as the register class
423  *            has registers.
424  * @return    The amount of registers allocatable for that operand.
425  */
426 extern int arch_get_allocatable_regs(const arch_env_t *env, const ir_node *irn, int pos, bitset_t *bs);
427
428 /**
429  * Put all registers which shall not be ignored by the register
430  * allocator in a bit set.
431  * @param env The arch env.
432  * @param cls The register class to consider.
433  * @param bs  The bit set to put the registers to.
434  */
435 extern void arch_put_non_ignore_regs(const arch_env_t *env, const arch_register_class_t *cls, bitset_t *bs);
436
437 /**
438  * Check, if a register is assignable to an operand of a node.
439  * @param env The architecture environment.
440  * @param irn The node.
441  * @param pos The position of the operand.
442  * @param reg The register.
443  * @return    1, if the register might be allocated to the operand 0 if not.
444  */
445 extern int arch_reg_is_allocatable(const arch_env_t *env,
446     const ir_node *irn, int pos, const arch_register_t *reg);
447
448 /**
449  * Get the register class of an operand of a node.
450  * @param env The architecture environment.
451  * @param irn The node.
452  * @param pos The position of the operand, -1 for the output.
453  * @return    The register class of the operand or NULL, if
454  *            operand is a non-register operand.
455  */
456 extern const arch_register_class_t *
457 arch_get_irn_reg_class(const arch_env_t *env, const ir_node *irn, int pos);
458
459 /**
460  * Get the register allocated at a certain output operand of a node.
461  * @param env The arch environment.
462  * @param irn The node.
463  * @return    The register allocated for this operand
464  */
465 extern const arch_register_t *
466 arch_get_irn_register(const arch_env_t *env, const ir_node *irn);
467
468 /**
469  * Set the register for a certain output operand.
470  * @param env The architecture environment.
471  * @param irn The node.
472  * @param idx The index of the output operand.
473  * @param reg The register.
474  */
475 extern void arch_set_irn_register(const arch_env_t *env, ir_node *irn,
476                 const arch_register_t *reg);
477
478 /**
479  * Classify a node.
480  * @param env The architecture environment.
481  * @param irn The node.
482  * @return A classification of the node.
483  */
484 extern arch_irn_class_t arch_irn_classify(const arch_env_t *env, const ir_node *irn);
485
486 #define arch_irn_class_is(env, irn, irn_class) ((arch_irn_classify(env, irn) & arch_irn_class_ ## irn_class) != 0)
487
488 /**
489  * Get the flags of a node.
490  * @param env The architecture environment.
491  * @param irn The node.
492  * @return The flags.
493  */
494 extern arch_irn_flags_t arch_irn_get_flags(const arch_env_t *env, const ir_node *irn);
495
496 #define arch_irn_is(env, irn, flag) ((arch_irn_get_flags(env, irn) & arch_irn_flags_ ## flag) != 0)
497
498 #define arch_irn_has_reg_class(env, irn, pos, cls) \
499   ((cls) == arch_get_irn_reg_class(env, irn, pos))
500
501 #define arch_irn_consider_in_reg_alloc(env, cls, irn) \
502         (arch_irn_has_reg_class(env, irn, -1, cls) && !arch_irn_is(env, irn, ignore))
503
504 /**
505  * Somebody who can be asked about IR nodes.
506  */
507 struct _arch_irn_handler_t {
508
509   /**
510     * Get the operations of an irn.
511     * @param self The handler from which the method is invoked.
512     * @param irn Some node.
513     * @return Operations for that irn.
514     */
515   const void *(*get_irn_ops)(const arch_irn_handler_t *handler,
516       const ir_node *irn);
517 };
518
519 /**
520  * The code generator interface.
521  */
522 struct _arch_code_generator_if_t {
523         /**
524          * Initialize the code generator.
525          * @param birg A backend IRG session.
526          * @return     A newly created code generator.
527          */
528         void *(*init)(const be_irg_t *birg);
529
530         /**
531          * Called before abi introduce.
532          */
533         void (*before_abi)(void *self);
534
535         /**
536          * Called, when the graph is being normalized.
537          */
538         void (*prepare_graph)(void *self);
539
540         /**
541          * Called before scheduling.
542          */
543         void (*before_sched)(void *self);
544
545         /**
546          * Called before register allocation.
547          */
548         void (*before_ra)(void *self);
549
550         /**
551          * Called after register allocation.
552          */
553         void (*after_ra)(void *self);
554
555         /**
556          * Called directly before done is called. This should be the last place
557          * where the irg is modified.
558          */
559         void (*finish)(void *self);
560
561         /**
562          * Called after everything happened. This call should emit the final
563          * assembly code but avoid changing the irg.
564          * The code generator must also be de-allocated here.
565          */
566         void (*done)(void *self);
567 };
568
569 /**
570  * helper macro: call function func from the code generator
571  * if it's implemented.
572  */
573 #define _arch_cg_call(cg, func) \
574 do { \
575         if((cg)->impl->func) \
576                 (cg)->impl->func(cg); \
577 } while(0)
578
579 #define arch_code_generator_before_abi(cg)      _arch_cg_call(cg, before_abi)
580 #define arch_code_generator_prepare_graph(cg)   _arch_cg_call(cg, prepare_graph)
581 #define arch_code_generator_before_sched(cg)    _arch_cg_call(cg, before_sched)
582 #define arch_code_generator_before_ra(cg)       _arch_cg_call(cg, before_ra)
583 #define arch_code_generator_after_ra(cg)        _arch_cg_call(cg, after_ra)
584 #define arch_code_generator_finish(cg)          _arch_cg_call(cg, finish)
585 #define arch_code_generator_done(cg)            _arch_cg_call(cg, done)
586
587 /**
588  * Code generator base class.
589  */
590 struct _arch_code_generator_t {
591         const arch_code_generator_if_t *impl;
592 };
593
594 /**
595  * ISA base class.
596  */
597 struct _arch_isa_t {
598         const arch_isa_if_t   *impl;
599         const arch_register_t *sp;  /** The stack pointer register. */
600         const arch_register_t *bp;  /** The base pointer register. */
601         const int stack_dir;        /** -1 for decreasing, 1 for increasing. */
602         const be_main_env_t   *main_env; /** the be main environment */
603 };
604
605 #define arch_isa_stack_dir(isa)  ((isa)->stack_dir)
606 #define arch_isa_sp(isa)         ((isa)->sp)
607 #define arch_isa_bp(isa)         ((isa)->bp)
608
609 /**
610  * Architecture interface.
611  */
612 struct _arch_isa_if_t {
613
614   /**
615    * Initialize the isa interface.
616    * @param file_handle  the file handle to write the output to
617    * @param main_env     the be main environment
618    * @return a new isa instance
619    */
620   void *(*init)(FILE *file_handle);
621
622   /**
623    * Free the isa instance.
624    */
625   void (*done)(void *self);
626
627   /**
628    * Get the the number of register classes in the isa.
629    * @return The number of register classes.
630    */
631   int (*get_n_reg_class)(const void *self);
632
633   /**
634    * Get the i-th register class.
635    * @param i The number of the register class.
636    * @return The register class.
637    */
638   const arch_register_class_t *(*get_reg_class)(const void *self, int i);
639
640   /**
641    * Get the register class which shall be used to store a value of a given mode.
642    * @param self The this pointer.
643    * @param mode The mode in question.
644    * @return A register class which can hold values of the given mode.
645    */
646   const arch_register_class_t *(*get_reg_class_for_mode)(const void *self, const ir_mode *mode);
647
648   /**
649    * Get the ABI restrictions for procedure calls.
650    * @param self        The this pointer.
651    * @param method_type The type of the method (procedure) in question.
652    * @param p           The array of parameter locations to be filled.
653    */
654   void (*get_call_abi)(const void *self, ir_type *method_type, be_abi_call_t *abi);
655
656   /**
657    * The irn handler for this architecture.
658    * The irn handler is registered by the Firm back end
659    * when the architecture is initialized.
660    * (May be NULL).
661    */
662   const arch_irn_handler_t *(*get_irn_handler)(const void *self);
663
664   /**
665    * Get the code generator interface.
666    * @param self The this pointer.
667    * @return     Some code generator interface.
668    */
669   const arch_code_generator_if_t *(*get_code_generator_if)(void *self);
670
671   /**
672    * Get the list scheduler to use. There is already a selector given, the
673    * backend is free to modify and/or ignore it.
674    *
675    * @param self     The isa object.
676    * @param selector The selector given by options.
677    * @return      The list scheduler selector.
678    */
679   const list_sched_selector_t *(*get_list_sched_selector)(const void *self, list_sched_selector_t *selector);
680
681   /**
682    * Get the necessary alignment for storing a register of given class.
683    * @param self  The isa object.
684    * @param cls   The register class.
685    * @return      The alignment in bytes.
686    */
687   int (*get_reg_class_alignment)(const void *self, const arch_register_class_t *cls);
688
689   /**
690    * A "static" function, returns the frontend settings
691    * needed for this backend.
692    */
693   const backend_params *(*get_params)(void);
694
695 #ifdef WITH_LIBCORE
696   /**
697    * Register command line options for this backend.
698    * @param grp  The root group.
699    */
700   void (*register_options)(lc_opt_entry_t *grp);
701 #endif
702 };
703
704 #define arch_isa_get_n_reg_class(isa)                ((isa)->impl->get_n_reg_class(isa))
705 #define arch_isa_get_reg_class(isa,i)                ((isa)->impl->get_reg_class(isa, i))
706 #define arch_isa_get_irn_handler(isa)                ((isa)->impl->get_irn_handler(isa))
707 #define arch_isa_get_call_abi(isa,tp,abi)            ((isa)->impl->get_call_abi((isa), (tp), (abi)))
708 #define arch_isa_get_reg_class_for_mode(isa,mode)    ((isa)->impl->get_reg_class_for_mode((isa), (mode)))
709 #define arch_isa_make_code_generator(isa,irg)        ((isa)->impl->make_code_generator((isa), (irg)))
710 #define arch_isa_get_reg_class_alignment(isa, cls)   ((isa)->impl->get_reg_class_alignment((isa), (cls)))
711
712 #define ARCH_MAX_HANDLERS         8
713
714 /**
715  * Environment for the architecture infrastructure.
716  * Keep this everywhere you're going.
717  */
718 struct _arch_env_t {
719   const struct _be_node_factory_t *node_factory;  /**< The node factory for be nodes. */
720   arch_isa_t *isa;                                /**< The isa about which everything is. */
721
722   arch_irn_handler_t const *handlers[ARCH_MAX_HANDLERS]; /**< The handlers are organized as
723                                                            a stack. */
724
725   int handlers_tos;                                   /**< The stack pointer of the handler
726                                                         stack. */
727 };
728
729 /**
730  * Get the isa of an arch environment.
731  * @param env The environment.
732  * @return The isa with which the env was initialized with.
733  */
734 #define arch_env_get_isa(env)   ((env)->isa)
735
736 /**
737  * Initialize the architecture environment struct.
738  * @param isa           The isa which shall be put into the environment.
739  * @param file_handle   The file handle
740  * @return The environment.
741  */
742 extern arch_env_t *arch_env_init(arch_env_t *env, const arch_isa_if_t *isa, FILE *file_handle, be_main_env_t *main_env);
743
744 /**
745  * Add a node handler to the environment.
746  * @param env The environment.
747  * @param handler A node handler.
748  * @return The environment itself.
749  */
750 extern arch_env_t *arch_env_push_irn_handler(arch_env_t *env, const arch_irn_handler_t *handler);
751
752 /**
753  * Remove a node handler from the handler stack.
754  * @param env The architecture environment.
755  * @return The popped handler.
756  */
757 extern const arch_irn_handler_t *arch_env_pop_irn_handler(arch_env_t *env);
758
759 #endif /* _FIRM_BEARCH_H */