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