- Normalized some more testapps
[libfirm] / ir / be / beabi.c
1 /**
2  * ABI lowering.
3  *
4  * @author Sebastian Hack
5  * @date   7.3.2005
6  * @cvsid  $Id$
7  */
8
9 #ifdef HAVE_CONFIG_H
10 # include "config.h"
11 #endif
12
13 #include "obst.h"
14 #include "offset.h"
15
16 #include "type.h"
17 #include "irgopt.h"
18
19 #include "irgraph_t.h"
20 #include "irnode_t.h"
21 #include "ircons_t.h"
22 #include "iredges_t.h"
23 #include "irgmod.h"
24 #include "irgwalk.h"
25 #include "irprintf_t.h"
26 #include "irgopt.h"
27 #include "irbitset.h"
28 #include "height.h"
29 #include "pdeq.h"
30 #include "irtools.h"
31
32 #include "be.h"
33 #include "beabi.h"
34 #include "bearch.h"
35 #include "benode_t.h"
36 #include "belive_t.h"
37 #include "besched_t.h"
38
39 typedef struct _be_abi_call_arg_t {
40         unsigned is_res   : 1;  /**< 1: the call argument is a return value. 0: it's a call parameter. */
41         unsigned in_reg   : 1;  /**< 1: this argument is transmitted in registers. */
42         unsigned on_stack : 1;  /**< 1: this argument is transmitted on the stack. */
43
44         int pos;
45         const arch_register_t *reg;
46         entity *stack_ent;
47         unsigned alignment;
48         unsigned space_before;
49         unsigned space_after;
50 } be_abi_call_arg_t;
51
52 struct _be_abi_call_t {
53         be_abi_call_flags_t flags;
54         const be_abi_callbacks_t *cb;
55         ir_type *between_type;
56         set *params;
57 };
58
59 #define N_FRAME_TYPES 3
60
61 /**
62  * This type describes the stack layout.
63  * The stack is divided into 3 parts:
64  * - arg_type:     A struct type describing the stack arguments and it's order.
65  * - between_type: A struct type describing the stack layout between arguments
66  *                 and frame type
67  * - frame_type:   A class type descibing the frame layout
68  */
69 typedef struct _be_stack_layout_t {
70         ir_type *arg_type;                 /**< A type describing the stack argument layout. */
71         ir_type *between_type;             /**< A type describing the "between" layout. */
72         ir_type *frame_type;               /**< The frame type. */
73
74         ir_type *order[N_FRAME_TYPES];     /**< arg, between and frame types ordered. */
75
76         int initial_offset;
77         int stack_dir;                     /**< -1 for decreasing, 1 for increasing. */
78 } be_stack_layout_t;
79
80 struct _be_abi_irg_t {
81         struct obstack       obst;
82         be_stack_layout_t    *frame;        /**< The stack frame model. */
83         const be_irg_t       *birg;         /**< The back end IRG. */
84         const arch_isa_t     *isa;          /**< The isa. */
85         survive_dce_t        *dce_survivor;
86
87         be_abi_call_t        *call;         /**< The ABI call information. */
88         ir_type              *method_type;  /**< The type of the method of the IRG. */
89
90         ir_node              *init_sp;      /**< The node representing the stack pointer
91                                                                              at the start of the function. */
92
93         ir_node              *reg_params;   /**< The reg params node. */
94         pmap                 *regs;         /**< A map of all callee-save and ignore regs to
95                                                                                         their Projs to the RegParams node. */
96
97         pset                 *stack_phis;   /**< The set of all Phi nodes inserted due to
98                                                                                         stack pointer modifying nodes. */
99
100         int                  start_block_bias;  /**< The stack bias at the end of the start block. */
101
102         void                 *cb;           /**< ABI Callback self pointer. */
103
104         pmap                 *keep_map;     /**< mapping blocks to keep nodes. */
105         pset                 *ignore_regs;  /**< Additional registers which shall be ignored. */
106
107         arch_irn_handler_t irn_handler;
108         arch_irn_ops_t     irn_ops;
109         DEBUG_ONLY(firm_dbg_module_t    *dbg;)          /**< The debugging module. */
110 };
111
112 #define get_abi_from_handler(ptr) firm_container_of(ptr, be_abi_irg_t, irn_handler)
113 #define get_abi_from_ops(ptr)     firm_container_of(ptr, be_abi_irg_t, irn_ops)
114
115 /* Forward, since be need it in be_abi_introduce(). */
116 static const arch_irn_ops_if_t abi_irn_ops;
117 static const arch_irn_handler_t abi_irn_handler;
118 static heights_t *ir_heights;
119
120 /* Flag: if set, try to omit the frame pointer if called by the backend */
121 int be_omit_fp = 1;
122
123 /*
124      _    ____ ___    ____      _ _ _                _
125     / \  | __ )_ _|  / ___|__ _| | | |__   __ _  ___| | _____
126    / _ \ |  _ \| |  | |   / _` | | | '_ \ / _` |/ __| |/ / __|
127   / ___ \| |_) | |  | |__| (_| | | | |_) | (_| | (__|   <\__ \
128  /_/   \_\____/___|  \____\__,_|_|_|_.__/ \__,_|\___|_|\_\___/
129
130   These callbacks are used by the backend to set the parameters
131   for a specific call type.
132 */
133
134 /**
135  * Set compare function: compares two ABI call object arguments.
136  */
137 static int cmp_call_arg(const void *a, const void *b, size_t n)
138 {
139         const be_abi_call_arg_t *p = a, *q = b;
140         return !(p->is_res == q->is_res && p->pos == q->pos);
141 }
142
143 /**
144  * Get or set an ABI call object argument.
145  *
146  * @param call      the abi call
147  * @param is_res    true for call results, false for call arguments
148  * @param pos       position of the argument
149  * @param do_insert true if the argument is set, false if it's retrieved
150  */
151 static be_abi_call_arg_t *get_or_set_call_arg(be_abi_call_t *call, int is_res, int pos, int do_insert)
152 {
153         be_abi_call_arg_t arg;
154         unsigned hash;
155
156         memset(&arg, 0, sizeof(arg));
157         arg.is_res = is_res;
158         arg.pos    = pos;
159
160         hash = is_res * 128 + pos;
161
162         return do_insert
163                 ? set_insert(call->params, &arg, sizeof(arg), hash)
164                 : set_find(call->params, &arg, sizeof(arg), hash);
165 }
166
167 /**
168  * Retrieve an ABI call object argument.
169  *
170  * @param call      the ABI call object
171  * @param is_res    true for call results, false for call arguments
172  * @param pos       position of the argument
173  */
174 static INLINE be_abi_call_arg_t *get_call_arg(be_abi_call_t *call, int is_res, int pos)
175 {
176         return get_or_set_call_arg(call, is_res, pos, 0);
177 }
178
179 /* Set the flags for a call. */
180 void be_abi_call_set_flags(be_abi_call_t *call, be_abi_call_flags_t flags, const be_abi_callbacks_t *cb)
181 {
182         call->flags        = flags;
183         call->cb           = cb;
184 }
185
186 void be_abi_call_param_stack(be_abi_call_t *call, int arg_pos, unsigned alignment, unsigned space_before, unsigned space_after)
187 {
188         be_abi_call_arg_t *arg = get_or_set_call_arg(call, 0, arg_pos, 1);
189         arg->on_stack     = 1;
190         arg->alignment    = alignment;
191         arg->space_before = space_before;
192         arg->space_after  = space_after;
193         assert(alignment > 0 && "Alignment must be greater than 0");
194 }
195
196 void be_abi_call_param_reg(be_abi_call_t *call, int arg_pos, const arch_register_t *reg)
197 {
198         be_abi_call_arg_t *arg = get_or_set_call_arg(call, 0, arg_pos, 1);
199         arg->in_reg = 1;
200         arg->reg = reg;
201 }
202
203 void be_abi_call_res_reg(be_abi_call_t *call, int arg_pos, const arch_register_t *reg)
204 {
205         be_abi_call_arg_t *arg = get_or_set_call_arg(call, 1, arg_pos, 1);
206         arg->in_reg = 1;
207         arg->reg = reg;
208 }
209
210 /* Get the flags of a ABI call object. */
211 be_abi_call_flags_t be_abi_call_get_flags(const be_abi_call_t *call)
212 {
213         return call->flags;
214 }
215
216 /**
217  * Constructor for a new ABI call object.
218  *
219  * @return the new ABI call object
220  */
221 static be_abi_call_t *be_abi_call_new()
222 {
223         be_abi_call_t *call = xmalloc(sizeof(call[0]));
224         call->flags.val  = 0;
225         call->params     = new_set(cmp_call_arg, 16);
226         call->cb         = NULL;
227
228         call->flags.bits.try_omit_fp = be_omit_fp;
229         return call;
230 }
231
232 /**
233  * Destructor for an ABI call object.
234  */
235 static void be_abi_call_free(be_abi_call_t *call)
236 {
237         del_set(call->params);
238         free(call);
239 }
240
241 /*
242   _____                           _   _                 _ _ _
243  |  ___| __ __ _ _ __ ___   ___  | | | | __ _ _ __   __| | (_)_ __   __ _
244  | |_ | '__/ _` | '_ ` _ \ / _ \ | |_| |/ _` | '_ \ / _` | | | '_ \ / _` |
245  |  _|| | | (_| | | | | | |  __/ |  _  | (_| | | | | (_| | | | | | | (_| |
246  |_|  |_|  \__,_|_| |_| |_|\___| |_| |_|\__,_|_| |_|\__,_|_|_|_| |_|\__, |
247                                                                     |___/
248
249   Handling of the stack frame. It is composed of three types:
250   1) The type of the arguments which are pushed on the stack.
251   2) The "between type" which consists of stuff the call of the
252      function pushes on the stack (like the return address and
253          the old base pointer for ia32).
254   3) The Firm frame type which consists of all local variables
255      and the spills.
256 */
257
258 static int get_stack_entity_offset(be_stack_layout_t *frame, entity *ent, int bias)
259 {
260         ir_type *t = get_entity_owner(ent);
261         int ofs    = get_entity_offset_bytes(ent);
262
263         int i, index;
264
265         /* Find the type the entity is contained in. */
266         for(index = 0; index < N_FRAME_TYPES; ++index) {
267                 if(frame->order[index] == t)
268                         break;
269         }
270
271         /* Add the size of all the types below the one of the entity to the entity's offset */
272         for(i = 0; i < index; ++i)
273                 ofs += get_type_size_bytes(frame->order[i]);
274
275         /* correct the offset by the initial position of the frame pointer */
276         ofs -= frame->initial_offset;
277
278         /* correct the offset with the current bias. */
279         ofs += bias;
280
281         return ofs;
282 }
283
284 /**
285  * Retrieve the entity with given offset from a frame type.
286  */
287 static entity *search_ent_with_offset(ir_type *t, int offset)
288 {
289         int i, n;
290
291         for(i = 0, n = get_compound_n_members(t); i < n; ++i) {
292                 entity *ent = get_compound_member(t, i);
293                 if(get_entity_offset_bytes(ent) == offset)
294                         return ent;
295         }
296
297         return NULL;
298 }
299
300 static int stack_frame_compute_initial_offset(be_stack_layout_t *frame)
301 {
302         ir_type *base = frame->stack_dir < 0 ? frame->between_type : frame->frame_type;
303         entity *ent   = search_ent_with_offset(base, 0);
304         frame->initial_offset = 0;
305         frame->initial_offset = get_stack_entity_offset(frame, ent, 0);
306         return frame->initial_offset;
307 }
308
309 /**
310  * Initializes the frame layout from parts
311  *
312  * @param frame     the stack layout that will be initialized
313  * @param args      the stack argument layout type
314  * @param between   the between layout type
315  * @param locals    the method frame type
316  * @param stack_dir the stack direction
317  *
318  * @return the initialized stack layout
319  */
320 static be_stack_layout_t *stack_frame_init(be_stack_layout_t *frame, ir_type *args,
321                                            ir_type *between, ir_type *locals, int stack_dir)
322 {
323         frame->arg_type       = args;
324         frame->between_type   = between;
325         frame->frame_type     = locals;
326         frame->initial_offset = 0;
327         frame->stack_dir      = stack_dir;
328         frame->order[1]       = between;
329
330         if(stack_dir > 0) {
331                 frame->order[0] = args;
332                 frame->order[2] = locals;
333         }
334         else {
335                 frame->order[0] = locals;
336                 frame->order[2] = args;
337         }
338         return frame;
339 }
340
341 /** Dumps the stack layout to file. */
342 static void stack_layout_dump(FILE *file, be_stack_layout_t *frame)
343 {
344         int i, j, n;
345
346         ir_fprintf(file, "initial offset: %d\n", frame->initial_offset);
347         for (j = 0; j < N_FRAME_TYPES; ++j) {
348                 ir_type *t = frame->order[j];
349
350                 ir_fprintf(file, "type %d: %F size: %d\n", j, t, get_type_size_bytes(t));
351                 for (i = 0, n = get_compound_n_members(t); i < n; ++i) {
352                         entity *ent = get_compound_member(t, i);
353                         ir_fprintf(file, "\t%F int ofs: %d glob ofs: %d\n", ent, get_entity_offset_bytes(ent), get_stack_entity_offset(frame, ent, 0));
354                 }
355         }
356 }
357
358 /**
359  * Returns non-zero if the call argument at given position
360  * is transfered on the stack.
361  */
362 static INLINE int is_on_stack(be_abi_call_t *call, int pos)
363 {
364         be_abi_call_arg_t *arg = get_call_arg(call, 0, pos);
365         return arg && !arg->in_reg;
366 }
367
368 /*
369    ____      _ _
370   / ___|__ _| | |___
371  | |   / _` | | / __|
372  | |__| (_| | | \__ \
373   \____\__,_|_|_|___/
374
375   Adjustment of the calls inside a graph.
376
377 */
378
379 /**
380  * Transform a call node.
381  * @param env The ABI environment for the current irg.
382  * @param irn The call node.
383  * @param curr_sp The stack pointer node to use.
384  * @return The stack pointer after the call.
385  */
386 static ir_node *adjust_call(be_abi_irg_t *env, ir_node *irn, ir_node *curr_sp)
387 {
388         ir_graph *irg             = env->birg->irg;
389         const arch_isa_t *isa     = env->birg->main_env->arch_env->isa;
390         be_abi_call_t *call       = be_abi_call_new();
391         ir_type *mt               = get_Call_type(irn);
392         ir_node *call_ptr         = get_Call_ptr(irn);
393         int n_params              = get_method_n_params(mt);
394         ir_node *curr_mem         = get_Call_mem(irn);
395         ir_node *bl               = get_nodes_block(irn);
396         pset *results             = pset_new_ptr(8);
397         pset *caller_save         = pset_new_ptr(8);
398         int stack_size            = 0;
399         int stack_dir             = arch_isa_stack_dir(isa);
400         const arch_register_t *sp = arch_isa_sp(isa);
401         ir_mode *mach_mode        = sp->reg_class->mode;
402         struct obstack *obst      = &env->obst;
403         ir_node *no_mem           = get_irg_no_mem(irg);
404         int no_alloc              = call->flags.bits.frame_is_setup_on_call;
405
406         ir_node *res_proj = NULL;
407         int curr_res_proj = pn_Call_max;
408         int n_low_args    = 0;
409         int n_pos         = 0;
410
411         ir_node *low_call;
412         ir_node **in;
413         ir_node **res_projs;
414         const ir_edge_t *edge;
415         int *low_args;
416         int *pos;
417         int i, n;
418
419         /* Let the isa fill out the abi description for that call node. */
420         arch_isa_get_call_abi(isa, mt, call);
421
422         /* Insert code to put the stack arguments on the stack. */
423         assert(get_Call_n_params(irn) == n_params);
424         for(i = 0; i < n_params; ++i) {
425                 be_abi_call_arg_t *arg = get_call_arg(call, 0, i);
426                 assert(arg);
427                 if(arg->on_stack) {
428                         stack_size += arg->space_before;
429                         stack_size =  round_up2(stack_size, arg->alignment);
430                         stack_size += get_type_size_bytes(get_method_param_type(mt, i));
431                         stack_size += arg->space_after;
432                         obstack_int_grow(obst, i);
433                         n_pos++;
434                 }
435         }
436         pos = obstack_finish(obst);
437
438         /* Collect all arguments which are passed in registers. */
439         for(i = 0, n = get_Call_n_params(irn); i < n; ++i) {
440                 be_abi_call_arg_t *arg = get_call_arg(call, 0, i);
441                 if(arg && arg->in_reg) {
442                         obstack_int_grow(obst, i);
443                         n_low_args++;
444                 }
445         }
446         low_args = obstack_finish(obst);
447
448         /* If there are some parameters which shall be passed on the stack. */
449         if(n_pos > 0) {
450                 int curr_ofs      = 0;
451                 int do_seq        = call->flags.bits.store_args_sequential && !no_alloc;
452
453                 /*
454                  * Reverse list of stack parameters if call arguments are from left to right.
455                  * We must them reverse again in they are pushed (not stored) and the stack
456                  * direction is downwards.
457                  */
458                 if (call->flags.bits.left_to_right ^ (do_seq && stack_dir < 0)) {
459                         for(i = 0; i < n_pos >> 1; ++i) {
460                                 int other  = n_pos - i - 1;
461                                 int tmp    = pos[i];
462                                 pos[i]     = pos[other];
463                                 pos[other] = tmp;
464                         }
465                 }
466
467                 /*
468                  * If the stack is decreasing and we do not want to store sequentially,
469                  * or someone else allocated the call frame
470                  * we allocate as much space on the stack all parameters need, by
471                  * moving the stack pointer along the stack's direction.
472                  */
473                 if(stack_dir < 0 && !do_seq && !no_alloc) {
474                         curr_sp = be_new_IncSP(sp, irg, bl, curr_sp, no_mem, stack_size, be_stack_dir_expand);
475                 }
476
477                 assert(mode_is_reference(mach_mode) && "machine mode must be pointer");
478                 for(i = 0; i < n_pos; ++i) {
479                         int p                  = pos[i];
480                         be_abi_call_arg_t *arg = get_call_arg(call, 0, p);
481                         ir_node *param         = get_Call_param(irn, p);
482                         ir_node *addr          = curr_sp;
483                         ir_node *mem           = NULL;
484                         ir_type *param_type    = get_method_param_type(mt, p);
485                         int param_size         = get_type_size_bytes(param_type) + arg->space_after;
486
487                         /*
488                          * If we wanted to build the arguments sequentially,
489                          * the stack pointer for the next must be incremented,
490                          * and the memory value propagated.
491                          */
492                         if (do_seq) {
493                                 curr_ofs = 0;
494                                 addr = curr_sp = be_new_IncSP(sp, irg, bl, curr_sp, curr_mem,
495                                         param_size + arg->space_before, be_stack_dir_expand);
496                         }
497                         else {
498                                 curr_ofs += arg->space_before;
499                                 curr_ofs =  round_up2(curr_ofs, arg->alignment);
500
501                                 /* Make the expression to compute the argument's offset. */
502                                 if(curr_ofs > 0) {
503                                         addr = new_r_Const_long(irg, bl, mode_Is, curr_ofs);
504                                         addr = new_r_Add(irg, bl, curr_sp, addr, mach_mode);
505                                 }
506                         }
507
508                         /* Insert a store for primitive arguments. */
509                         if (is_atomic_type(param_type)) {
510                                 mem = new_r_Store(irg, bl, curr_mem, addr, param);
511                                 mem = new_r_Proj(irg, bl, mem, mode_M, pn_Store_M);
512                         }
513
514                         /* Make a mem copy for compound arguments. */
515                         else {
516                                 assert(mode_is_reference(get_irn_mode(param)));
517                                 mem = new_r_CopyB(irg, bl, curr_mem, addr, param, param_type);
518                                 mem = new_r_Proj(irg, bl, mem, mode_M, pn_CopyB_M_regular);
519                         }
520
521                         curr_ofs += param_size;
522
523                         if (do_seq)
524                                 curr_mem = mem;
525                         else
526                                 obstack_ptr_grow(obst, mem);
527                 }
528
529                 in = (ir_node **) obstack_finish(obst);
530
531                 /* We need the sync only, if we didn't build the stores sequentially. */
532                 if(!do_seq)
533                         curr_mem = new_r_Sync(irg, bl, n_pos, in);
534                 obstack_free(obst, in);
535         }
536
537         /* Collect caller save registers */
538         for(i = 0, n = arch_isa_get_n_reg_class(isa); i < n; ++i) {
539                 int j;
540                 const arch_register_class_t *cls = arch_isa_get_reg_class(isa, i);
541                 for(j = 0; j < cls->n_regs; ++j) {
542                         const arch_register_t *reg = arch_register_for_index(cls, j);
543                         if(arch_register_type_is(reg, caller_save))
544                                 pset_insert_ptr(caller_save, (void *) reg);
545                 }
546         }
547
548         /* search the greatest result proj number */
549
550         /* TODO: what if the result is NOT used? Currently there is
551          * no way to detect this later, especially there is no way to
552          * see this in the proj numbers.
553          * While this is ok for the register allocator, it is bad for
554          * backends which need to change the be_Call further (x87 simulator
555          * for instance. However for this particular case the call_type is
556          * sufficient.).
557          */
558         foreach_out_edge(irn, edge) {
559                 const ir_edge_t *res_edge;
560                 ir_node *irn = get_edge_src_irn(edge);
561
562                 if(is_Proj(irn) && get_Proj_proj(irn) == pn_Call_T_result) {
563                         res_proj = irn;
564                         foreach_out_edge(irn, res_edge) {
565                                 int proj;
566                                 be_abi_call_arg_t *arg;
567                                 ir_node *res = get_edge_src_irn(res_edge);
568
569                                 assert(is_Proj(res));
570
571                                 proj = get_Proj_proj(res);
572                                 arg = get_call_arg(call, 1, proj);
573
574                                 /*
575                                         shift the proj number to the right, since we will drop the
576                                         unspeakable Proj_T from the Call. Therefore, all real argument
577                                         Proj numbers must be increased by pn_be_Call_first_res
578                                 */
579                                 proj += pn_be_Call_first_res;
580                                 set_Proj_proj(res, proj);
581                                 obstack_ptr_grow(obst, res);
582
583                                 if(proj > curr_res_proj)
584                                         curr_res_proj = proj;
585                                 if(arg->in_reg) {
586                                         pset_remove_ptr(caller_save, arg->reg);
587                                         //pmap_insert(arg_regs, arg->reg, INT_TO_PTR(proj + 1))
588                                 }
589                         }
590                 }
591         }
592
593         curr_res_proj++;
594         obstack_ptr_grow(obst, NULL);
595         res_projs = obstack_finish(obst);
596
597         /* make the back end call node and set its register requirements. */
598         for(i = 0; i < n_low_args; ++i)
599                 obstack_ptr_grow(obst, get_Call_param(irn, low_args[i]));
600
601         in = obstack_finish(obst);
602
603         if(env->call->flags.bits.call_has_imm && get_irn_opcode(call_ptr) == iro_SymConst) {
604                 low_call = be_new_Call(get_irn_dbg_info(irn), irg, bl, curr_mem, curr_sp, curr_sp,
605                                        curr_res_proj + pset_count(caller_save), n_low_args, in,
606                                        get_Call_type(irn));
607                 be_Call_set_entity(low_call, get_SymConst_entity(call_ptr));
608         }
609
610         else
611                 low_call = be_new_Call(get_irn_dbg_info(irn), irg, bl, curr_mem, curr_sp, call_ptr,
612                                        curr_res_proj + pset_count(caller_save), n_low_args, in,
613                                        get_Call_type(irn));
614
615         /*
616                 TODO:
617                 Set the register class of the call address to the same as the stack pointer's.
618                 That' probably buggy for some architectures.
619         */
620         be_node_set_reg_class(low_call, be_pos_Call_ptr, sp->reg_class);
621
622         DBG((env->dbg, LEVEL_3, "\tcreated backend call %+F\n", low_call));
623
624         /* Set the register classes and constraints of the Call parameters. */
625         for(i = 0; i < n_low_args; ++i) {
626                 int index = low_args[i];
627                 be_abi_call_arg_t *arg = get_call_arg(call, 0, index);
628                 assert(arg->reg != NULL);
629
630                 be_set_constr_single_reg(low_call, be_pos_Call_first_arg + index, arg->reg);
631         }
632
633         /* Set the register constraints of the results. */
634         for(i = 0; res_projs[i]; ++i) {
635                 ir_node *irn                 = res_projs[i];
636                 int proj                     = get_Proj_proj(irn);
637
638                 /* Correct Proj number since it has been adjusted! (see above) */
639                 const be_abi_call_arg_t *arg = get_call_arg(call, 1, proj - pn_Call_max);
640
641                 assert(arg->in_reg);
642                 be_set_constr_single_reg(low_call, BE_OUT_POS(proj), arg->reg);
643         }
644         obstack_free(obst, in);
645         exchange(irn, low_call);
646
647         /* redirect the result projs to the lowered call instead of the Proj_T */
648         for(i = 0; res_projs[i]; ++i)
649                 set_Proj_pred(res_projs[i], low_call);
650
651         /* Make additional projs for the caller save registers
652            and the Keep node which keeps them alive. */
653         if(pset_count(caller_save) > 0) {
654                 const arch_register_t *reg;
655                 ir_node **in, *keep;
656                 int i, n;
657
658                 for(reg = pset_first(caller_save), n = 0; reg; reg = pset_next(caller_save), ++n) {
659                         ir_node *proj = new_r_Proj(irg, bl, low_call, reg->reg_class->mode, curr_res_proj);
660
661                         /* memorize the register in the link field. we need afterwards to set the register class of the keep correctly. */
662                         be_set_constr_single_reg(low_call, BE_OUT_POS(curr_res_proj), reg);
663                         set_irn_link(proj, (void *) reg);
664                         obstack_ptr_grow(obst, proj);
665                         curr_res_proj++;
666                 }
667
668                 in   = (ir_node **) obstack_finish(obst);
669                 keep = be_new_Keep(NULL, irg, bl, n, in);
670                 for(i = 0; i < n; ++i) {
671                         const arch_register_t *reg = get_irn_link(in[i]);
672                         be_node_set_reg_class(keep, i, reg->reg_class);
673                 }
674                 obstack_free(obst, in);
675         }
676
677         /* Clean up the stack. */
678         if(stack_size > 0) {
679                 ir_node *mem_proj = NULL;
680
681                 foreach_out_edge(low_call, edge) {
682                         ir_node *irn = get_edge_src_irn(edge);
683                         if(is_Proj(irn) && get_Proj_proj(irn) == pn_Call_M) {
684                                 mem_proj = irn;
685                                 break;
686                         }
687                 }
688
689                 if(!mem_proj)
690                         mem_proj = new_r_Proj(irg, bl, low_call, mode_M, pn_Call_M);
691
692                  /* Clean up the stack frame if we allocated it */
693                 if(!no_alloc)
694                         curr_sp = be_new_IncSP(sp, irg, bl, curr_sp, mem_proj, stack_size, be_stack_dir_shrink);
695         }
696
697         be_abi_call_free(call);
698         obstack_free(obst, pos);
699         del_pset(results);
700         del_pset(caller_save);
701
702         return curr_sp;
703 }
704
705 /**
706  * Adjust an alloca.
707  * The alloca is transformed into a back end alloca node and connected to the stack nodes.
708  */
709 static ir_node *adjust_alloc(be_abi_irg_t *env, ir_node *alloc, ir_node *curr_sp)
710 {
711         if (get_Alloc_where(alloc) == stack_alloc) {
712                 ir_node *bl        = get_nodes_block(alloc);
713                 ir_graph *irg      = get_irn_irg(bl);
714                 ir_node *alloc_mem = NULL;
715                 ir_node *alloc_res = NULL;
716
717                 const ir_edge_t *edge;
718                 ir_node *new_alloc;
719
720                 foreach_out_edge(alloc, edge) {
721                         ir_node *irn = get_edge_src_irn(edge);
722
723                         assert(is_Proj(irn));
724                         switch(get_Proj_proj(irn)) {
725                         case pn_Alloc_M:
726                                 alloc_mem = irn;
727                                 break;
728                         case pn_Alloc_res:
729                                 alloc_res = irn;
730                                 break;
731                         default:
732                                 break;
733                         }
734                 }
735
736                 /* Beware: currently Alloc nodes without a result might happen,
737                    only escape analysis kills them and this phase runs only for object
738                    oriented source. We kill the Alloc here. */
739                 if (alloc_res == NULL) {
740                         exchange(alloc_mem, get_Alloc_mem(alloc));
741                         return curr_sp;
742                 }
743
744                 /* The stack pointer will be modified in an unknown manner.
745                    We cannot omit it. */
746                 env->call->flags.bits.try_omit_fp = 0;
747                 new_alloc = be_new_AddSP(env->isa->sp, irg, bl, curr_sp, get_Alloc_size(alloc));
748
749                 exchange(alloc_res, env->isa->stack_dir < 0 ? new_alloc : curr_sp);
750
751                 if(alloc_mem != NULL)
752                         exchange(alloc_mem, new_r_NoMem(irg));
753
754                 curr_sp = new_alloc;
755         }
756
757         return curr_sp;
758 }
759
760 /* the following function is replaced by the usage of the heights module */
761 #if 0
762 /**
763  * Walker for dependent_on().
764  * This function searches a node tgt recursively from a given node
765  * but is restricted to the given block.
766  * @return 1 if tgt was reachable from curr, 0 if not.
767  */
768 static int check_dependence(ir_node *curr, ir_node *tgt, ir_node *bl)
769 {
770         int n, i;
771
772         if (get_nodes_block(curr) != bl)
773                 return 0;
774
775         if (curr == tgt)
776                 return 1;
777
778         /* Phi functions stop the recursion inside a basic block */
779         if (! is_Phi(curr)) {
780                 for(i = 0, n = get_irn_arity(curr); i < n; ++i) {
781                         if (check_dependence(get_irn_n(curr, i), tgt, bl))
782                                 return 1;
783                 }
784         }
785
786         return 0;
787 }
788 #endif /* if 0 */
789
790 /**
791  * Check if a node is somehow data dependent on another one.
792  * both nodes must be in the same basic block.
793  * @param n1 The first node.
794  * @param n2 The second node.
795  * @return 1, if n1 is data dependent (transitively) on n2, 0 if not.
796  */
797 static int dependent_on(ir_node *n1, ir_node *n2)
798 {
799         ir_node *bl   = get_nodes_block(n1);
800         ir_graph *irg = get_irn_irg(bl);
801
802         assert(bl == get_nodes_block(n2));
803
804         return heights_reachable_in_block(ir_heights, n1, n2);
805         //return check_dependence(n1, n2, bl);
806 }
807
808 static int cmp_call_dependecy(const void *c1, const void *c2)
809 {
810         ir_node *n1 = *(ir_node **) c1;
811         ir_node *n2 = *(ir_node **) c2;
812
813         /*
814                 Classical qsort() comparison function behavior:
815                 0  if both elements are equal
816                 1  if second is "smaller" that first
817                 -1 if first is "smaller" that second
818         */
819         if (dependent_on(n1, n2))
820                 return -1;
821
822         if (dependent_on(n2, n1))
823                 return 1;
824
825         return 0;
826 }
827
828 /**
829  * Walker: links all Call nodes to the Block they are contained.
830  */
831 static void link_calls_in_block_walker(ir_node *irn, void *data)
832 {
833         if(is_Call(irn)) {
834                 be_abi_irg_t *env = data;
835                 ir_node *bl       = get_nodes_block(irn);
836                 void *save        = get_irn_link(bl);
837
838                 env->call->flags.bits.irg_is_leaf = 0;
839
840                 set_irn_link(irn, save);
841                 set_irn_link(bl, irn);
842         }
843 }
844
845 /**
846  * Block-walker:
847  * Process all Call nodes inside a basic block.
848  * Note that the link field of the block must contain a linked list of all
849  * Call nodes inside the Block. We first order this list according to data dependency
850  * and that connect the calls together.
851  */
852 static void process_calls_in_block(ir_node *bl, void *data)
853 {
854         be_abi_irg_t *env = data;
855         ir_node *curr_sp  = env->init_sp;
856         ir_node *irn;
857         int n;
858
859         for(irn = get_irn_link(bl), n = 0; irn; irn = get_irn_link(irn), ++n)
860                 obstack_ptr_grow(&env->obst, irn);
861
862         /* If there were call nodes in the block. */
863         if(n > 0) {
864                 ir_node *keep;
865                 ir_node **nodes;
866                 int i;
867
868                 nodes = obstack_finish(&env->obst);
869
870                 /* order the call nodes according to data dependency */
871                 qsort(nodes, n, sizeof(nodes[0]), cmp_call_dependecy);
872
873                 for(i = n - 1; i >= 0; --i) {
874                         ir_node *irn = nodes[i];
875
876                         DBG((env->dbg, LEVEL_3, "\tprocessing call %+F\n", irn));
877                         switch(get_irn_opcode(irn)) {
878                         case iro_Call:
879                                 curr_sp = adjust_call(env, irn, curr_sp);
880                                 break;
881                         case iro_Alloc:
882                                 curr_sp = adjust_alloc(env, irn, curr_sp);
883                                 break;
884                         default:
885                                 break;
886                         }
887                 }
888
889                 obstack_free(&env->obst, nodes);
890
891                 /* Keep the last stack state in the block by tying it to Keep node */
892                 nodes[0] = curr_sp;
893                 keep     = be_new_Keep(env->isa->sp->reg_class, get_irn_irg(bl), bl, 1, nodes);
894                 pmap_insert(env->keep_map, bl, keep);
895         }
896
897         set_irn_link(bl, curr_sp);
898 }
899
900 /**
901  * Adjust all call nodes in the graph to the ABI conventions.
902  */
903 static void process_calls(be_abi_irg_t *env)
904 {
905         ir_graph *irg = env->birg->irg;
906
907         env->call->flags.bits.irg_is_leaf = 1;
908         irg_walk_graph(irg, firm_clear_link, link_calls_in_block_walker, env);
909
910         ir_heights = heights_new(env->birg->irg);
911         irg_block_walk_graph(irg, NULL, process_calls_in_block, env);
912         heights_free(ir_heights);
913 }
914
915 static void collect_return_walker(ir_node *irn, void *data)
916 {
917         if(get_irn_opcode(irn) == iro_Return) {
918                 struct obstack *obst = data;
919                 obstack_ptr_grow(obst, irn);
920         }
921 }
922
923 #if 0 /*
924 static ir_node *setup_frame(be_abi_irg_t *env)
925 {
926         const arch_isa_t *isa = env->birg->main_env->arch_env->isa;
927         const arch_register_t *sp = isa->sp;
928         const arch_register_t *bp = isa->bp;
929         be_abi_call_flags_bits_t flags = env->call->flags.bits;
930         ir_graph *irg      = env->birg->irg;
931         ir_node *bl        = get_irg_start_block(irg);
932         ir_node *no_mem    = get_irg_no_mem(irg);
933         ir_node *old_frame = get_irg_frame(irg);
934         ir_node *stack     = pmap_get(env->regs, (void *) sp);
935         ir_node *frame     = pmap_get(env->regs, (void *) bp);
936
937         int stack_nr       = get_Proj_proj(stack);
938
939         if(flags.try_omit_fp) {
940                 stack = be_new_IncSP(sp, irg, bl, stack, no_mem, BE_STACK_FRAME_SIZE, be_stack_dir_expand);
941                 frame = stack;
942         }
943
944         else {
945                 frame = be_new_Copy(bp->reg_class, irg, bl, stack);
946
947                 be_node_set_flags(frame, -1, arch_irn_flags_dont_spill);
948                 if(!flags.fp_free) {
949                         be_set_constr_single_reg(frame, -1, bp);
950                         be_node_set_flags(frame, -1, arch_irn_flags_ignore);
951                         arch_set_irn_register(env->birg->main_env->arch_env, frame, bp);
952                 }
953
954                 stack = be_new_IncSP(sp, irg, bl, stack, frame, BE_STACK_FRAME_SIZE, be_stack_dir_expand);
955         }
956
957         be_node_set_flags(env->reg_params, -(stack_nr + 1), arch_irn_flags_ignore);
958         env->init_sp = stack;
959         set_irg_frame(irg, frame);
960         edges_reroute(old_frame, frame, irg);
961
962         return frame;
963 }
964
965 static void clearup_frame(be_abi_irg_t *env, ir_node *ret, pmap *reg_map, struct obstack *obst)
966 {
967         const arch_isa_t *isa = env->birg->main_env->arch_env->isa;
968         const arch_register_t *sp = isa->sp;
969         const arch_register_t *bp = isa->bp;
970         ir_graph *irg      = env->birg->irg;
971         ir_node *ret_mem   = get_Return_mem(ret);
972         ir_node *frame     = get_irg_frame(irg);
973         ir_node *bl        = get_nodes_block(ret);
974         ir_node *stack     = get_irn_link(bl);
975
976         pmap_entry *ent;
977
978         if(env->call->flags.bits.try_omit_fp) {
979                 stack = be_new_IncSP(sp, irg, bl, stack, ret_mem, BE_STACK_FRAME_SIZE, be_stack_dir_shrink);
980         }
981
982         else {
983                 stack = be_new_SetSP(sp, irg, bl, stack, frame, ret_mem);
984                 be_set_constr_single_reg(stack, -1, sp);
985                 be_node_set_flags(stack, -1, arch_irn_flags_ignore);
986         }
987
988         pmap_foreach(env->regs, ent) {
989                 const arch_register_t *reg = ent->key;
990                 ir_node *irn               = ent->value;
991
992                 if(reg == sp)
993                         obstack_ptr_grow(&env->obst, stack);
994                 else if(reg == bp)
995                         obstack_ptr_grow(&env->obst, frame);
996                 else if(arch_register_type_is(reg, callee_save) || arch_register_type_is(reg, ignore))
997                         obstack_ptr_grow(obst, irn);
998         }
999 }
1000 */
1001 #endif
1002
1003 /**
1004  * Computes the stack argument layout type.
1005  * Changes a possibly allocated value param type by moving
1006  * entities to the stack layout type.
1007  *
1008  * @param env          the ABI environment
1009  * @param call         the current call ABI
1010  * @param method_type  the method type
1011  *
1012  * @return the stack argument layout type
1013  */
1014 static ir_type *compute_arg_type(be_abi_irg_t *env, be_abi_call_t *call, ir_type *method_type)
1015 {
1016         int dir  = env->call->flags.bits.left_to_right ? 1 : -1;
1017         int inc  = env->birg->main_env->arch_env->isa->stack_dir * dir;
1018         int n    = get_method_n_params(method_type);
1019         int curr = inc > 0 ? 0 : n - 1;
1020         int ofs  = 0;
1021
1022         char buf[128];
1023         ir_type *res;
1024         int i;
1025         ir_type *val_param_tp = get_method_value_param_type(method_type);
1026         ident *id = get_entity_ident(get_irg_entity(env->birg->irg));
1027
1028         res = new_type_struct(mangle_u(id, new_id_from_chars("arg_type", 8)));
1029         for (i = 0; i < n; ++i, curr += inc) {
1030                 ir_type *param_type    = get_method_param_type(method_type, curr);
1031                 be_abi_call_arg_t *arg = get_call_arg(call, 0, curr);
1032
1033                 if (arg->on_stack) {
1034                         if (val_param_tp) {
1035                                 /* the entity was already created, move it to the param type */
1036                                 arg->stack_ent = get_method_value_param_ent(method_type, i);
1037                                 remove_struct_member(val_param_tp, arg->stack_ent);
1038                                 set_entity_owner(arg->stack_ent, res);
1039                                 add_struct_member(res, arg->stack_ent);
1040                                 /* must be automatic to set a fixed layout */
1041                                 set_entity_allocation(arg->stack_ent, allocation_automatic);
1042                         }
1043                         else {
1044                                 snprintf(buf, sizeof(buf), "param_%d", i);
1045                                 arg->stack_ent = new_entity(res, new_id_from_str(buf), param_type);
1046                         }
1047                         ofs += arg->space_before;
1048                         ofs = round_up2(ofs, arg->alignment);
1049                         set_entity_offset_bytes(arg->stack_ent, ofs);
1050                         ofs += arg->space_after;
1051                         ofs += get_type_size_bytes(param_type);
1052                 }
1053         }
1054         set_type_size_bytes(res, ofs);
1055         set_type_state(res, layout_fixed);
1056         return res;
1057 }
1058
1059 static void create_register_perms(const arch_isa_t *isa, ir_graph *irg, ir_node *bl, pmap *regs)
1060 {
1061         int i, j, n;
1062         struct obstack obst;
1063
1064         obstack_init(&obst);
1065
1066         /* Create a Perm after the RegParams node to delimit it. */
1067         for(i = 0, n = arch_isa_get_n_reg_class(isa); i < n; ++i) {
1068                 const arch_register_class_t *cls = arch_isa_get_reg_class(isa, i);
1069                 ir_node *perm;
1070                 ir_node **in;
1071                 int n_regs;
1072
1073                 for(n_regs = 0, j = 0; j < cls->n_regs; ++j) {
1074                         const arch_register_t *reg = &cls->regs[j];
1075                         ir_node *irn = pmap_get(regs, (void *) reg);
1076
1077                         if(irn && !arch_register_type_is(reg, ignore)) {
1078                                 n_regs++;
1079                                 obstack_ptr_grow(&obst, irn);
1080                                 set_irn_link(irn, (void *) reg);
1081                         }
1082                 }
1083
1084                 obstack_ptr_grow(&obst, NULL);
1085                 in = obstack_finish(&obst);
1086                 if(n_regs > 0) {
1087                         perm = be_new_Perm(cls, irg, bl, n_regs, in);
1088                         for(j = 0; j < n_regs; ++j) {
1089                                 ir_node *arg = in[j];
1090                                 arch_register_t *reg = get_irn_link(arg);
1091                                 pmap_insert(regs, reg, arg);
1092                                 be_set_constr_single_reg(perm, BE_OUT_POS(j), reg);
1093                         }
1094                 }
1095                 obstack_free(&obst, in);
1096         }
1097
1098         obstack_free(&obst, NULL);
1099 }
1100
1101 typedef struct {
1102         const arch_register_t *reg;
1103         ir_node *irn;
1104 } reg_node_map_t;
1105
1106 static int cmp_regs(const void *a, const void *b)
1107 {
1108         const reg_node_map_t *p = a;
1109         const reg_node_map_t *q = b;
1110
1111         if(p->reg->reg_class == q->reg->reg_class)
1112                 return p->reg->index - q->reg->index;
1113         else
1114                 return p->reg->reg_class - q->reg->reg_class;
1115 }
1116
1117 static reg_node_map_t *reg_map_to_arr(struct obstack *obst, pmap *reg_map)
1118 {
1119         pmap_entry *ent;
1120         int n = pmap_count(reg_map);
1121         int i = 0;
1122         reg_node_map_t *res = obstack_alloc(obst, n * sizeof(res[0]));
1123
1124         pmap_foreach(reg_map, ent) {
1125                 res[i].reg = ent->key;
1126                 res[i].irn = ent->value;
1127                 i++;
1128         }
1129
1130         qsort(res, n, sizeof(res[0]), cmp_regs);
1131         return res;
1132 }
1133
1134 /**
1135  * Creates a barrier.
1136  */
1137 static ir_node *create_barrier(be_abi_irg_t *env, ir_node *bl, ir_node **mem, pmap *regs, int in_req)
1138 {
1139         ir_graph *irg = env->birg->irg;
1140         int n_regs    = pmap_count(regs);
1141         int n;
1142         ir_node *irn;
1143         ir_node **in;
1144         reg_node_map_t *rm;
1145
1146         rm = reg_map_to_arr(&env->obst, regs);
1147
1148         for(n = 0; n < n_regs; ++n)
1149                 obstack_ptr_grow(&env->obst, rm[n].irn);
1150
1151         if(mem) {
1152                 obstack_ptr_grow(&env->obst, *mem);
1153                 n++;
1154         }
1155
1156         in = (ir_node **) obstack_finish(&env->obst);
1157         irn = be_new_Barrier(irg, bl, n, in);
1158         obstack_free(&env->obst, in);
1159
1160         for(n = 0; n < n_regs; ++n) {
1161                 const arch_register_t *reg = rm[n].reg;
1162                 int flags                  = 0;
1163                 int pos                    = BE_OUT_POS(n);
1164                 ir_node *proj;
1165
1166                 proj = new_r_Proj(irg, bl, irn, get_irn_mode(rm[n].irn), n);
1167                 be_node_set_reg_class(irn, n, reg->reg_class);
1168                 if(in_req)
1169                         be_set_constr_single_reg(irn, n, reg);
1170                 be_set_constr_single_reg(irn, pos, reg);
1171                 be_node_set_reg_class(irn, pos, reg->reg_class);
1172                 arch_set_irn_register(env->birg->main_env->arch_env, proj, reg);
1173
1174                 /* if the proj projects a ignore register or a node which is set to ignore, propagate this property. */
1175                 if(arch_register_type_is(reg, ignore) || arch_irn_is(env->birg->main_env->arch_env, in[n], ignore))
1176                         flags |= arch_irn_flags_ignore;
1177
1178                 if(arch_irn_is(env->birg->main_env->arch_env, in[n], modify_sp))
1179                         flags |= arch_irn_flags_modify_sp;
1180
1181                 be_node_set_flags(irn, pos, flags);
1182
1183                 pmap_insert(regs, (void *) reg, proj);
1184         }
1185
1186         if(mem) {
1187                 *mem = new_r_Proj(irg, bl, irn, mode_M, n);
1188         }
1189
1190         obstack_free(&env->obst, rm);
1191         return irn;
1192 }
1193
1194 /**
1195  * Creates a be_Return for a Return node.
1196  *
1197  * @param @env    the abi environment
1198  * @param irn     the Return node or NULL if there was none
1199  * @param bl      the block where the be_Retun should be placed
1200  * @param mem     the current memory
1201  * @param n_res   number of return results
1202  */
1203 static ir_node *create_be_return(be_abi_irg_t *env, ir_node *irn, ir_node *bl, ir_node *mem, int n_res) {
1204         be_abi_call_t *call = env->call;
1205         const arch_isa_t *isa = env->birg->main_env->arch_env->isa;
1206
1207         pmap *reg_map  = pmap_create();
1208         ir_node *keep  = pmap_get(env->keep_map, bl);
1209         int in_max;
1210         ir_node *ret;
1211         int i, n;
1212         ir_node **in;
1213         ir_node *stack;
1214         const arch_register_t **regs;
1215         pmap_entry *ent ;
1216
1217         /*
1218                 get the valid stack node in this block.
1219                 If we had a call in that block there is a Keep constructed by process_calls()
1220                 which points to the last stack modification in that block. we'll use
1221                 it then. Else we use the stack from the start block and let
1222                 the ssa construction fix the usage.
1223         */
1224         stack = be_abi_reg_map_get(env->regs, isa->sp);
1225         if (keep) {
1226                 ir_node *bad = new_r_Bad(env->birg->irg);
1227                 stack = get_irn_n(keep, 0);
1228                 set_nodes_block(keep, bad);
1229                 set_irn_n(keep, 0, bad);
1230                 // exchange(keep, new_r_Bad(env->birg->irg));
1231         }
1232
1233         /* Insert results for Return into the register map. */
1234         for(i = 0; i < n_res; ++i) {
1235                 ir_node *res           = get_Return_res(irn, i);
1236                 be_abi_call_arg_t *arg = get_call_arg(call, 1, i);
1237                 assert(arg->in_reg && "return value must be passed in register");
1238                 pmap_insert(reg_map, (void *) arg->reg, res);
1239         }
1240
1241         /* Add uses of the callee save registers. */
1242         pmap_foreach(env->regs, ent) {
1243                 const arch_register_t *reg = ent->key;
1244                 if(arch_register_type_is(reg, callee_save) || arch_register_type_is(reg, ignore))
1245                         pmap_insert(reg_map, ent->key, ent->value);
1246         }
1247
1248         be_abi_reg_map_set(reg_map, isa->sp, stack);
1249
1250         /* Make the Epilogue node and call the arch's epilogue maker. */
1251         create_barrier(env, bl, &mem, reg_map, 1);
1252         call->cb->epilogue(env->cb, bl, &mem, reg_map);
1253
1254         /*
1255                 Maximum size of the in array for Return nodes is
1256                 return args + callee save/ignore registers + memory + stack pointer
1257         */
1258         in_max = pmap_count(reg_map) + n_res + 2;
1259
1260         in   = obstack_alloc(&env->obst, in_max * sizeof(in[0]));
1261         regs = obstack_alloc(&env->obst, in_max * sizeof(regs[0]));
1262
1263         in[0]   = mem;
1264         in[1]   = be_abi_reg_map_get(reg_map, isa->sp);
1265         regs[0] = NULL;
1266         regs[1] = isa->sp;
1267         n       = 2;
1268
1269         /* clear SP entry, since it has already been grown. */
1270         pmap_insert(reg_map, (void *) isa->sp, NULL);
1271         for(i = 0; i < n_res; ++i) {
1272                 ir_node *res           = get_Return_res(irn, i);
1273                 be_abi_call_arg_t *arg = get_call_arg(call, 1, i);
1274
1275                 in[n]     = be_abi_reg_map_get(reg_map, arg->reg);
1276                 regs[n++] = arg->reg;
1277
1278                 /* Clear the map entry to mark the register as processed. */
1279                 be_abi_reg_map_set(reg_map, arg->reg, NULL);
1280         }
1281
1282         /* grow the rest of the stuff. */
1283         pmap_foreach(reg_map, ent) {
1284                 if(ent->value) {
1285                         in[n]     = ent->value;
1286                         regs[n++] = ent->key;
1287                 }
1288         }
1289
1290         /* The in array for the new back end return is now ready. */
1291         ret = be_new_Return(irn ? get_irn_dbg_info(irn) : NULL, env->birg->irg, bl, n_res, n, in);
1292
1293         /* Set the register classes of the return's parameter accordingly. */
1294         for(i = 0; i < n; ++i)
1295                 if(regs[i])
1296                         be_node_set_reg_class(ret, i, regs[i]->reg_class);
1297
1298         /* Free the space of the Epilog's in array and the register <-> proj map. */
1299         obstack_free(&env->obst, in);
1300         pmap_destroy(reg_map);
1301
1302         return ret;
1303 }
1304
1305 typedef struct lower_frame_sels_env_t {
1306         be_abi_irg_t *env;
1307         entity       *value_param_list;  /**< the list of all value param antities */
1308 } lower_frame_sels_env_t;
1309
1310 /**
1311  * Walker: Replaces Sels of frame type and
1312  * value param type entities by FrameAddress.
1313  */
1314 static void lower_frame_sels_walker(ir_node *irn, void *data)
1315 {
1316         lower_frame_sels_env_t *ctx = data;
1317
1318         if (is_Sel(irn)) {
1319                 ir_graph *irg        = current_ir_graph;
1320                 ir_node  *frame      = get_irg_frame(irg);
1321                 ir_node  *param_base = get_irg_value_param_base(irg);
1322                 ir_node  *ptr        = get_Sel_ptr(irn);
1323
1324                 if (ptr == frame || ptr == param_base) {
1325                         be_abi_irg_t *env = ctx->env;
1326                         entity       *ent = get_Sel_entity(irn);
1327                         ir_node      *bl  = get_nodes_block(irn);
1328                         ir_node      *nw;
1329
1330                         nw = be_new_FrameAddr(env->isa->sp->reg_class, irg, bl, frame, ent);
1331                         exchange(irn, nw);
1332
1333                         if (ptr == param_base) {
1334                                 set_entity_link(ent, ctx->value_param_list);
1335                                 ctx->value_param_list = ent;
1336                         }
1337                 }
1338         }
1339 }
1340
1341 /**
1342  * Check if a value parameter is transmitted as a register.
1343  * This might happen if the address of an parameter is taken which is
1344  * transmitted in registers.
1345  *
1346  * Note that on some architectures this case must be handled specially
1347  * because the place of the backing store is determined by their ABI.
1348  *
1349  * In the default case we move the entity to the frame type and create
1350  * a backing store into the first block.
1351  */
1352 static void fix_address_of_parameter_access(be_abi_irg_t *env, entity *value_param_list) {
1353         be_abi_call_t *call = env->call;
1354         ir_graph *irg       = env->birg->irg;
1355         entity *ent, *next_ent, *new_list;
1356         ir_type *frame_tp;
1357         DEBUG_ONLY(firm_dbg_module_t *dbg = env->dbg;)
1358
1359         new_list = NULL;
1360         for (ent = value_param_list; ent; ent = next_ent) {
1361                 int i = get_struct_member_index(get_entity_owner(ent), ent);
1362                 be_abi_call_arg_t *arg = get_call_arg(call, 0, i);
1363
1364                 next_ent = get_entity_link(ent);
1365                 if (arg->in_reg) {
1366                         DBG((dbg, LEVEL_2, "\targ #%d need backing store\n", i));
1367                         set_entity_link(ent, new_list);
1368                         new_list = ent;
1369                 }
1370         }
1371         if (new_list) {
1372                 /* ok, change the graph */
1373                 ir_node *start_bl = get_irg_start_block(irg);
1374                 ir_node *first_bl = NULL;
1375                 ir_node *frame, *imem, *nmem, *store, *mem, *args, *args_bl;
1376                 const ir_edge_t *edge;
1377                 optimization_state_t state;
1378                 int offset;
1379
1380                 foreach_block_succ(start_bl, edge) {
1381                         ir_node *succ = get_edge_src_irn(edge);
1382                         if (start_bl != succ) {
1383                                 first_bl = succ;
1384                                 break;
1385                         }
1386                 }
1387                 assert(first_bl);
1388                 /* we had already removed critical edges, so the following
1389                    assertion should be always true. */
1390                 assert(get_Block_n_cfgpreds(first_bl) == 1);
1391
1392                 /* now create backing stores */
1393                 frame = get_irg_frame(irg);
1394                 imem = get_irg_initial_mem(irg);
1395
1396                 save_optimization_state(&state);
1397                 set_optimize(0);
1398                 nmem = new_r_Proj(irg, first_bl, get_irg_start(irg), mode_M, pn_Start_M);
1399                 restore_optimization_state(&state);
1400
1401                 /* reroute all edges to the new memory source */
1402                 edges_reroute(imem, nmem, irg);
1403
1404                 store   = NULL;
1405                 mem     = imem;
1406                 args    = get_irg_args(irg);
1407                 args_bl = get_nodes_block(args);
1408                 for (ent = new_list; ent; ent = get_entity_link(ent)) {
1409                         int     i     = get_struct_member_index(get_entity_owner(ent), ent);
1410                         ir_type *tp   = get_entity_type(ent);
1411                         ir_mode *mode = get_type_mode(tp);
1412                         ir_node *addr;
1413
1414                         /* address for the backing store */
1415                         addr = be_new_FrameAddr(env->isa->sp->reg_class, irg, first_bl, frame, ent);
1416
1417                         if (store)
1418                                 mem = new_r_Proj(irg, first_bl, store, mode_M, pn_Store_M);
1419
1420                         /* the backing store itself */
1421                         store = new_r_Store(irg, first_bl, mem, addr,
1422                                             new_r_Proj(irg, args_bl, args, mode, i));
1423                 }
1424                 /* the new memory Proj gets the last Proj from store */
1425                 set_Proj_pred(nmem, store);
1426                 set_Proj_proj(nmem, pn_Store_M);
1427
1428                 /* move all entities to the frame type */
1429                 frame_tp = get_irg_frame_type(irg);
1430                 offset   = get_type_size_bytes(frame_tp);
1431                 for (ent = new_list; ent; ent = get_entity_link(ent)) {
1432                         ir_type *tp = get_entity_type(ent);
1433                         int align = get_type_alignment_bytes(tp);
1434
1435                         offset += align - 1;
1436                         offset &= -align;
1437                         set_entity_owner(ent, frame_tp);
1438                         add_class_member(frame_tp, ent);
1439                         /* must be automatic to set a fixed layout */
1440                         set_entity_allocation(ent, allocation_automatic);
1441                         set_entity_offset_bytes(ent, offset);
1442                         offset += get_type_size_bytes(tp);
1443                 }
1444                 set_type_size_bytes(frame_tp, offset);
1445         }
1446 }
1447
1448 /**
1449  * Modify the irg itself and the frame type.
1450  */
1451 static void modify_irg(be_abi_irg_t *env)
1452 {
1453         be_abi_call_t *call       = env->call;
1454         const arch_isa_t *isa     = env->birg->main_env->arch_env->isa;
1455         const arch_register_t *sp = arch_isa_sp(isa);
1456         ir_graph *irg             = env->birg->irg;
1457         ir_node *bl               = get_irg_start_block(irg);
1458         ir_node *end              = get_irg_end_block(irg);
1459         ir_node *no_mem           = get_irg_no_mem(irg);
1460         ir_node *mem              = get_irg_initial_mem(irg);
1461         ir_type *method_type      = get_entity_type(get_irg_entity(irg));
1462         pset *dont_save           = pset_new_ptr(8);
1463
1464         int n_params;
1465         int i, j, n;
1466
1467         reg_node_map_t *rm;
1468         const arch_register_t *fp_reg;
1469         ir_node *frame_pointer;
1470         ir_node *barrier;
1471         ir_node *reg_params_bl;
1472         ir_node **args;
1473         ir_node *arg_tuple;
1474         const ir_edge_t *edge;
1475         ir_type *arg_type, *bet_type;
1476         lower_frame_sels_env_t ctx;
1477
1478         bitset_t *used_proj_nr;
1479         DEBUG_ONLY(firm_dbg_module_t *dbg = env->dbg;)
1480
1481         DBG((dbg, LEVEL_1, "introducing abi on %+F\n", irg));
1482
1483         /* Convert the Sel nodes in the irg to frame load/store/addr nodes. */
1484         ctx.env              = env;
1485         ctx.value_param_list = NULL;
1486         irg_walk_graph(irg, lower_frame_sels_walker, NULL, &ctx);
1487
1488         env->frame = obstack_alloc(&env->obst, sizeof(env->frame[0]));
1489         env->regs  = pmap_create();
1490
1491         used_proj_nr = bitset_alloca(1024);
1492         n_params     = get_method_n_params(method_type);
1493         args         = obstack_alloc(&env->obst, n_params * sizeof(args[0]));
1494         memset(args, 0, n_params * sizeof(args[0]));
1495
1496         /* Check if a value parameter is transmitted as a register.
1497          * This might happen if the address of an parameter is taken which is
1498          * transmitted in registers.
1499          *
1500          * Note that on some architectures this case must be handled specially
1501          * because the place of the backing store is determined by their ABI.
1502          *
1503          * In the default case we move the entity to the frame type and create
1504          * a backing store into the first block.
1505          */
1506         fix_address_of_parameter_access(env, ctx.value_param_list);
1507
1508         /* Fill the argument vector */
1509         arg_tuple = get_irg_args(irg);
1510         foreach_out_edge(arg_tuple, edge) {
1511                 ir_node *irn = get_edge_src_irn(edge);
1512                 int nr       = get_Proj_proj(irn);
1513                 args[nr]     = irn;
1514                 DBG((dbg, LEVEL_2, "\treading arg: %d -> %+F\n", nr, irn));
1515         }
1516
1517         arg_type = compute_arg_type(env, call, method_type);
1518         bet_type = call->cb->get_between_type(env->cb);
1519         stack_frame_init(env->frame, arg_type, bet_type, get_irg_frame_type(irg), isa->stack_dir);
1520
1521         /* Count the register params and add them to the number of Projs for the RegParams node */
1522         for(i = 0; i < n_params; ++i) {
1523                 be_abi_call_arg_t *arg = get_call_arg(call, 0, i);
1524                 if(arg->in_reg && args[i]) {
1525                         assert(arg->reg != sp && "cannot use stack pointer as parameter register");
1526                         assert(i == get_Proj_proj(args[i]));
1527
1528                         /* For now, associate the register with the old Proj from Start representing that argument. */
1529                         pmap_insert(env->regs, (void *) arg->reg, args[i]);
1530                         bitset_set(used_proj_nr, i);
1531                         DBG((dbg, LEVEL_2, "\targ #%d -> reg %s\n", i, arg->reg->name));
1532                 }
1533         }
1534
1535         /* Collect all callee-save registers */
1536         for(i = 0, n = arch_isa_get_n_reg_class(isa); i < n; ++i) {
1537                 const arch_register_class_t *cls = arch_isa_get_reg_class(isa, i);
1538                 for(j = 0; j < cls->n_regs; ++j) {
1539                         const arch_register_t *reg = &cls->regs[j];
1540                         if(arch_register_type_is(reg, callee_save) || arch_register_type_is(reg, ignore))
1541                                 pmap_insert(env->regs, (void *) reg, NULL);
1542                 }
1543         }
1544
1545         pmap_insert(env->regs, (void *) sp, NULL);
1546         pmap_insert(env->regs, (void *) isa->bp, NULL);
1547         reg_params_bl   = get_irg_start_block(irg);
1548         env->reg_params = be_new_RegParams(irg, reg_params_bl, pmap_count(env->regs));
1549
1550         /*
1551          * make proj nodes for the callee save registers.
1552          * memorize them, since Return nodes get those as inputs.
1553          *
1554          * Note, that if a register corresponds to an argument, the regs map contains
1555          * the old Proj from start for that argument.
1556          */
1557
1558         rm = reg_map_to_arr(&env->obst, env->regs);
1559         for(i = 0, n = pmap_count(env->regs); i < n; ++i) {
1560                 arch_register_t *reg = (void *) rm[i].reg;
1561                 ir_node *arg_proj    = rm[i].irn;
1562                 ir_mode *mode        = arg_proj ? get_irn_mode(arg_proj) : reg->reg_class->mode;
1563                 long nr              = i;
1564                 int pos              = BE_OUT_POS((int) nr);
1565                 int flags            = 0;
1566
1567                 ir_node *proj;
1568
1569                 assert(nr >= 0);
1570                 bitset_set(used_proj_nr, nr);
1571                 proj = new_r_Proj(irg, reg_params_bl, env->reg_params, mode, nr);
1572                 pmap_insert(env->regs, (void *) reg, proj);
1573                 be_set_constr_single_reg(env->reg_params, pos, reg);
1574                 arch_set_irn_register(env->birg->main_env->arch_env, proj, reg);
1575
1576                 /*
1577                  * If the register is an ignore register,
1578                  * The Proj for that register shall also be ignored during register allocation.
1579                  */
1580                 if(arch_register_type_is(reg, ignore))
1581                         flags |= arch_irn_flags_ignore;
1582
1583                 if(reg == sp)
1584                         flags |= arch_irn_flags_modify_sp;
1585
1586                 be_node_set_flags(env->reg_params, pos, flags);
1587
1588                 DBG((dbg, LEVEL_2, "\tregister save proj #%d -> reg %s\n", nr, reg->name));
1589         }
1590         obstack_free(&env->obst, rm);
1591
1592         /* Generate the Prologue */
1593         fp_reg  = call->cb->prologue(env->cb, &mem, env->regs);
1594
1595         /* do the stack allocation BEFORE the barrier, or spill code
1596            might be added before it */
1597         env->init_sp  = be_abi_reg_map_get(env->regs, sp);
1598         env->init_sp = be_new_IncSP(sp, irg, bl, env->init_sp, no_mem, BE_STACK_FRAME_SIZE, be_stack_dir_expand);
1599         be_abi_reg_map_set(env->regs, sp, env->init_sp);
1600
1601         barrier = create_barrier(env, bl, &mem, env->regs, 0);
1602
1603         env->init_sp  = be_abi_reg_map_get(env->regs, sp);
1604         arch_set_irn_register(env->birg->main_env->arch_env, env->init_sp, sp);
1605
1606         frame_pointer = be_abi_reg_map_get(env->regs, fp_reg);
1607         set_irg_frame(irg, frame_pointer);
1608         pset_insert_ptr(env->ignore_regs, fp_reg);
1609
1610         /* Now, introduce stack param nodes for all parameters passed on the stack */
1611         for(i = 0; i < n_params; ++i) {
1612                 ir_node *arg_proj = args[i];
1613                 ir_node *repl     = NULL;
1614
1615                 if(arg_proj != NULL) {
1616                         be_abi_call_arg_t *arg;
1617                         ir_type *param_type;
1618                         int nr = get_Proj_proj(arg_proj);
1619
1620                         nr         = MIN(nr, n_params);
1621                         arg        = get_call_arg(call, 0, nr);
1622                         param_type = get_method_param_type(method_type, nr);
1623
1624                         if(arg->in_reg) {
1625                                 repl = pmap_get(env->regs, (void *) arg->reg);
1626                         }
1627
1628                         else if(arg->on_stack) {
1629                                 /* For atomic parameters which are actually used, we create a StackParam node. */
1630                                 if(is_atomic_type(param_type) && get_irn_n_edges(args[i]) > 0) {
1631                                         ir_mode *mode                    = get_type_mode(param_type);
1632                                         const arch_register_class_t *cls = arch_isa_get_reg_class_for_mode(isa, mode);
1633                                         repl = be_new_StackParam(cls, isa->bp->reg_class, irg, reg_params_bl, mode, frame_pointer, arg->stack_ent);
1634                                 }
1635
1636                                 /* The stack parameter is not primitive (it is a struct or array),
1637                                 we thus will create a node representing the parameter's address
1638                                 on the stack. */
1639                                 else {
1640                                         repl = be_new_FrameAddr(sp->reg_class, irg, reg_params_bl, frame_pointer, arg->stack_ent);
1641                                 }
1642                         }
1643
1644                         assert(repl != NULL);
1645                         edges_reroute(args[i], repl, irg);
1646                 }
1647         }
1648
1649         /* All Return nodes hang on the End node, so look for them there. */
1650         for (i = 0, n = get_Block_n_cfgpreds(end); i < n; ++i) {
1651                 ir_node *irn = get_Block_cfgpred(end, i);
1652
1653                 if (is_Return(irn)) {
1654                         ir_node *ret = create_be_return(env, irn, get_nodes_block(irn), get_Return_mem(irn), get_Return_n_ress(irn));
1655                         exchange(irn, ret);
1656                 }
1657         }
1658         /* if we have endless loops here, n might be <= 0. Do NOT create a be_Return than,
1659            the code is dead and will never be executed. */
1660
1661         del_pset(dont_save);
1662         obstack_free(&env->obst, args);
1663 }
1664
1665 /**
1666  * Walker: puts all Alloc(stack_alloc) on a obstack
1667  */
1668 static void collect_alloca_walker(ir_node *irn, void *data)
1669 {
1670         be_abi_irg_t *env = data;
1671         if(get_irn_opcode(irn) == iro_Alloc && get_Alloc_where(irn) == stack_alloc)
1672                 obstack_ptr_grow(&env->obst, irn);
1673 }
1674
1675 be_abi_irg_t *be_abi_introduce(be_irg_t *birg)
1676 {
1677         be_abi_irg_t *env  = xmalloc(sizeof(env[0]));
1678         ir_node *old_frame = get_irg_frame(birg->irg);
1679         ir_graph *irg      = birg->irg;
1680
1681         pmap_entry *ent;
1682         ir_node *dummy;
1683         optimization_state_t state;
1684
1685         obstack_init(&env->obst);
1686
1687         env->isa           = birg->main_env->arch_env->isa;
1688         env->method_type   = get_entity_type(get_irg_entity(irg));
1689         env->call          = be_abi_call_new();
1690         arch_isa_get_call_abi(env->isa, env->method_type, env->call);
1691
1692         env->ignore_regs      = pset_new_ptr_default();
1693         env->keep_map         = pmap_create();
1694         env->dce_survivor     = new_survive_dce();
1695         env->birg             = birg;
1696         env->stack_phis       = pset_new_ptr(16);
1697         /* Beware: later we replace this node by the real one, ensure it is not CSE'd
1698            to another Unknown or the stack pointer gets used */
1699         save_optimization_state(&state);
1700         set_optimize(0);
1701         env->init_sp = dummy  = new_r_Unknown(irg, env->isa->sp->reg_class->mode);
1702         restore_optimization_state(&state);
1703         FIRM_DBG_REGISTER(env->dbg, "firm.be.abi");
1704
1705         env->cb = env->call->cb->init(env->call, birg->main_env->arch_env, irg);
1706
1707         memcpy(&env->irn_handler, &abi_irn_handler, sizeof(abi_irn_handler));
1708         env->irn_ops.impl = &abi_irn_ops;
1709
1710         /* Lower all call nodes in the IRG. */
1711         process_calls(env);
1712
1713         /* Process the IRG */
1714         modify_irg(env);
1715
1716         /* We don't need the keep map anymore. */
1717         pmap_destroy(env->keep_map);
1718
1719         /* reroute the stack origin of the calls to the true stack origin. */
1720         edges_reroute(dummy, env->init_sp, irg);
1721         edges_reroute(old_frame, get_irg_frame(irg), irg);
1722
1723         /* Make some important node pointers survive the dead node elimination. */
1724         survive_dce_register_irn(env->dce_survivor, &env->init_sp);
1725         pmap_foreach(env->regs, ent)
1726                 survive_dce_register_irn(env->dce_survivor, (ir_node **) &ent->value);
1727
1728         arch_env_push_irn_handler(env->birg->main_env->arch_env, &env->irn_handler);
1729
1730         env->call->cb->done(env->cb);
1731         be_liveness(irg);
1732         return env;
1733 }
1734
1735 void be_abi_free(be_abi_irg_t *env)
1736 {
1737         free_survive_dce(env->dce_survivor);
1738         del_pset(env->stack_phis);
1739         del_pset(env->ignore_regs);
1740         pmap_destroy(env->regs);
1741         obstack_free(&env->obst, NULL);
1742         arch_env_pop_irn_handler(env->birg->main_env->arch_env);
1743         free(env);
1744 }
1745
1746 void be_abi_put_ignore_regs(be_abi_irg_t *abi, const arch_register_class_t *cls, bitset_t *bs)
1747 {
1748         arch_register_t *reg;
1749
1750         for(reg = pset_first(abi->ignore_regs); reg; reg = pset_next(abi->ignore_regs))
1751                 if(reg->reg_class == cls)
1752                         bitset_set(bs, reg->index);
1753 }
1754
1755
1756 /*
1757
1758   _____ _        ____  _             _
1759  |  ___(_)_  __ / ___|| |_ __ _  ___| | __
1760  | |_  | \ \/ / \___ \| __/ _` |/ __| |/ /
1761  |  _| | |>  <   ___) | || (_| | (__|   <
1762  |_|   |_/_/\_\ |____/ \__\__,_|\___|_|\_\
1763
1764 */
1765
1766 struct fix_stack_walker_info {
1767         nodeset *nodes;
1768         const arch_env_t *aenv;
1769 };
1770
1771 /**
1772  * Walker. Collect all stack modifying nodes.
1773  */
1774 static void collect_stack_nodes_walker(ir_node *irn, void *data)
1775 {
1776         struct fix_stack_walker_info *info = data;
1777
1778         if(arch_irn_is(info->aenv, irn, modify_sp))
1779                 pset_insert_ptr(info->nodes, irn);
1780 }
1781
1782 void be_abi_fix_stack_nodes(be_abi_irg_t *env)
1783 {
1784         dom_front_info_t *df;
1785         pset *stack_nodes = pset_new_ptr(16);
1786         struct fix_stack_walker_info info;
1787
1788         info.nodes = stack_nodes;
1789         info.aenv  = env->birg->main_env->arch_env;
1790
1791         /* We need dominance frontiers for fix up */
1792         df = be_compute_dominance_frontiers(env->birg->irg);
1793         irg_walk_graph(env->birg->irg, collect_stack_nodes_walker, NULL, &info);
1794         pset_insert_ptr(stack_nodes, env->init_sp);
1795         be_ssa_constr_set_phis(df, stack_nodes, env->stack_phis);
1796         del_pset(stack_nodes);
1797
1798         /* Liveness could have changed due to Phi nodes. */
1799         be_liveness(env->birg->irg);
1800
1801         /* free these dominance frontiers */
1802         be_free_dominance_frontiers(df);
1803 }
1804
1805 /**
1806  * Translates a direction of an IncSP node (either be_stack_dir_shrink, or ...expand)
1807  * into -1 or 1, respectively.
1808  * @param irn The node.
1809  * @return 1, if the direction of the IncSP was along, -1 if against.
1810  */
1811 static int get_dir(ir_node *irn)
1812 {
1813         return 1 - 2 * (be_get_IncSP_direction(irn) == be_stack_dir_shrink);
1814 }
1815
1816 static int process_stack_bias(be_abi_irg_t *env, ir_node *bl, int bias)
1817 {
1818         const arch_env_t *aenv = env->birg->main_env->arch_env;
1819         int omit_fp            = env->call->flags.bits.try_omit_fp;
1820         ir_node *irn;
1821
1822         sched_foreach(bl, irn) {
1823
1824                 /*
1825                         If the node modifies the stack pointer by a constant offset,
1826                         record that in the bias.
1827                 */
1828                 if(be_is_IncSP(irn)) {
1829                         int ofs = be_get_IncSP_offset(irn);
1830                         int dir = get_dir(irn);
1831
1832                         if(ofs == BE_STACK_FRAME_SIZE) {
1833                                 ofs = get_type_size_bytes(get_irg_frame_type(env->birg->irg));
1834                                 be_set_IncSP_offset(irn, ofs);
1835                         }
1836
1837                         if(omit_fp)
1838                                 bias += dir * ofs;
1839                 }
1840
1841                 /*
1842                         Else check, if the node relates to an entity on the stack frame.
1843                         If so, set the true offset (including the bias) for that
1844                         node.
1845                 */
1846                 else {
1847                         entity *ent = arch_get_frame_entity(aenv, irn);
1848                         if(ent) {
1849                                 int offset = get_stack_entity_offset(env->frame, ent, bias);
1850                                 arch_set_frame_offset(aenv, irn, offset);
1851                                 DBG((env->dbg, LEVEL_2, "%F has offset %d\n", ent, offset));
1852                         }
1853                 }
1854         }
1855
1856         return bias;
1857 }
1858
1859 /**
1860  * A helper struct for the bias walker.
1861  */
1862 struct bias_walk {
1863         be_abi_irg_t *env;     /**< The ABI irg environment. */
1864         int start_block_bias;  /**< The bias at the end of the start block. */
1865         ir_node *start_block;  /**< The start block of the current graph. */
1866 };
1867
1868 /**
1869  * Block-Walker: fix all stack offsets
1870  */
1871 static void stack_bias_walker(ir_node *bl, void *data)
1872 {
1873         struct bias_walk *bw = data;
1874         if (bl != bw->start_block) {
1875                 process_stack_bias(bw->env, bl, bw->start_block_bias);
1876         }
1877 }
1878
1879 void be_abi_fix_stack_bias(be_abi_irg_t *env)
1880 {
1881         ir_graph *irg  = env->birg->irg;
1882         struct bias_walk bw;
1883
1884         stack_frame_compute_initial_offset(env->frame);
1885         // stack_layout_dump(stdout, env->frame);
1886
1887         /* Determine the stack bias at the end of the start block. */
1888         bw.start_block_bias = process_stack_bias(env, get_irg_start_block(irg), 0);
1889
1890         /* fix the bias is all other blocks */
1891         bw.env = env;
1892         bw.start_block = get_irg_start_block(irg);
1893         irg_block_walk_graph(irg, stack_bias_walker, NULL, &bw);
1894 }
1895
1896 ir_node *be_abi_get_callee_save_irn(be_abi_irg_t *abi, const arch_register_t *reg)
1897 {
1898         assert(arch_register_type_is(reg, callee_save));
1899         assert(pmap_contains(abi->regs, (void *) reg));
1900         return pmap_get(abi->regs, (void *) reg);
1901 }
1902
1903 /*
1904   _____ _____  _   _   _    _                 _ _
1905  |_   _|  __ \| \ | | | |  | |               | | |
1906    | | | |__) |  \| | | |__| | __ _ _ __   __| | | ___ _ __
1907    | | |  _  /| . ` | |  __  |/ _` | '_ \ / _` | |/ _ \ '__|
1908   _| |_| | \ \| |\  | | |  | | (_| | | | | (_| | |  __/ |
1909  |_____|_|  \_\_| \_| |_|  |_|\__,_|_| |_|\__,_|_|\___|_|
1910
1911   for Phi nodes which are created due to stack modifying nodes
1912   such as IncSP, AddSP and SetSP.
1913
1914   These Phis are always to be ignored by the reg alloc and are
1915   fixed on the SP register of the ISA.
1916 */
1917
1918 static const void *abi_get_irn_ops(const arch_irn_handler_t *handler, const ir_node *irn)
1919 {
1920         const be_abi_irg_t *abi = get_abi_from_handler(handler);
1921         const void *res = NULL;
1922
1923         if(is_Phi(irn) && pset_find_ptr(abi->stack_phis, (void *) irn))
1924                 res = &abi->irn_ops;
1925
1926         return res;
1927 }
1928
1929 static void be_abi_limited(void *data, bitset_t *bs)
1930 {
1931         be_abi_irg_t *abi = data;
1932         bitset_clear_all(bs);
1933         bitset_set(bs, abi->isa->sp->index);
1934 }
1935
1936 static const arch_register_req_t *abi_get_irn_reg_req(const void *self, arch_register_req_t *req, const ir_node *irn, int pos)
1937 {
1938         be_abi_irg_t *abi          = get_abi_from_ops(self);
1939         const arch_register_t *reg = abi->isa->sp;
1940
1941         memset(req, 0, sizeof(req[0]));
1942
1943         if(pos == BE_OUT_POS(0)) {
1944                 req->cls         = reg->reg_class;
1945                 req->type        = arch_register_req_type_limited;
1946                 req->limited     = be_abi_limited;
1947                 req->limited_env = abi;
1948         }
1949
1950         else if(pos >= 0 && pos < get_irn_arity(irn)) {
1951                 req->cls  = reg->reg_class;
1952                 req->type = arch_register_req_type_normal;
1953         }
1954
1955         return req;
1956 }
1957
1958 static void abi_set_irn_reg(const void *self, ir_node *irn, const arch_register_t *reg)
1959 {
1960 }
1961
1962 static const arch_register_t *abi_get_irn_reg(const void *self, const ir_node *irn)
1963 {
1964         const be_abi_irg_t *abi = get_abi_from_ops(self);
1965         return abi->isa->sp;
1966 }
1967
1968 static arch_irn_class_t abi_classify(const void *_self, const ir_node *irn)
1969 {
1970         return arch_irn_class_normal;
1971 }
1972
1973 static arch_irn_flags_t abi_get_flags(const void *_self, const ir_node *irn)
1974 {
1975         return arch_irn_flags_ignore | arch_irn_flags_modify_sp;
1976 }
1977
1978 static entity *abi_get_frame_entity(const void *_self, const ir_node *irn)
1979 {
1980         return NULL;
1981 }
1982
1983 static void abi_set_stack_bias(const void *_self, ir_node *irn, int bias)
1984 {
1985 }
1986
1987 static const arch_irn_ops_if_t abi_irn_ops = {
1988         abi_get_irn_reg_req,
1989         abi_set_irn_reg,
1990         abi_get_irn_reg,
1991         abi_classify,
1992         abi_get_flags,
1993         abi_get_frame_entity,
1994         abi_set_stack_bias
1995 };
1996
1997 static const arch_irn_handler_t abi_irn_handler = {
1998         abi_get_irn_ops
1999 };