fcb5ad9f86581484e2cce45cee644d557ac329c3
[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(void)
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                 ir_node *addr;
720                 ir_node *copy;
721
722                 foreach_out_edge(alloc, edge) {
723                         ir_node *irn = get_edge_src_irn(edge);
724
725                         assert(is_Proj(irn));
726                         switch(get_Proj_proj(irn)) {
727                         case pn_Alloc_M:
728                                 alloc_mem = irn;
729                                 break;
730                         case pn_Alloc_res:
731                                 alloc_res = irn;
732                                 break;
733                         default:
734                                 break;
735                         }
736                 }
737
738                 /* Beware: currently Alloc nodes without a result might happen,
739                    only escape analysis kills them and this phase runs only for object
740                    oriented source. We kill the Alloc here. */
741                 if (alloc_res == NULL && alloc_mem) {
742                         exchange(alloc_mem, get_Alloc_mem(alloc));
743                         return curr_sp;
744                 }
745
746                 /* The stack pointer will be modified in an unknown manner.
747                    We cannot omit it. */
748                 env->call->flags.bits.try_omit_fp = 0;
749                 new_alloc = be_new_AddSP(env->isa->sp, irg, bl, curr_sp, get_Alloc_size(alloc));
750
751                 exchange(alloc, new_alloc);
752
753                 if(alloc_mem != NULL)
754                         set_Proj_proj(alloc_mem, pn_be_AddSP_M);
755
756                 /* fix projnum of alloca res */
757                 set_Proj_proj(alloc_res, pn_be_AddSP_res);
758
759                 addr = env->isa->stack_dir < 0 ? alloc_res : curr_sp;
760
761                 /* copy the address away, since it could be used after further stack pointer modifictions. */
762                 /* Let it point curr_sp just for the moment, I'll reroute it in a second. */
763                 copy = be_new_Copy(env->isa->sp->reg_class, irg, bl, curr_sp);
764
765                 /* Let all users of the Alloc() result now point to the copy. */
766                 edges_reroute(alloc_res, copy, irg);
767
768                 /* Rewire the copy appropriately. */
769                 set_irn_n(copy, be_pos_Copy_op, addr);
770
771                 curr_sp = alloc_res;
772         }
773
774         return curr_sp;
775 }
776
777 /* the following function is replaced by the usage of the heights module */
778 #if 0
779 /**
780  * Walker for dependent_on().
781  * This function searches a node tgt recursively from a given node
782  * but is restricted to the given block.
783  * @return 1 if tgt was reachable from curr, 0 if not.
784  */
785 static int check_dependence(ir_node *curr, ir_node *tgt, ir_node *bl)
786 {
787         int n, i;
788
789         if (get_nodes_block(curr) != bl)
790                 return 0;
791
792         if (curr == tgt)
793                 return 1;
794
795         /* Phi functions stop the recursion inside a basic block */
796         if (! is_Phi(curr)) {
797                 for(i = 0, n = get_irn_arity(curr); i < n; ++i) {
798                         if (check_dependence(get_irn_n(curr, i), tgt, bl))
799                                 return 1;
800                 }
801         }
802
803         return 0;
804 }
805 #endif /* if 0 */
806
807 /**
808  * Check if a node is somehow data dependent on another one.
809  * both nodes must be in the same basic block.
810  * @param n1 The first node.
811  * @param n2 The second node.
812  * @return 1, if n1 is data dependent (transitively) on n2, 0 if not.
813  */
814 static int dependent_on(ir_node *n1, ir_node *n2)
815 {
816         ir_node *bl   = get_nodes_block(n1);
817
818         assert(bl == get_nodes_block(n2));
819
820         return heights_reachable_in_block(ir_heights, n1, n2);
821         //return check_dependence(n1, n2, bl);
822 }
823
824 static int cmp_call_dependecy(const void *c1, const void *c2)
825 {
826         ir_node *n1 = *(ir_node **) c1;
827         ir_node *n2 = *(ir_node **) c2;
828
829         /*
830                 Classical qsort() comparison function behavior:
831                 0  if both elements are equal
832                 1  if second is "smaller" that first
833                 -1 if first is "smaller" that second
834         */
835         if (dependent_on(n1, n2))
836                 return -1;
837
838         if (dependent_on(n2, n1))
839                 return 1;
840
841         return 0;
842 }
843
844 /**
845  * Walker: links all Call nodes to the Block they are contained.
846  */
847 static void link_calls_in_block_walker(ir_node *irn, void *data)
848 {
849         if(is_Call(irn) || (get_irn_opcode(irn) == iro_Alloc && get_Alloc_where(irn) == stack_alloc)) {
850                 be_abi_irg_t *env = data;
851                 ir_node *bl       = get_nodes_block(irn);
852                 void *save        = get_irn_link(bl);
853
854                 if (is_Call(irn))
855                         env->call->flags.bits.irg_is_leaf = 0;
856
857                 set_irn_link(irn, save);
858                 set_irn_link(bl, irn);
859         }
860 }
861
862 /**
863  * Block-walker:
864  * Process all Call nodes inside a basic block.
865  * Note that the link field of the block must contain a linked list of all
866  * Call nodes inside the Block. We first order this list according to data dependency
867  * and that connect the calls together.
868  */
869 static void process_calls_in_block(ir_node *bl, void *data)
870 {
871         be_abi_irg_t *env = data;
872         ir_node *curr_sp  = env->init_sp;
873         ir_node *irn;
874         int n;
875
876         for(irn = get_irn_link(bl), n = 0; irn; irn = get_irn_link(irn), ++n)
877                 obstack_ptr_grow(&env->obst, irn);
878
879         /* If there were call nodes in the block. */
880         if(n > 0) {
881                 ir_node *keep;
882                 ir_node **nodes;
883                 int i;
884
885                 nodes = obstack_finish(&env->obst);
886
887                 /* order the call nodes according to data dependency */
888                 qsort(nodes, n, sizeof(nodes[0]), cmp_call_dependecy);
889
890                 for(i = n - 1; i >= 0; --i) {
891                         ir_node *irn = nodes[i];
892
893                         DBG((env->dbg, LEVEL_3, "\tprocessing call %+F\n", irn));
894                         switch(get_irn_opcode(irn)) {
895                         case iro_Call:
896                                 curr_sp = adjust_call(env, irn, curr_sp);
897                                 break;
898                         case iro_Alloc:
899                                 curr_sp = adjust_alloc(env, irn, curr_sp);
900                                 break;
901                         default:
902                                 break;
903                         }
904                 }
905
906                 obstack_free(&env->obst, nodes);
907
908                 /* Keep the last stack state in the block by tying it to Keep node */
909                 nodes[0] = curr_sp;
910                 keep     = be_new_Keep(env->isa->sp->reg_class, get_irn_irg(bl), bl, 1, nodes);
911                 pmap_insert(env->keep_map, bl, keep);
912         }
913
914         set_irn_link(bl, curr_sp);
915 }
916
917 /**
918  * Adjust all call nodes in the graph to the ABI conventions.
919  */
920 static void process_calls(be_abi_irg_t *env)
921 {
922         ir_graph *irg = env->birg->irg;
923
924         env->call->flags.bits.irg_is_leaf = 1;
925         irg_walk_graph(irg, firm_clear_link, link_calls_in_block_walker, env);
926
927         ir_heights = heights_new(env->birg->irg);
928         irg_block_walk_graph(irg, NULL, process_calls_in_block, env);
929         heights_free(ir_heights);
930 }
931
932 static void collect_return_walker(ir_node *irn, void *data)
933 {
934         if(get_irn_opcode(irn) == iro_Return) {
935                 struct obstack *obst = data;
936                 obstack_ptr_grow(obst, irn);
937         }
938 }
939
940 #if 0 /*
941 static ir_node *setup_frame(be_abi_irg_t *env)
942 {
943         const arch_isa_t *isa = env->birg->main_env->arch_env->isa;
944         const arch_register_t *sp = isa->sp;
945         const arch_register_t *bp = isa->bp;
946         be_abi_call_flags_bits_t flags = env->call->flags.bits;
947         ir_graph *irg      = env->birg->irg;
948         ir_node *bl        = get_irg_start_block(irg);
949         ir_node *no_mem    = get_irg_no_mem(irg);
950         ir_node *old_frame = get_irg_frame(irg);
951         ir_node *stack     = pmap_get(env->regs, (void *) sp);
952         ir_node *frame     = pmap_get(env->regs, (void *) bp);
953
954         int stack_nr       = get_Proj_proj(stack);
955
956         if(flags.try_omit_fp) {
957                 stack = be_new_IncSP(sp, irg, bl, stack, no_mem, BE_STACK_FRAME_SIZE, be_stack_dir_expand);
958                 frame = stack;
959         }
960
961         else {
962                 frame = be_new_Copy(bp->reg_class, irg, bl, stack);
963
964                 be_node_set_flags(frame, -1, arch_irn_flags_dont_spill);
965                 if(!flags.fp_free) {
966                         be_set_constr_single_reg(frame, -1, bp);
967                         be_node_set_flags(frame, -1, arch_irn_flags_ignore);
968                         arch_set_irn_register(env->birg->main_env->arch_env, frame, bp);
969                 }
970
971                 stack = be_new_IncSP(sp, irg, bl, stack, frame, BE_STACK_FRAME_SIZE, be_stack_dir_expand);
972         }
973
974         be_node_set_flags(env->reg_params, -(stack_nr + 1), arch_irn_flags_ignore);
975         env->init_sp = stack;
976         set_irg_frame(irg, frame);
977         edges_reroute(old_frame, frame, irg);
978
979         return frame;
980 }
981
982 static void clearup_frame(be_abi_irg_t *env, ir_node *ret, pmap *reg_map, struct obstack *obst)
983 {
984         const arch_isa_t *isa = env->birg->main_env->arch_env->isa;
985         const arch_register_t *sp = isa->sp;
986         const arch_register_t *bp = isa->bp;
987         ir_graph *irg      = env->birg->irg;
988         ir_node *ret_mem   = get_Return_mem(ret);
989         ir_node *frame     = get_irg_frame(irg);
990         ir_node *bl        = get_nodes_block(ret);
991         ir_node *stack     = get_irn_link(bl);
992
993         pmap_entry *ent;
994
995         if(env->call->flags.bits.try_omit_fp) {
996                 stack = be_new_IncSP(sp, irg, bl, stack, ret_mem, BE_STACK_FRAME_SIZE, be_stack_dir_shrink);
997         }
998
999         else {
1000                 stack = be_new_SetSP(sp, irg, bl, stack, frame, ret_mem);
1001                 be_set_constr_single_reg(stack, -1, sp);
1002                 be_node_set_flags(stack, -1, arch_irn_flags_ignore);
1003         }
1004
1005         pmap_foreach(env->regs, ent) {
1006                 const arch_register_t *reg = ent->key;
1007                 ir_node *irn               = ent->value;
1008
1009                 if(reg == sp)
1010                         obstack_ptr_grow(&env->obst, stack);
1011                 else if(reg == bp)
1012                         obstack_ptr_grow(&env->obst, frame);
1013                 else if(arch_register_type_is(reg, callee_save) || arch_register_type_is(reg, ignore))
1014                         obstack_ptr_grow(obst, irn);
1015         }
1016 }
1017 */
1018 #endif
1019
1020 /**
1021  * Computes the stack argument layout type.
1022  * Changes a possibly allocated value param type by moving
1023  * entities to the stack layout type.
1024  *
1025  * @param env          the ABI environment
1026  * @param call         the current call ABI
1027  * @param method_type  the method type
1028  *
1029  * @return the stack argument layout type
1030  */
1031 static ir_type *compute_arg_type(be_abi_irg_t *env, be_abi_call_t *call, ir_type *method_type)
1032 {
1033         int dir  = env->call->flags.bits.left_to_right ? 1 : -1;
1034         int inc  = env->birg->main_env->arch_env->isa->stack_dir * dir;
1035         int n    = get_method_n_params(method_type);
1036         int curr = inc > 0 ? 0 : n - 1;
1037         int ofs  = 0;
1038
1039         char buf[128];
1040         ir_type *res;
1041         int i;
1042         ir_type *val_param_tp = get_method_value_param_type(method_type);
1043         ident *id = get_entity_ident(get_irg_entity(env->birg->irg));
1044
1045         res = new_type_struct(mangle_u(id, new_id_from_chars("arg_type", 8)));
1046         for (i = 0; i < n; ++i, curr += inc) {
1047                 ir_type *param_type    = get_method_param_type(method_type, curr);
1048                 be_abi_call_arg_t *arg = get_call_arg(call, 0, curr);
1049
1050                 if (arg->on_stack) {
1051                         if (val_param_tp) {
1052                                 /* the entity was already created, move it to the param type */
1053                                 arg->stack_ent = get_method_value_param_ent(method_type, i);
1054                                 remove_struct_member(val_param_tp, arg->stack_ent);
1055                                 set_entity_owner(arg->stack_ent, res);
1056                                 add_struct_member(res, arg->stack_ent);
1057                                 /* must be automatic to set a fixed layout */
1058                                 set_entity_allocation(arg->stack_ent, allocation_automatic);
1059                         }
1060                         else {
1061                                 snprintf(buf, sizeof(buf), "param_%d", i);
1062                                 arg->stack_ent = new_entity(res, new_id_from_str(buf), param_type);
1063                         }
1064                         ofs += arg->space_before;
1065                         ofs = round_up2(ofs, arg->alignment);
1066                         set_entity_offset_bytes(arg->stack_ent, ofs);
1067                         ofs += arg->space_after;
1068                         ofs += get_type_size_bytes(param_type);
1069                 }
1070         }
1071         set_type_size_bytes(res, ofs);
1072         set_type_state(res, layout_fixed);
1073         return res;
1074 }
1075
1076 static void create_register_perms(const arch_isa_t *isa, ir_graph *irg, ir_node *bl, pmap *regs)
1077 {
1078         int i, j, n;
1079         struct obstack obst;
1080
1081         obstack_init(&obst);
1082
1083         /* Create a Perm after the RegParams node to delimit it. */
1084         for(i = 0, n = arch_isa_get_n_reg_class(isa); i < n; ++i) {
1085                 const arch_register_class_t *cls = arch_isa_get_reg_class(isa, i);
1086                 ir_node *perm;
1087                 ir_node **in;
1088                 int n_regs;
1089
1090                 for(n_regs = 0, j = 0; j < cls->n_regs; ++j) {
1091                         const arch_register_t *reg = &cls->regs[j];
1092                         ir_node *irn = pmap_get(regs, (void *) reg);
1093
1094                         if(irn && !arch_register_type_is(reg, ignore)) {
1095                                 n_regs++;
1096                                 obstack_ptr_grow(&obst, irn);
1097                                 set_irn_link(irn, (void *) reg);
1098                         }
1099                 }
1100
1101                 obstack_ptr_grow(&obst, NULL);
1102                 in = obstack_finish(&obst);
1103                 if(n_regs > 0) {
1104                         perm = be_new_Perm(cls, irg, bl, n_regs, in);
1105                         for(j = 0; j < n_regs; ++j) {
1106                                 ir_node *arg = in[j];
1107                                 arch_register_t *reg = get_irn_link(arg);
1108                                 pmap_insert(regs, reg, arg);
1109                                 be_set_constr_single_reg(perm, BE_OUT_POS(j), reg);
1110                         }
1111                 }
1112                 obstack_free(&obst, in);
1113         }
1114
1115         obstack_free(&obst, NULL);
1116 }
1117
1118 typedef struct {
1119         const arch_register_t *reg;
1120         ir_node *irn;
1121 } reg_node_map_t;
1122
1123 static int cmp_regs(const void *a, const void *b)
1124 {
1125         const reg_node_map_t *p = a;
1126         const reg_node_map_t *q = b;
1127
1128         if(p->reg->reg_class == q->reg->reg_class)
1129                 return p->reg->index - q->reg->index;
1130         else
1131                 return p->reg->reg_class - q->reg->reg_class;
1132 }
1133
1134 static reg_node_map_t *reg_map_to_arr(struct obstack *obst, pmap *reg_map)
1135 {
1136         pmap_entry *ent;
1137         int n = pmap_count(reg_map);
1138         int i = 0;
1139         reg_node_map_t *res = obstack_alloc(obst, n * sizeof(res[0]));
1140
1141         pmap_foreach(reg_map, ent) {
1142                 res[i].reg = ent->key;
1143                 res[i].irn = ent->value;
1144                 i++;
1145         }
1146
1147         qsort(res, n, sizeof(res[0]), cmp_regs);
1148         return res;
1149 }
1150
1151 /**
1152  * Creates a barrier.
1153  */
1154 static ir_node *create_barrier(be_abi_irg_t *env, ir_node *bl, ir_node **mem, pmap *regs, int in_req)
1155 {
1156         ir_graph *irg = env->birg->irg;
1157         int n_regs    = pmap_count(regs);
1158         int n;
1159         ir_node *irn;
1160         ir_node **in;
1161         reg_node_map_t *rm;
1162
1163         rm = reg_map_to_arr(&env->obst, regs);
1164
1165         for(n = 0; n < n_regs; ++n)
1166                 obstack_ptr_grow(&env->obst, rm[n].irn);
1167
1168         if(mem) {
1169                 obstack_ptr_grow(&env->obst, *mem);
1170                 n++;
1171         }
1172
1173         in = (ir_node **) obstack_finish(&env->obst);
1174         irn = be_new_Barrier(irg, bl, n, in);
1175         obstack_free(&env->obst, in);
1176
1177         for(n = 0; n < n_regs; ++n) {
1178                 const arch_register_t *reg = rm[n].reg;
1179                 int flags                  = 0;
1180                 int pos                    = BE_OUT_POS(n);
1181                 ir_node *proj;
1182
1183                 proj = new_r_Proj(irg, bl, irn, get_irn_mode(rm[n].irn), n);
1184                 be_node_set_reg_class(irn, n, reg->reg_class);
1185                 if(in_req)
1186                         be_set_constr_single_reg(irn, n, reg);
1187                 be_set_constr_single_reg(irn, pos, reg);
1188                 be_node_set_reg_class(irn, pos, reg->reg_class);
1189                 arch_set_irn_register(env->birg->main_env->arch_env, proj, reg);
1190
1191                 /* if the proj projects a ignore register or a node which is set to ignore, propagate this property. */
1192                 if(arch_register_type_is(reg, ignore) || arch_irn_is(env->birg->main_env->arch_env, in[n], ignore))
1193                         flags |= arch_irn_flags_ignore;
1194
1195                 if(arch_irn_is(env->birg->main_env->arch_env, in[n], modify_sp))
1196                         flags |= arch_irn_flags_modify_sp;
1197
1198                 be_node_set_flags(irn, pos, flags);
1199
1200                 pmap_insert(regs, (void *) reg, proj);
1201         }
1202
1203         if(mem) {
1204                 *mem = new_r_Proj(irg, bl, irn, mode_M, n);
1205         }
1206
1207         obstack_free(&env->obst, rm);
1208         return irn;
1209 }
1210
1211 /**
1212  * Creates a be_Return for a Return node.
1213  *
1214  * @param @env    the abi environment
1215  * @param irn     the Return node or NULL if there was none
1216  * @param bl      the block where the be_Retun should be placed
1217  * @param mem     the current memory
1218  * @param n_res   number of return results
1219  */
1220 static ir_node *create_be_return(be_abi_irg_t *env, ir_node *irn, ir_node *bl, ir_node *mem, int n_res) {
1221         be_abi_call_t *call = env->call;
1222         const arch_isa_t *isa = env->birg->main_env->arch_env->isa;
1223
1224         pmap *reg_map  = pmap_create();
1225         ir_node *keep  = pmap_get(env->keep_map, bl);
1226         int in_max;
1227         ir_node *ret;
1228         int i, n;
1229         ir_node **in;
1230         ir_node *stack;
1231         const arch_register_t **regs;
1232         pmap_entry *ent ;
1233
1234         /*
1235                 get the valid stack node in this block.
1236                 If we had a call in that block there is a Keep constructed by process_calls()
1237                 which points to the last stack modification in that block. we'll use
1238                 it then. Else we use the stack from the start block and let
1239                 the ssa construction fix the usage.
1240         */
1241         stack = be_abi_reg_map_get(env->regs, isa->sp);
1242         if (keep) {
1243                 ir_node *bad = new_r_Bad(env->birg->irg);
1244                 stack = get_irn_n(keep, 0);
1245                 set_nodes_block(keep, bad);
1246                 set_irn_n(keep, 0, bad);
1247                 // exchange(keep, new_r_Bad(env->birg->irg));
1248         }
1249
1250         /* Insert results for Return into the register map. */
1251         for(i = 0; i < n_res; ++i) {
1252                 ir_node *res           = get_Return_res(irn, i);
1253                 be_abi_call_arg_t *arg = get_call_arg(call, 1, i);
1254                 assert(arg->in_reg && "return value must be passed in register");
1255                 pmap_insert(reg_map, (void *) arg->reg, res);
1256         }
1257
1258         /* Add uses of the callee save registers. */
1259         pmap_foreach(env->regs, ent) {
1260                 const arch_register_t *reg = ent->key;
1261                 if(arch_register_type_is(reg, callee_save) || arch_register_type_is(reg, ignore))
1262                         pmap_insert(reg_map, ent->key, ent->value);
1263         }
1264
1265         be_abi_reg_map_set(reg_map, isa->sp, stack);
1266
1267         /* Make the Epilogue node and call the arch's epilogue maker. */
1268         create_barrier(env, bl, &mem, reg_map, 1);
1269         call->cb->epilogue(env->cb, bl, &mem, reg_map);
1270
1271         /*
1272                 Maximum size of the in array for Return nodes is
1273                 return args + callee save/ignore registers + memory + stack pointer
1274         */
1275         in_max = pmap_count(reg_map) + n_res + 2;
1276
1277         in   = obstack_alloc(&env->obst, in_max * sizeof(in[0]));
1278         regs = obstack_alloc(&env->obst, in_max * sizeof(regs[0]));
1279
1280         in[0]   = mem;
1281         in[1]   = be_abi_reg_map_get(reg_map, isa->sp);
1282         regs[0] = NULL;
1283         regs[1] = isa->sp;
1284         n       = 2;
1285
1286         /* clear SP entry, since it has already been grown. */
1287         pmap_insert(reg_map, (void *) isa->sp, NULL);
1288         for(i = 0; i < n_res; ++i) {
1289                 be_abi_call_arg_t *arg = get_call_arg(call, 1, i);
1290
1291                 in[n]     = be_abi_reg_map_get(reg_map, arg->reg);
1292                 regs[n++] = arg->reg;
1293
1294                 /* Clear the map entry to mark the register as processed. */
1295                 be_abi_reg_map_set(reg_map, arg->reg, NULL);
1296         }
1297
1298         /* grow the rest of the stuff. */
1299         pmap_foreach(reg_map, ent) {
1300                 if(ent->value) {
1301                         in[n]     = ent->value;
1302                         regs[n++] = ent->key;
1303                 }
1304         }
1305
1306         /* The in array for the new back end return is now ready. */
1307         ret = be_new_Return(irn ? get_irn_dbg_info(irn) : NULL, env->birg->irg, bl, n_res, n, in);
1308
1309         /* Set the register classes of the return's parameter accordingly. */
1310         for(i = 0; i < n; ++i)
1311                 if(regs[i])
1312                         be_node_set_reg_class(ret, i, regs[i]->reg_class);
1313
1314         /* Free the space of the Epilog's in array and the register <-> proj map. */
1315         obstack_free(&env->obst, in);
1316         pmap_destroy(reg_map);
1317
1318         return ret;
1319 }
1320
1321 typedef struct lower_frame_sels_env_t {
1322         be_abi_irg_t *env;
1323         entity       *value_param_list;  /**< the list of all value param antities */
1324 } lower_frame_sels_env_t;
1325
1326 /**
1327  * Walker: Replaces Sels of frame type and
1328  * value param type entities by FrameAddress.
1329  */
1330 static void lower_frame_sels_walker(ir_node *irn, void *data)
1331 {
1332         lower_frame_sels_env_t *ctx = data;
1333
1334         if (is_Sel(irn)) {
1335                 ir_graph *irg        = current_ir_graph;
1336                 ir_node  *frame      = get_irg_frame(irg);
1337                 ir_node  *param_base = get_irg_value_param_base(irg);
1338                 ir_node  *ptr        = get_Sel_ptr(irn);
1339
1340                 if (ptr == frame || ptr == param_base) {
1341                         be_abi_irg_t *env = ctx->env;
1342                         entity       *ent = get_Sel_entity(irn);
1343                         ir_node      *bl  = get_nodes_block(irn);
1344                         ir_node      *nw;
1345
1346                         nw = be_new_FrameAddr(env->isa->sp->reg_class, irg, bl, frame, ent);
1347                         exchange(irn, nw);
1348
1349                         if (ptr == param_base) {
1350                                 set_entity_link(ent, ctx->value_param_list);
1351                                 ctx->value_param_list = ent;
1352                         }
1353                 }
1354         }
1355 }
1356
1357 /**
1358  * Check if a value parameter is transmitted as a register.
1359  * This might happen if the address of an parameter is taken which is
1360  * transmitted in registers.
1361  *
1362  * Note that on some architectures this case must be handled specially
1363  * because the place of the backing store is determined by their ABI.
1364  *
1365  * In the default case we move the entity to the frame type and create
1366  * a backing store into the first block.
1367  */
1368 static void fix_address_of_parameter_access(be_abi_irg_t *env, entity *value_param_list) {
1369         be_abi_call_t *call = env->call;
1370         ir_graph *irg       = env->birg->irg;
1371         entity *ent, *next_ent, *new_list;
1372         ir_type *frame_tp;
1373         DEBUG_ONLY(firm_dbg_module_t *dbg = env->dbg;)
1374
1375         new_list = NULL;
1376         for (ent = value_param_list; ent; ent = next_ent) {
1377                 int i = get_struct_member_index(get_entity_owner(ent), ent);
1378                 be_abi_call_arg_t *arg = get_call_arg(call, 0, i);
1379
1380                 next_ent = get_entity_link(ent);
1381                 if (arg->in_reg) {
1382                         DBG((dbg, LEVEL_2, "\targ #%d need backing store\n", i));
1383                         set_entity_link(ent, new_list);
1384                         new_list = ent;
1385                 }
1386         }
1387         if (new_list) {
1388                 /* ok, change the graph */
1389                 ir_node *start_bl = get_irg_start_block(irg);
1390                 ir_node *first_bl = NULL;
1391                 ir_node *frame, *imem, *nmem, *store, *mem, *args, *args_bl;
1392                 const ir_edge_t *edge;
1393                 optimization_state_t state;
1394                 int offset;
1395
1396                 foreach_block_succ(start_bl, edge) {
1397                         ir_node *succ = get_edge_src_irn(edge);
1398                         if (start_bl != succ) {
1399                                 first_bl = succ;
1400                                 break;
1401                         }
1402                 }
1403                 assert(first_bl);
1404                 /* we had already removed critical edges, so the following
1405                    assertion should be always true. */
1406                 assert(get_Block_n_cfgpreds(first_bl) == 1);
1407
1408                 /* now create backing stores */
1409                 frame = get_irg_frame(irg);
1410                 imem = get_irg_initial_mem(irg);
1411
1412                 save_optimization_state(&state);
1413                 set_optimize(0);
1414                 nmem = new_r_Proj(irg, first_bl, get_irg_start(irg), mode_M, pn_Start_M);
1415                 restore_optimization_state(&state);
1416
1417                 /* reroute all edges to the new memory source */
1418                 edges_reroute(imem, nmem, irg);
1419
1420                 store   = NULL;
1421                 mem     = imem;
1422                 args    = get_irg_args(irg);
1423                 args_bl = get_nodes_block(args);
1424                 for (ent = new_list; ent; ent = get_entity_link(ent)) {
1425                         int     i     = get_struct_member_index(get_entity_owner(ent), ent);
1426                         ir_type *tp   = get_entity_type(ent);
1427                         ir_mode *mode = get_type_mode(tp);
1428                         ir_node *addr;
1429
1430                         /* address for the backing store */
1431                         addr = be_new_FrameAddr(env->isa->sp->reg_class, irg, first_bl, frame, ent);
1432
1433                         if (store)
1434                                 mem = new_r_Proj(irg, first_bl, store, mode_M, pn_Store_M);
1435
1436                         /* the backing store itself */
1437                         store = new_r_Store(irg, first_bl, mem, addr,
1438                                             new_r_Proj(irg, args_bl, args, mode, i));
1439                 }
1440                 /* the new memory Proj gets the last Proj from store */
1441                 set_Proj_pred(nmem, store);
1442                 set_Proj_proj(nmem, pn_Store_M);
1443
1444                 /* move all entities to the frame type */
1445                 frame_tp = get_irg_frame_type(irg);
1446                 offset   = get_type_size_bytes(frame_tp);
1447                 for (ent = new_list; ent; ent = get_entity_link(ent)) {
1448                         ir_type *tp = get_entity_type(ent);
1449                         int align = get_type_alignment_bytes(tp);
1450
1451                         offset += align - 1;
1452                         offset &= -align;
1453                         set_entity_owner(ent, frame_tp);
1454                         add_class_member(frame_tp, ent);
1455                         /* must be automatic to set a fixed layout */
1456                         set_entity_allocation(ent, allocation_automatic);
1457                         set_entity_offset_bytes(ent, offset);
1458                         offset += get_type_size_bytes(tp);
1459                 }
1460                 set_type_size_bytes(frame_tp, offset);
1461         }
1462 }
1463
1464 /**
1465  * Modify the irg itself and the frame type.
1466  */
1467 static void modify_irg(be_abi_irg_t *env)
1468 {
1469         be_abi_call_t *call       = env->call;
1470         const arch_isa_t *isa     = env->birg->main_env->arch_env->isa;
1471         const arch_register_t *sp = arch_isa_sp(isa);
1472         ir_graph *irg             = env->birg->irg;
1473         ir_node *bl               = get_irg_start_block(irg);
1474         ir_node *end              = get_irg_end_block(irg);
1475         ir_node *no_mem           = get_irg_no_mem(irg);
1476         ir_node *mem              = get_irg_initial_mem(irg);
1477         ir_type *method_type      = get_entity_type(get_irg_entity(irg));
1478         pset *dont_save           = pset_new_ptr(8);
1479
1480         int n_params;
1481         int i, j, n;
1482
1483         reg_node_map_t *rm;
1484         const arch_register_t *fp_reg;
1485         ir_node *frame_pointer;
1486         ir_node *barrier;
1487         ir_node *reg_params_bl;
1488         ir_node **args;
1489         ir_node *arg_tuple;
1490         const ir_edge_t *edge;
1491         ir_type *arg_type, *bet_type;
1492         lower_frame_sels_env_t ctx;
1493
1494         bitset_t *used_proj_nr;
1495         DEBUG_ONLY(firm_dbg_module_t *dbg = env->dbg;)
1496
1497         DBG((dbg, LEVEL_1, "introducing abi on %+F\n", irg));
1498
1499         /* Convert the Sel nodes in the irg to frame load/store/addr nodes. */
1500         ctx.env              = env;
1501         ctx.value_param_list = NULL;
1502         irg_walk_graph(irg, lower_frame_sels_walker, NULL, &ctx);
1503
1504         env->frame = obstack_alloc(&env->obst, sizeof(env->frame[0]));
1505         env->regs  = pmap_create();
1506
1507         used_proj_nr = bitset_alloca(1024);
1508         n_params     = get_method_n_params(method_type);
1509         args         = obstack_alloc(&env->obst, n_params * sizeof(args[0]));
1510         memset(args, 0, n_params * sizeof(args[0]));
1511
1512         /* Check if a value parameter is transmitted as a register.
1513          * This might happen if the address of an parameter is taken which is
1514          * transmitted in registers.
1515          *
1516          * Note that on some architectures this case must be handled specially
1517          * because the place of the backing store is determined by their ABI.
1518          *
1519          * In the default case we move the entity to the frame type and create
1520          * a backing store into the first block.
1521          */
1522         fix_address_of_parameter_access(env, ctx.value_param_list);
1523
1524         /* Fill the argument vector */
1525         arg_tuple = get_irg_args(irg);
1526         foreach_out_edge(arg_tuple, edge) {
1527                 ir_node *irn = get_edge_src_irn(edge);
1528                 int nr       = get_Proj_proj(irn);
1529                 args[nr]     = irn;
1530                 DBG((dbg, LEVEL_2, "\treading arg: %d -> %+F\n", nr, irn));
1531         }
1532
1533         arg_type = compute_arg_type(env, call, method_type);
1534         bet_type = call->cb->get_between_type(env->cb);
1535         stack_frame_init(env->frame, arg_type, bet_type, get_irg_frame_type(irg), isa->stack_dir);
1536
1537         /* Count the register params and add them to the number of Projs for the RegParams node */
1538         for(i = 0; i < n_params; ++i) {
1539                 be_abi_call_arg_t *arg = get_call_arg(call, 0, i);
1540                 if(arg->in_reg && args[i]) {
1541                         assert(arg->reg != sp && "cannot use stack pointer as parameter register");
1542                         assert(i == get_Proj_proj(args[i]));
1543
1544                         /* For now, associate the register with the old Proj from Start representing that argument. */
1545                         pmap_insert(env->regs, (void *) arg->reg, args[i]);
1546                         bitset_set(used_proj_nr, i);
1547                         DBG((dbg, LEVEL_2, "\targ #%d -> reg %s\n", i, arg->reg->name));
1548                 }
1549         }
1550
1551         /* Collect all callee-save registers */
1552         for(i = 0, n = arch_isa_get_n_reg_class(isa); i < n; ++i) {
1553                 const arch_register_class_t *cls = arch_isa_get_reg_class(isa, i);
1554                 for(j = 0; j < cls->n_regs; ++j) {
1555                         const arch_register_t *reg = &cls->regs[j];
1556                         if(arch_register_type_is(reg, callee_save) || arch_register_type_is(reg, ignore))
1557                                 pmap_insert(env->regs, (void *) reg, NULL);
1558                 }
1559         }
1560
1561         pmap_insert(env->regs, (void *) sp, NULL);
1562         pmap_insert(env->regs, (void *) isa->bp, NULL);
1563         reg_params_bl   = get_irg_start_block(irg);
1564         env->reg_params = be_new_RegParams(irg, reg_params_bl, pmap_count(env->regs));
1565
1566         /*
1567          * make proj nodes for the callee save registers.
1568          * memorize them, since Return nodes get those as inputs.
1569          *
1570          * Note, that if a register corresponds to an argument, the regs map contains
1571          * the old Proj from start for that argument.
1572          */
1573
1574         rm = reg_map_to_arr(&env->obst, env->regs);
1575         for(i = 0, n = pmap_count(env->regs); i < n; ++i) {
1576                 arch_register_t *reg = (void *) rm[i].reg;
1577                 ir_node *arg_proj    = rm[i].irn;
1578                 ir_mode *mode        = arg_proj ? get_irn_mode(arg_proj) : reg->reg_class->mode;
1579                 long nr              = i;
1580                 int pos              = BE_OUT_POS((int) nr);
1581                 int flags            = 0;
1582
1583                 ir_node *proj;
1584
1585                 assert(nr >= 0);
1586                 bitset_set(used_proj_nr, nr);
1587                 proj = new_r_Proj(irg, reg_params_bl, env->reg_params, mode, nr);
1588                 pmap_insert(env->regs, (void *) reg, proj);
1589                 be_set_constr_single_reg(env->reg_params, pos, reg);
1590                 arch_set_irn_register(env->birg->main_env->arch_env, proj, reg);
1591
1592                 /*
1593                  * If the register is an ignore register,
1594                  * The Proj for that register shall also be ignored during register allocation.
1595                  */
1596                 if(arch_register_type_is(reg, ignore))
1597                         flags |= arch_irn_flags_ignore;
1598
1599                 if(reg == sp)
1600                         flags |= arch_irn_flags_modify_sp;
1601
1602                 be_node_set_flags(env->reg_params, pos, flags);
1603
1604                 DBG((dbg, LEVEL_2, "\tregister save proj #%d -> reg %s\n", nr, reg->name));
1605         }
1606         obstack_free(&env->obst, rm);
1607
1608         /* Generate the Prologue */
1609         fp_reg  = call->cb->prologue(env->cb, &mem, env->regs);
1610
1611         /* do the stack allocation BEFORE the barrier, or spill code
1612            might be added before it */
1613         env->init_sp  = be_abi_reg_map_get(env->regs, sp);
1614         env->init_sp = be_new_IncSP(sp, irg, bl, env->init_sp, no_mem, BE_STACK_FRAME_SIZE, be_stack_dir_expand);
1615         be_abi_reg_map_set(env->regs, sp, env->init_sp);
1616
1617         barrier = create_barrier(env, bl, &mem, env->regs, 0);
1618
1619         env->init_sp  = be_abi_reg_map_get(env->regs, sp);
1620         arch_set_irn_register(env->birg->main_env->arch_env, env->init_sp, sp);
1621
1622         frame_pointer = be_abi_reg_map_get(env->regs, fp_reg);
1623         set_irg_frame(irg, frame_pointer);
1624         pset_insert_ptr(env->ignore_regs, fp_reg);
1625
1626         /* Now, introduce stack param nodes for all parameters passed on the stack */
1627         for(i = 0; i < n_params; ++i) {
1628                 ir_node *arg_proj = args[i];
1629                 ir_node *repl     = NULL;
1630
1631                 if(arg_proj != NULL) {
1632                         be_abi_call_arg_t *arg;
1633                         ir_type *param_type;
1634                         int nr = get_Proj_proj(arg_proj);
1635
1636                         nr         = MIN(nr, n_params);
1637                         arg        = get_call_arg(call, 0, nr);
1638                         param_type = get_method_param_type(method_type, nr);
1639
1640                         if(arg->in_reg) {
1641                                 repl = pmap_get(env->regs, (void *) arg->reg);
1642                         }
1643
1644                         else if(arg->on_stack) {
1645                                 /* For atomic parameters which are actually used, we create a StackParam node. */
1646                                 if(is_atomic_type(param_type) && get_irn_n_edges(args[i]) > 0) {
1647                                         ir_mode *mode                    = get_type_mode(param_type);
1648                                         const arch_register_class_t *cls = arch_isa_get_reg_class_for_mode(isa, mode);
1649                                         repl = be_new_StackParam(cls, isa->bp->reg_class, irg, reg_params_bl, mode, frame_pointer, arg->stack_ent);
1650                                 }
1651
1652                                 /* The stack parameter is not primitive (it is a struct or array),
1653                                 we thus will create a node representing the parameter's address
1654                                 on the stack. */
1655                                 else {
1656                                         repl = be_new_FrameAddr(sp->reg_class, irg, reg_params_bl, frame_pointer, arg->stack_ent);
1657                                 }
1658                         }
1659
1660                         assert(repl != NULL);
1661                         edges_reroute(args[i], repl, irg);
1662                 }
1663         }
1664
1665         /* All Return nodes hang on the End node, so look for them there. */
1666         for (i = 0, n = get_Block_n_cfgpreds(end); i < n; ++i) {
1667                 ir_node *irn = get_Block_cfgpred(end, i);
1668
1669                 if (is_Return(irn)) {
1670                         ir_node *ret = create_be_return(env, irn, get_nodes_block(irn), get_Return_mem(irn), get_Return_n_ress(irn));
1671                         exchange(irn, ret);
1672                 }
1673         }
1674         /* if we have endless loops here, n might be <= 0. Do NOT create a be_Return than,
1675            the code is dead and will never be executed. */
1676
1677         del_pset(dont_save);
1678         obstack_free(&env->obst, args);
1679 }
1680
1681 /**
1682  * Walker: puts all Alloc(stack_alloc) on a obstack
1683  */
1684 static void collect_alloca_walker(ir_node *irn, void *data)
1685 {
1686         be_abi_irg_t *env = data;
1687         if(get_irn_opcode(irn) == iro_Alloc && get_Alloc_where(irn) == stack_alloc)
1688                 obstack_ptr_grow(&env->obst, irn);
1689 }
1690
1691 be_abi_irg_t *be_abi_introduce(be_irg_t *birg)
1692 {
1693         be_abi_irg_t *env  = xmalloc(sizeof(env[0]));
1694         ir_node *old_frame = get_irg_frame(birg->irg);
1695         ir_graph *irg      = birg->irg;
1696
1697         pmap_entry *ent;
1698         ir_node *dummy;
1699         optimization_state_t state;
1700
1701         obstack_init(&env->obst);
1702
1703         env->isa           = birg->main_env->arch_env->isa;
1704         env->method_type   = get_entity_type(get_irg_entity(irg));
1705         env->call          = be_abi_call_new();
1706         arch_isa_get_call_abi(env->isa, env->method_type, env->call);
1707
1708         env->ignore_regs      = pset_new_ptr_default();
1709         env->keep_map         = pmap_create();
1710         env->dce_survivor     = new_survive_dce();
1711         env->birg             = birg;
1712         env->stack_phis       = pset_new_ptr(16);
1713         /* Beware: later we replace this node by the real one, ensure it is not CSE'd
1714            to another Unknown or the stack pointer gets used */
1715         save_optimization_state(&state);
1716         set_optimize(0);
1717         env->init_sp = dummy  = new_r_Unknown(irg, env->isa->sp->reg_class->mode);
1718         restore_optimization_state(&state);
1719         FIRM_DBG_REGISTER(env->dbg, "firm.be.abi");
1720
1721         env->cb = env->call->cb->init(env->call, birg->main_env->arch_env, irg);
1722
1723         memcpy(&env->irn_handler, &abi_irn_handler, sizeof(abi_irn_handler));
1724         env->irn_ops.impl = &abi_irn_ops;
1725
1726         /* Lower all call nodes in the IRG. */
1727         process_calls(env);
1728
1729         /* Process the IRG */
1730         modify_irg(env);
1731
1732         /* We don't need the keep map anymore. */
1733         pmap_destroy(env->keep_map);
1734
1735         /* reroute the stack origin of the calls to the true stack origin. */
1736         edges_reroute(dummy, env->init_sp, irg);
1737         edges_reroute(old_frame, get_irg_frame(irg), irg);
1738
1739         /* Make some important node pointers survive the dead node elimination. */
1740         survive_dce_register_irn(env->dce_survivor, &env->init_sp);
1741         pmap_foreach(env->regs, ent)
1742                 survive_dce_register_irn(env->dce_survivor, (ir_node **) &ent->value);
1743
1744         arch_env_push_irn_handler(env->birg->main_env->arch_env, &env->irn_handler);
1745
1746         env->call->cb->done(env->cb);
1747         return env;
1748 }
1749
1750 void be_abi_free(be_abi_irg_t *env)
1751 {
1752         free_survive_dce(env->dce_survivor);
1753         del_pset(env->stack_phis);
1754         del_pset(env->ignore_regs);
1755         pmap_destroy(env->regs);
1756         obstack_free(&env->obst, NULL);
1757         arch_env_pop_irn_handler(env->birg->main_env->arch_env);
1758         free(env);
1759 }
1760
1761 void be_abi_put_ignore_regs(be_abi_irg_t *abi, const arch_register_class_t *cls, bitset_t *bs)
1762 {
1763         arch_register_t *reg;
1764
1765         for(reg = pset_first(abi->ignore_regs); reg; reg = pset_next(abi->ignore_regs))
1766                 if(reg->reg_class == cls)
1767                         bitset_set(bs, reg->index);
1768 }
1769
1770
1771 /*
1772
1773   _____ _        ____  _             _
1774  |  ___(_)_  __ / ___|| |_ __ _  ___| | __
1775  | |_  | \ \/ / \___ \| __/ _` |/ __| |/ /
1776  |  _| | |>  <   ___) | || (_| | (__|   <
1777  |_|   |_/_/\_\ |____/ \__\__,_|\___|_|\_\
1778
1779 */
1780
1781 struct fix_stack_walker_info {
1782         nodeset *nodes;
1783         const arch_env_t *aenv;
1784 };
1785
1786 /**
1787  * Walker. Collect all stack modifying nodes.
1788  */
1789 static void collect_stack_nodes_walker(ir_node *irn, void *data)
1790 {
1791         struct fix_stack_walker_info *info = data;
1792
1793         if(arch_irn_is(info->aenv, irn, modify_sp))
1794                 pset_insert_ptr(info->nodes, irn);
1795 }
1796
1797 void be_abi_fix_stack_nodes(be_abi_irg_t *env, be_lv_t *lv)
1798 {
1799         dom_front_info_t *df;
1800         pset *stack_nodes = pset_new_ptr(16);
1801         struct fix_stack_walker_info info;
1802
1803         info.nodes = stack_nodes;
1804         info.aenv  = env->birg->main_env->arch_env;
1805
1806         /* We need dominance frontiers for fix up */
1807         df = be_compute_dominance_frontiers(env->birg->irg);
1808         irg_walk_graph(env->birg->irg, collect_stack_nodes_walker, NULL, &info);
1809         pset_insert_ptr(stack_nodes, env->init_sp);
1810         be_ssa_constr_set_phis(df, lv, stack_nodes, env->stack_phis);
1811         del_pset(stack_nodes);
1812
1813         /* free these dominance frontiers */
1814         be_free_dominance_frontiers(df);
1815 }
1816
1817 /**
1818  * Translates a direction of an IncSP node (either be_stack_dir_shrink, or ...expand)
1819  * into -1 or 1, respectively.
1820  * @param irn The node.
1821  * @return 1, if the direction of the IncSP was along, -1 if against.
1822  */
1823 static int get_dir(ir_node *irn)
1824 {
1825         return 1 - 2 * (be_get_IncSP_direction(irn) == be_stack_dir_shrink);
1826 }
1827
1828 static int process_stack_bias(be_abi_irg_t *env, ir_node *bl, int bias)
1829 {
1830         const arch_env_t *aenv = env->birg->main_env->arch_env;
1831         int omit_fp            = env->call->flags.bits.try_omit_fp;
1832         ir_node *irn;
1833
1834         sched_foreach(bl, irn) {
1835
1836                 /*
1837                         If the node modifies the stack pointer by a constant offset,
1838                         record that in the bias.
1839                 */
1840                 if(be_is_IncSP(irn)) {
1841                         int ofs = be_get_IncSP_offset(irn);
1842                         int dir = get_dir(irn);
1843
1844                         if(ofs == BE_STACK_FRAME_SIZE) {
1845                                 ofs = get_type_size_bytes(get_irg_frame_type(env->birg->irg));
1846                                 be_set_IncSP_offset(irn, ofs);
1847                         }
1848
1849                         if(omit_fp)
1850                                 bias += dir * ofs;
1851                 }
1852
1853                 /*
1854                         Else check, if the node relates to an entity on the stack frame.
1855                         If so, set the true offset (including the bias) for that
1856                         node.
1857                 */
1858                 else {
1859                         entity *ent = arch_get_frame_entity(aenv, irn);
1860                         if(ent) {
1861                                 int offset = get_stack_entity_offset(env->frame, ent, bias);
1862                                 arch_set_frame_offset(aenv, irn, offset);
1863                                 DBG((env->dbg, LEVEL_2, "%F has offset %d\n", ent, offset));
1864                         }
1865                 }
1866         }
1867
1868         return bias;
1869 }
1870
1871 /**
1872  * A helper struct for the bias walker.
1873  */
1874 struct bias_walk {
1875         be_abi_irg_t *env;     /**< The ABI irg environment. */
1876         int start_block_bias;  /**< The bias at the end of the start block. */
1877         ir_node *start_block;  /**< The start block of the current graph. */
1878 };
1879
1880 /**
1881  * Block-Walker: fix all stack offsets
1882  */
1883 static void stack_bias_walker(ir_node *bl, void *data)
1884 {
1885         struct bias_walk *bw = data;
1886         if (bl != bw->start_block) {
1887                 process_stack_bias(bw->env, bl, bw->start_block_bias);
1888         }
1889 }
1890
1891 void be_abi_fix_stack_bias(be_abi_irg_t *env)
1892 {
1893         ir_graph *irg  = env->birg->irg;
1894         struct bias_walk bw;
1895
1896         stack_frame_compute_initial_offset(env->frame);
1897         // stack_layout_dump(stdout, env->frame);
1898
1899         /* Determine the stack bias at the end of the start block. */
1900         bw.start_block_bias = process_stack_bias(env, get_irg_start_block(irg), 0);
1901
1902         /* fix the bias is all other blocks */
1903         bw.env = env;
1904         bw.start_block = get_irg_start_block(irg);
1905         irg_block_walk_graph(irg, stack_bias_walker, NULL, &bw);
1906 }
1907
1908 ir_node *be_abi_get_callee_save_irn(be_abi_irg_t *abi, const arch_register_t *reg)
1909 {
1910         assert(arch_register_type_is(reg, callee_save));
1911         assert(pmap_contains(abi->regs, (void *) reg));
1912         return pmap_get(abi->regs, (void *) reg);
1913 }
1914
1915 /*
1916   _____ _____  _   _   _    _                 _ _
1917  |_   _|  __ \| \ | | | |  | |               | | |
1918    | | | |__) |  \| | | |__| | __ _ _ __   __| | | ___ _ __
1919    | | |  _  /| . ` | |  __  |/ _` | '_ \ / _` | |/ _ \ '__|
1920   _| |_| | \ \| |\  | | |  | | (_| | | | | (_| | |  __/ |
1921  |_____|_|  \_\_| \_| |_|  |_|\__,_|_| |_|\__,_|_|\___|_|
1922
1923   for Phi nodes which are created due to stack modifying nodes
1924   such as IncSP, AddSP and SetSP.
1925
1926   These Phis are always to be ignored by the reg alloc and are
1927   fixed on the SP register of the ISA.
1928 */
1929
1930 static const void *abi_get_irn_ops(const arch_irn_handler_t *handler, const ir_node *irn)
1931 {
1932         const be_abi_irg_t *abi = get_abi_from_handler(handler);
1933         const void *res = NULL;
1934
1935         if(is_Phi(irn) && pset_find_ptr(abi->stack_phis, (void *) irn))
1936                 res = &abi->irn_ops;
1937
1938         return res;
1939 }
1940
1941 static void be_abi_limited(void *data, bitset_t *bs)
1942 {
1943         be_abi_irg_t *abi = data;
1944         bitset_clear_all(bs);
1945         bitset_set(bs, abi->isa->sp->index);
1946 }
1947
1948 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)
1949 {
1950         be_abi_irg_t *abi          = get_abi_from_ops(self);
1951         const arch_register_t *reg = abi->isa->sp;
1952
1953         memset(req, 0, sizeof(req[0]));
1954
1955         if(pos == BE_OUT_POS(0)) {
1956                 req->cls         = reg->reg_class;
1957                 req->type        = arch_register_req_type_limited;
1958                 req->limited     = be_abi_limited;
1959                 req->limited_env = abi;
1960         }
1961
1962         else if(pos >= 0 && pos < get_irn_arity(irn)) {
1963                 req->cls  = reg->reg_class;
1964                 req->type = arch_register_req_type_normal;
1965         }
1966
1967         return req;
1968 }
1969
1970 static void abi_set_irn_reg(const void *self, ir_node *irn, const arch_register_t *reg)
1971 {
1972 }
1973
1974 static const arch_register_t *abi_get_irn_reg(const void *self, const ir_node *irn)
1975 {
1976         const be_abi_irg_t *abi = get_abi_from_ops(self);
1977         return abi->isa->sp;
1978 }
1979
1980 static arch_irn_class_t abi_classify(const void *_self, const ir_node *irn)
1981 {
1982         return arch_irn_class_normal;
1983 }
1984
1985 static arch_irn_flags_t abi_get_flags(const void *_self, const ir_node *irn)
1986 {
1987         return arch_irn_flags_ignore | arch_irn_flags_modify_sp;
1988 }
1989
1990 static entity *abi_get_frame_entity(const void *_self, const ir_node *irn)
1991 {
1992         return NULL;
1993 }
1994
1995 static void abi_set_stack_bias(const void *_self, ir_node *irn, int bias)
1996 {
1997 }
1998
1999 static const arch_irn_ops_if_t abi_irn_ops = {
2000         abi_get_irn_reg_req,
2001         abi_set_irn_reg,
2002         abi_get_irn_reg,
2003         abi_classify,
2004         abi_get_flags,
2005         abi_get_frame_entity,
2006         abi_set_stack_bias
2007 };
2008
2009 static const arch_irn_handler_t abi_irn_handler = {
2010         abi_get_irn_ops
2011 };