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