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