Added modify_sp flag
[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                         /*
504                          * If we wanted to build the arguments sequentially,
505                          * the stack pointer for the next must be incremented,
506                          * and the memory value propagated.
507                          */
508                         if (do_seq) {
509                                 curr_ofs = 0;
510                                 addr = curr_sp = be_new_IncSP(sp, irg, bl, curr_sp, curr_mem,
511                                         param_size + arg->space_before, be_stack_dir_expand);
512                         }
513                         else {
514                                 curr_ofs += arg->space_before;
515                                 curr_ofs =  round_up2(curr_ofs, arg->alignment);
516
517                                 /* Make the expression to compute the argument's offset. */
518                                 if(curr_ofs > 0) {
519                                         addr = new_r_Const_long(irg, bl, mode_Is, curr_ofs);
520                                         addr = new_r_Add(irg, bl, curr_sp, addr, mach_mode);
521                                 }
522                         }
523
524                         /* Insert a store for primitive arguments. */
525                         if (is_atomic_type(param_type)) {
526                                 mem = new_r_Store(irg, bl, curr_mem, addr, param);
527                                 mem = new_r_Proj(irg, bl, mem, mode_M, pn_Store_M);
528                         }
529
530                         /* Make a mem copy for compound arguments. */
531                         else {
532                                 assert(mode_is_reference(get_irn_mode(param)));
533                                 mem = new_r_CopyB(irg, bl, curr_mem, addr, param, param_type);
534                                 mem = new_r_Proj(irg, bl, mem, mode_M, pn_CopyB_M_regular);
535                         }
536
537                         curr_ofs += param_size;
538
539                         if (do_seq)
540                                 curr_mem = mem;
541                         else
542                                 obstack_ptr_grow(obst, mem);
543                 }
544
545                 in = (ir_node **) obstack_finish(obst);
546
547                 /* We need the sync only, if we didn't build the stores sequentially. */
548                 if(!do_seq)
549                         curr_mem = new_r_Sync(irg, bl, n_pos, in);
550                 obstack_free(obst, in);
551         }
552
553         /* Collect caller save registers */
554         for(i = 0, n = arch_isa_get_n_reg_class(isa); i < n; ++i) {
555                 int j;
556                 const arch_register_class_t *cls = arch_isa_get_reg_class(isa, i);
557                 for(j = 0; j < cls->n_regs; ++j) {
558                         const arch_register_t *reg = arch_register_for_index(cls, j);
559                         if(arch_register_type_is(reg, caller_save))
560                                 pset_insert_ptr(caller_save, (void *) reg);
561                 }
562         }
563
564         /* search the greatest result proj number */
565
566         /* TODO: what if the result is NOT used? Currently there is
567          * no way to detect this later, especially there is no way to
568          * see this in the proj numbers.
569          * While this is ok for the register allocator, it is bad for
570          * backends which need to change the be_Call further (x87 simulator
571          * for instance. However for this particular case the call_type is
572          * sufficient.).
573          */
574         foreach_out_edge(irn, edge) {
575                 const ir_edge_t *res_edge;
576                 ir_node *irn = get_edge_src_irn(edge);
577
578                 if(is_Proj(irn) && get_Proj_proj(irn) == pn_Call_T_result) {
579                         res_proj = irn;
580                         foreach_out_edge(irn, res_edge) {
581                                 int proj;
582                                 be_abi_call_arg_t *arg;
583                                 ir_node *res = get_edge_src_irn(res_edge);
584
585                                 assert(is_Proj(res));
586
587                                 proj = get_Proj_proj(res);
588                                 arg = get_call_arg(call, 1, proj);
589
590                                 /*
591                                         shift the proj number to the right, since we will drop the
592                                         unspeakable Proj_T from the Call. Therefore, all real argument
593                                         Proj numbers must be increased by pn_be_Call_first_res
594                                 */
595                                 proj += pn_be_Call_first_res;
596                                 set_Proj_proj(res, proj);
597                                 obstack_ptr_grow(obst, res);
598
599                                 if(proj > curr_res_proj)
600                                         curr_res_proj = proj;
601                                 if(arg->in_reg) {
602                                         pset_remove_ptr(caller_save, arg->reg);
603                                         //pmap_insert(arg_regs, arg->reg, INT_TO_PTR(proj + 1))
604                                 }
605                         }
606                 }
607         }
608
609         curr_res_proj++;
610         obstack_ptr_grow(obst, NULL);
611         res_projs = obstack_finish(obst);
612
613         /* make the back end call node and set its register requirements. */
614         for(i = 0; i < n_low_args; ++i)
615                 obstack_ptr_grow(obst, get_Call_param(irn, low_args[i]));
616
617         in = obstack_finish(obst);
618
619         if(env->call->flags.bits.call_has_imm && get_irn_opcode(call_ptr) == iro_SymConst) {
620                 low_call = be_new_Call(get_irn_dbg_info(irn), irg, bl, curr_mem, curr_sp, curr_sp,
621                                        curr_res_proj + pset_count(caller_save), n_low_args, in,
622                                        get_Call_type(irn));
623                 be_Call_set_entity(low_call, get_SymConst_entity(call_ptr));
624         }
625
626         else
627                 low_call = be_new_Call(get_irn_dbg_info(irn), irg, bl, curr_mem, curr_sp, call_ptr,
628                                        curr_res_proj + pset_count(caller_save), n_low_args, in,
629                                        get_Call_type(irn));
630
631         /*
632                 TODO:
633                 Set the register class of the call address to the same as the stack pointer's.
634                 That' probably buggy for some architectures.
635         */
636         be_node_set_reg_class(low_call, be_pos_Call_ptr, sp->reg_class);
637
638         /* Set the register classes and constraints of the Call parameters. */
639         for(i = 0; i < n_low_args; ++i) {
640                 int index = low_args[i];
641                 be_abi_call_arg_t *arg = get_call_arg(call, 0, index);
642                 assert(arg->reg != NULL);
643
644                 be_set_constr_single_reg(low_call, be_pos_Call_first_arg + index, arg->reg);
645         }
646
647         /* Set the register constraints of the results. */
648         for(i = 0; res_projs[i]; ++i) {
649                 ir_node *irn                 = res_projs[i];
650                 int proj                     = get_Proj_proj(irn);
651
652                 /* Correct Proj number since it has been adjusted! (see above) */
653                 const be_abi_call_arg_t *arg = get_call_arg(call, 1, proj - pn_Call_max);
654
655                 assert(arg->in_reg);
656                 be_set_constr_single_reg(low_call, BE_OUT_POS(proj), arg->reg);
657         }
658         obstack_free(obst, in);
659         exchange(irn, low_call);
660
661         /* redirect the result projs to the lowered call instead of the Proj_T */
662         for(i = 0; res_projs[i]; ++i)
663                 set_Proj_pred(res_projs[i], low_call);
664
665         /* Make additional projs for the caller save registers
666            and the Keep node which keeps them alive. */
667         if(pset_count(caller_save) > 0) {
668                 const arch_register_t *reg;
669                 ir_node **in, *keep;
670                 int i, n;
671
672                 for(reg = pset_first(caller_save), n = 0; reg; reg = pset_next(caller_save), ++n) {
673                         ir_node *proj = new_r_Proj(irg, bl, low_call, reg->reg_class->mode, curr_res_proj);
674
675                         /* memorize the register in the link field. we need afterwards to set the register class of the keep correctly. */
676                         be_set_constr_single_reg(low_call, BE_OUT_POS(curr_res_proj), reg);
677                         set_irn_link(proj, (void *) reg);
678                         obstack_ptr_grow(obst, proj);
679                         curr_res_proj++;
680                 }
681
682                 in   = (ir_node **) obstack_finish(obst);
683                 keep = be_new_Keep(NULL, irg, bl, n, in);
684                 for(i = 0; i < n; ++i) {
685                         const arch_register_t *reg = get_irn_link(in[i]);
686                         be_node_set_reg_class(keep, i, reg->reg_class);
687                 }
688                 obstack_free(obst, in);
689         }
690
691         /* Clean up the stack. */
692         if(stack_size > 0) {
693                 ir_node *mem_proj = NULL;
694
695                 foreach_out_edge(low_call, edge) {
696                         ir_node *irn = get_edge_src_irn(edge);
697                         if(is_Proj(irn) && get_Proj_proj(irn) == pn_Call_M) {
698                                 mem_proj = irn;
699                                 break;
700                         }
701                 }
702
703                 if(!mem_proj)
704                         mem_proj = new_r_Proj(irg, bl, low_call, mode_M, pn_Call_M);
705
706                  /* Clean up the stack frame if we allocated it */
707                 if(!no_alloc)
708                         curr_sp = be_new_IncSP(sp, irg, bl, curr_sp, mem_proj, stack_size, be_stack_dir_shrink);
709         }
710
711         be_abi_call_free(call);
712         obstack_free(obst, pos);
713         del_pset(results);
714         del_pset(caller_save);
715
716         return curr_sp;
717 }
718
719 /**
720  * Adjust an alloca.
721  * The alloca is transformed into a back end alloca node and connected to the stack nodes.
722  */
723 static ir_node *adjust_alloc(be_abi_irg_t *env, ir_node *alloc, ir_node *curr_sp)
724 {
725         if (get_Alloc_where(alloc) == stack_alloc) {
726                 ir_node *bl        = get_nodes_block(alloc);
727                 ir_graph *irg      = get_irn_irg(bl);
728                 ir_node *alloc_mem = NULL;
729                 ir_node *alloc_res = NULL;
730
731                 const ir_edge_t *edge;
732                 ir_node *new_alloc;
733
734                 foreach_out_edge(alloc, edge) {
735                         ir_node *irn = get_edge_src_irn(edge);
736
737                         assert(is_Proj(irn));
738                         switch(get_Proj_proj(irn)) {
739                         case pn_Alloc_M:
740                                 alloc_mem = irn;
741                                 break;
742                         case pn_Alloc_res:
743                                 alloc_res = irn;
744                                 break;
745                         default:
746                                 break;
747                         }
748                 }
749
750                 /* Beware: currently Alloc nodes without a result might happen,
751                    only escape analysis kills them and this phase runs only for object
752                    oriented source. We kill the Alloc here. */
753                 if (alloc_res == NULL) {
754                         exchange(alloc_mem, get_Alloc_mem(alloc));
755                         return curr_sp;
756                 }
757
758                 /* The stack pointer will be modified in an unknown manner.
759                    We cannot omit it. */
760                 env->call->flags.bits.try_omit_fp = 0;
761                 new_alloc = be_new_AddSP(env->isa->sp, irg, bl, curr_sp, get_Alloc_size(alloc));
762
763                 exchange(alloc_res, env->isa->stack_dir < 0 ? new_alloc : curr_sp);
764
765                 if(alloc_mem != NULL)
766                         exchange(alloc_mem, new_r_NoMem(irg));
767
768                 curr_sp = new_alloc;
769         }
770
771         return curr_sp;
772 }
773
774 /**
775  * Walker for dependent_on().
776  * This function searches a node tgt recursively from a given node
777  * but is restricted to the given block.
778  * @return 1 if tgt was reachable from curr, 0 if not.
779  */
780 static int check_dependence(ir_node *curr, ir_node *tgt, ir_node *bl, unsigned long visited_nr)
781 {
782         int n, i;
783
784         if(get_irn_visited(curr) >= visited_nr)
785                 return 0;
786
787         set_irn_visited(curr, visited_nr);
788         if(get_nodes_block(curr) != bl)
789                 return 0;
790
791         if(curr == tgt)
792                 return 1;
793
794         for(i = 0, n = get_irn_arity(curr); i < n; ++i) {
795                 if(check_dependence(get_irn_n(curr, i), tgt, bl, visited_nr))
796                         return 1;
797         }
798
799         return 0;
800 }
801
802 /**
803  * Check if a node is somehow data dependent on another one.
804  * both nodes must be in the same basic block.
805  * @param n1 The first node.
806  * @param n2 The second node.
807  * @return 1, if n1 is data dependent (transitively) on n2, 0 if not.
808  */
809 static int dependent_on(ir_node *n1, ir_node *n2)
810 {
811         ir_node *bl   = get_nodes_block(n1);
812         ir_graph *irg = get_irn_irg(bl);
813         long vis_nr   = get_irg_visited(irg) + 1;
814
815         assert(bl == get_nodes_block(n2));
816         set_irg_visited(irg, vis_nr);
817         return check_dependence(n1, n2, bl, vis_nr);
818 }
819
820 static int cmp_call_dependecy(const void *c1, const void *c2)
821 {
822         ir_node *n1 = *(ir_node **) c1;
823         ir_node *n2 = *(ir_node **) c2;
824
825         /*
826                 Classical qsort() comparison function behavior:
827                 0  if both elements are equal
828                 1  if second is "smaller" that first
829                 -1 if first is "smaller" that second
830         */
831         return n1 == n2 ? 0 : (dependent_on(n1, n2) ? -1 : 1);
832 }
833
834 static void link_calls_in_block_walker(ir_node *irn, void *data)
835 {
836         if(is_Call(irn)) {
837                 be_abi_irg_t *env = data;
838                 ir_node *bl       = get_nodes_block(irn);
839                 void *save        = get_irn_link(bl);
840
841                 env->call->flags.bits.irg_is_leaf = 0;
842
843                 set_irn_link(irn, save);
844                 set_irn_link(bl, irn);
845         }
846 }
847
848 /**
849  * Process all call nodes inside a basic block.
850  * Note that the link field of the block must contain a linked list of all
851  * Call nodes inside the block. We first order this list according to data dependency
852  * and that connect the calls together.
853  */
854 static void process_calls_in_block(ir_node *bl, void *data)
855 {
856         be_abi_irg_t *env = data;
857         ir_node *curr_sp  = env->init_sp;
858         ir_node *irn;
859         int n;
860
861         for(irn = get_irn_link(bl), n = 0; irn; irn = get_irn_link(irn), ++n)
862                 obstack_ptr_grow(&env->obst, irn);
863
864         /* If there were call nodes in the block. */
865         if(n > 0) {
866                 ir_node *keep;
867                 ir_node **nodes;
868                 int i;
869
870                 nodes = obstack_finish(&env->obst);
871
872                 /* order the call nodes according to data dependency */
873                 qsort(nodes, n, sizeof(nodes[0]), cmp_call_dependecy);
874
875                 for(i = n - 1; i >= 0; --i) {
876                         ir_node *irn = nodes[i];
877
878                         switch(get_irn_opcode(irn)) {
879                         case iro_Call:
880                                 curr_sp = adjust_call(env, irn, curr_sp);
881                                 break;
882                         case iro_Alloc:
883                                 curr_sp = adjust_alloc(env, irn, curr_sp);
884                                 break;
885                         default:
886                                 break;
887                         }
888                 }
889
890                 obstack_free(&env->obst, nodes);
891
892                 /* Keep the last stack state in the block by tying it to Keep node */
893                 nodes[0] = curr_sp;
894                 keep     = be_new_Keep(env->isa->sp->reg_class, get_irn_irg(bl), bl, 1, nodes);
895                 pmap_insert(env->keep_map, bl, keep);
896         }
897
898         set_irn_link(bl, curr_sp);
899 }
900
901 /**
902  * Adjust all call nodes in the graph to the ABI conventions.
903  */
904 static void process_calls(be_abi_irg_t *env)
905 {
906         ir_graph *irg = env->birg->irg;
907
908         env->call->flags.bits.irg_is_leaf = 1;
909         irg_walk_graph(irg, firm_clear_link, link_calls_in_block_walker, env);
910         irg_block_walk_graph(irg, NULL, process_calls_in_block, env);
911 }
912
913 static void collect_return_walker(ir_node *irn, void *data)
914 {
915         if(get_irn_opcode(irn) == iro_Return) {
916                 struct obstack *obst = data;
917                 obstack_ptr_grow(obst, irn);
918         }
919 }
920
921 #if 0 /*
922 static ir_node *setup_frame(be_abi_irg_t *env)
923 {
924         const arch_isa_t *isa = env->birg->main_env->arch_env->isa;
925         const arch_register_t *sp = isa->sp;
926         const arch_register_t *bp = isa->bp;
927         be_abi_call_flags_bits_t flags = env->call->flags.bits;
928         ir_graph *irg      = env->birg->irg;
929         ir_node *bl        = get_irg_start_block(irg);
930         ir_node *no_mem    = get_irg_no_mem(irg);
931         ir_node *old_frame = get_irg_frame(irg);
932         ir_node *stack     = pmap_get(env->regs, (void *) sp);
933         ir_node *frame     = pmap_get(env->regs, (void *) bp);
934
935         int stack_nr       = get_Proj_proj(stack);
936
937         if(flags.try_omit_fp) {
938                 stack = be_new_IncSP(sp, irg, bl, stack, no_mem, BE_STACK_FRAME_SIZE, be_stack_dir_expand);
939                 frame = stack;
940         }
941
942         else {
943                 frame = be_new_Copy(bp->reg_class, irg, bl, stack);
944
945                 be_node_set_flags(frame, -1, arch_irn_flags_dont_spill);
946                 if(!flags.fp_free) {
947                         be_set_constr_single_reg(frame, -1, bp);
948                         be_node_set_flags(frame, -1, arch_irn_flags_ignore);
949                         arch_set_irn_register(env->birg->main_env->arch_env, frame, bp);
950                 }
951
952                 stack = be_new_IncSP(sp, irg, bl, stack, frame, BE_STACK_FRAME_SIZE, be_stack_dir_expand);
953         }
954
955         be_node_set_flags(env->reg_params, -(stack_nr + 1), arch_irn_flags_ignore);
956         env->init_sp = stack;
957         set_irg_frame(irg, frame);
958         edges_reroute(old_frame, frame, irg);
959
960         return frame;
961 }
962
963 static void clearup_frame(be_abi_irg_t *env, ir_node *ret, pmap *reg_map, struct obstack *obst)
964 {
965         const arch_isa_t *isa = env->birg->main_env->arch_env->isa;
966         const arch_register_t *sp = isa->sp;
967         const arch_register_t *bp = isa->bp;
968         ir_graph *irg      = env->birg->irg;
969         ir_node *ret_mem   = get_Return_mem(ret);
970         ir_node *frame     = get_irg_frame(irg);
971         ir_node *bl        = get_nodes_block(ret);
972         ir_node *stack     = get_irn_link(bl);
973
974         pmap_entry *ent;
975
976         if(env->call->flags.bits.try_omit_fp) {
977                 stack = be_new_IncSP(sp, irg, bl, stack, ret_mem, BE_STACK_FRAME_SIZE, be_stack_dir_shrink);
978         }
979
980         else {
981                 stack = be_new_SetSP(sp, irg, bl, stack, frame, ret_mem);
982                 be_set_constr_single_reg(stack, -1, sp);
983                 be_node_set_flags(stack, -1, arch_irn_flags_ignore);
984         }
985
986         pmap_foreach(env->regs, ent) {
987                 const arch_register_t *reg = ent->key;
988                 ir_node *irn               = ent->value;
989
990                 if(reg == sp)
991                         obstack_ptr_grow(&env->obst, stack);
992                 else if(reg == bp)
993                         obstack_ptr_grow(&env->obst, frame);
994                 else if(arch_register_type_is(reg, callee_save) || arch_register_type_is(reg, ignore))
995                         obstack_ptr_grow(obst, irn);
996         }
997 }
998 */
999 #endif
1000
1001 static ir_type *compute_arg_type(be_abi_irg_t *env, be_abi_call_t *call, ir_type *method_type)
1002 {
1003         int dir  = env->call->flags.bits.left_to_right ? 1 : -1;
1004         int inc  = env->birg->main_env->arch_env->isa->stack_dir * dir;
1005         int n    = get_method_n_params(method_type);
1006         int curr = inc > 0 ? 0 : n - 1;
1007         int ofs  = 0;
1008
1009         char buf[128];
1010         ir_type *res;
1011         int i;
1012
1013         snprintf(buf, sizeof(buf), "%s_arg_type", get_entity_name(get_irg_entity(env->birg->irg)));
1014         res = new_type_class(new_id_from_str(buf));
1015
1016         for(i = 0; i < n; ++i, curr += inc) {
1017                 type *param_type       = get_method_param_type(method_type, curr);
1018                 be_abi_call_arg_t *arg = get_call_arg(call, 0, curr);
1019
1020                 if(arg->on_stack) {
1021                         snprintf(buf, sizeof(buf), "param_%d", i);
1022                         arg->stack_ent = new_entity(res, new_id_from_str(buf), param_type);
1023                         ofs += arg->space_before;
1024                         ofs = round_up2(ofs, arg->alignment);
1025                         set_entity_offset_bytes(arg->stack_ent, ofs);
1026                         ofs += arg->space_after;
1027                         ofs += get_type_size_bytes(param_type);
1028                 }
1029         }
1030
1031         set_type_size_bytes(res, ofs);
1032         return res;
1033 }
1034
1035 static void create_register_perms(const arch_isa_t *isa, ir_graph *irg, ir_node *bl, pmap *regs)
1036 {
1037         int i, j, n;
1038         struct obstack obst;
1039
1040         obstack_init(&obst);
1041
1042         /* Create a Perm after the RegParams node to delimit it. */
1043         for(i = 0, n = arch_isa_get_n_reg_class(isa); i < n; ++i) {
1044                 const arch_register_class_t *cls = arch_isa_get_reg_class(isa, i);
1045                 ir_node *perm;
1046                 ir_node **in;
1047                 int n_regs;
1048
1049                 for(n_regs = 0, j = 0; j < cls->n_regs; ++j) {
1050                         const arch_register_t *reg = &cls->regs[j];
1051                         ir_node *irn = pmap_get(regs, (void *) reg);
1052
1053                         if(irn && !arch_register_type_is(reg, ignore)) {
1054                                 n_regs++;
1055                                 obstack_ptr_grow(&obst, irn);
1056                                 set_irn_link(irn, (void *) reg);
1057                         }
1058                 }
1059
1060                 obstack_ptr_grow(&obst, NULL);
1061                 in = obstack_finish(&obst);
1062                 if(n_regs > 0) {
1063                         perm = be_new_Perm(cls, irg, bl, n_regs, in);
1064                         for(j = 0; j < n_regs; ++j) {
1065                                 ir_node *arg = in[j];
1066                                 arch_register_t *reg = get_irn_link(arg);
1067                                 pmap_insert(regs, reg, arg);
1068                                 be_set_constr_single_reg(perm, BE_OUT_POS(j), reg);
1069                         }
1070                 }
1071                 obstack_free(&obst, in);
1072         }
1073
1074         obstack_free(&obst, NULL);
1075 }
1076
1077 typedef struct {
1078         const arch_register_t *reg;
1079         ir_node *irn;
1080 } reg_node_map_t;
1081
1082 static int cmp_regs(const void *a, const void *b)
1083 {
1084         const reg_node_map_t *p = a;
1085         const reg_node_map_t *q = b;
1086
1087         if(p->reg->reg_class == q->reg->reg_class)
1088                 return p->reg->index - q->reg->index;
1089         else
1090                 return p->reg->reg_class - q->reg->reg_class;
1091 }
1092
1093 static reg_node_map_t *reg_map_to_arr(struct obstack *obst, pmap *reg_map)
1094 {
1095         pmap_entry *ent;
1096         int n = pmap_count(reg_map);
1097         int i = 0;
1098         reg_node_map_t *res = obstack_alloc(obst, n * sizeof(res[0]));
1099
1100         pmap_foreach(reg_map, ent) {
1101                 res[i].reg = ent->key;
1102                 res[i].irn = ent->value;
1103                 i++;
1104         }
1105
1106         qsort(res, n, sizeof(res[0]), cmp_regs);
1107         return res;
1108 }
1109
1110 /**
1111  * Creates a barrier.
1112  */
1113 static ir_node *create_barrier(be_abi_irg_t *env, ir_node *bl, ir_node **mem, pmap *regs, int in_req)
1114 {
1115         ir_graph *irg = env->birg->irg;
1116         int n_regs    = pmap_count(regs);
1117         int n;
1118         ir_node *irn;
1119         ir_node **in;
1120         reg_node_map_t *rm;
1121
1122         rm = reg_map_to_arr(&env->obst, regs);
1123
1124         for(n = 0; n < n_regs; ++n)
1125                 obstack_ptr_grow(&env->obst, rm[n].irn);
1126
1127         if(mem) {
1128                 obstack_ptr_grow(&env->obst, *mem);
1129                 n++;
1130         }
1131
1132         in = (ir_node **) obstack_finish(&env->obst);
1133         irn = be_new_Barrier(irg, bl, n, in);
1134         obstack_free(&env->obst, in);
1135
1136         for(n = 0; n < n_regs; ++n) {
1137                 const arch_register_t *reg = rm[n].reg;
1138                 int flags                  = 0;
1139                 int pos                    = BE_OUT_POS(n);
1140                 ir_node *proj;
1141
1142                 proj = new_r_Proj(irg, bl, irn, get_irn_mode(rm[n].irn), n);
1143                 be_node_set_reg_class(irn, n, reg->reg_class);
1144                 if(in_req)
1145                         be_set_constr_single_reg(irn, n, reg);
1146                 be_set_constr_single_reg(irn, pos, reg);
1147                 be_node_set_reg_class(irn, pos, reg->reg_class);
1148                 arch_set_irn_register(env->birg->main_env->arch_env, proj, reg);
1149
1150                 /* if the proj projects a ignore register or a node which is set to ignore, propagate this property. */
1151                 if(arch_register_type_is(reg, ignore) || arch_irn_is(env->birg->main_env->arch_env, in[n], ignore))
1152                         flags |= arch_irn_flags_ignore;
1153
1154                 if(arch_irn_is(env->birg->main_env->arch_env, in[n], modify_sp))
1155                         flags |= arch_irn_flags_modify_sp;
1156
1157                 be_node_set_flags(irn, pos, flags);
1158
1159                 pmap_insert(regs, (void *) reg, proj);
1160         }
1161
1162         if(mem) {
1163                 *mem = new_r_Proj(irg, bl, irn, mode_M, n);
1164         }
1165
1166         obstack_free(&env->obst, rm);
1167         return irn;
1168 }
1169
1170 /**
1171  * Creates a be_Return for a Return node.
1172  *
1173  * @param @env    the abi environment
1174  * @param irn     the Return node or NULL if there was none
1175  * @param bl      the block where the be_Retun should be placed
1176  * @param mem     the current memory
1177  * @param n_res   number of return results
1178  */
1179 static ir_node *create_be_return(be_abi_irg_t *env, ir_node *irn, ir_node *bl, ir_node *mem, int n_res) {
1180         be_abi_call_t *call = env->call;
1181         const arch_isa_t *isa = env->birg->main_env->arch_env->isa;
1182
1183         pmap *reg_map  = pmap_create();
1184         ir_node *keep  = pmap_get(env->keep_map, bl);
1185         int in_max;
1186         ir_node *ret;
1187         int i, n;
1188         ir_node **in;
1189         ir_node *stack;
1190         const arch_register_t **regs;
1191         pmap_entry *ent ;
1192
1193         /*
1194                 get the valid stack node in this block.
1195                 If we had a call in that block there is a Keep constructed by process_calls()
1196                 which points to the last stack modification in that block. we'll use
1197                 it then. Else we use the stack from the start block and let
1198                 the ssa construction fix the usage.
1199         */
1200         stack = be_abi_reg_map_get(env->regs, isa->sp);
1201         if (keep) {
1202                 ir_node *bad = new_r_Bad(env->birg->irg);
1203                 stack = get_irn_n(keep, 0);
1204                 set_nodes_block(keep, bad);
1205                 set_irn_n(keep, 0, bad);
1206                 // exchange(keep, new_r_Bad(env->birg->irg));
1207         }
1208
1209         /* Insert results for Return into the register map. */
1210         for(i = 0; i < n_res; ++i) {
1211                 ir_node *res           = get_Return_res(irn, i);
1212                 be_abi_call_arg_t *arg = get_call_arg(call, 1, i);
1213                 assert(arg->in_reg && "return value must be passed in register");
1214                 pmap_insert(reg_map, (void *) arg->reg, res);
1215         }
1216
1217         /* Add uses of the callee save registers. */
1218         pmap_foreach(env->regs, ent) {
1219                 const arch_register_t *reg = ent->key;
1220                 if(arch_register_type_is(reg, callee_save) || arch_register_type_is(reg, ignore))
1221                         pmap_insert(reg_map, ent->key, ent->value);
1222         }
1223
1224         be_abi_reg_map_set(reg_map, isa->sp, stack);
1225
1226         /* Make the Epilogue node and call the arch's epilogue maker. */
1227         create_barrier(env, bl, &mem, reg_map, 1);
1228         call->cb->epilogue(env->cb, bl, &mem, reg_map);
1229
1230         /*
1231                 Maximum size of the in array for Return nodes is
1232                 return args + callee save/ignore registers + memory + stack pointer
1233         */
1234         in_max = pmap_count(reg_map) + n_res + 2;
1235
1236         in   = obstack_alloc(&env->obst, in_max * sizeof(in[0]));
1237         regs = obstack_alloc(&env->obst, in_max * sizeof(regs[0]));
1238
1239         in[0]   = mem;
1240         in[1]   = be_abi_reg_map_get(reg_map, isa->sp);
1241         regs[0] = NULL;
1242         regs[1] = isa->sp;
1243         n       = 2;
1244
1245         /* clear SP entry, since it has already been grown. */
1246         pmap_insert(reg_map, (void *) isa->sp, NULL);
1247         for(i = 0; i < n_res; ++i) {
1248                 ir_node *res           = get_Return_res(irn, i);
1249                 be_abi_call_arg_t *arg = get_call_arg(call, 1, i);
1250
1251                 in[n]     = be_abi_reg_map_get(reg_map, arg->reg);
1252                 regs[n++] = arg->reg;
1253
1254                 /* Clear the map entry to mark the register as processed. */
1255                 be_abi_reg_map_set(reg_map, arg->reg, NULL);
1256         }
1257
1258         /* grow the rest of the stuff. */
1259         pmap_foreach(reg_map, ent) {
1260                 if(ent->value) {
1261                         in[n]     = ent->value;
1262                         regs[n++] = ent->key;
1263                 }
1264         }
1265
1266         /* The in array for the new back end return is now ready. */
1267         ret = be_new_Return(irn ? get_irn_dbg_info(irn) : NULL, env->birg->irg, bl, n_res, n, in);
1268
1269         /* Set the register classes of the return's parameter accordingly. */
1270         for(i = 0; i < n; ++i)
1271                 if(regs[i])
1272                         be_node_set_reg_class(ret, i, regs[i]->reg_class);
1273
1274         /* Free the space of the Epilog's in array and the register <-> proj map. */
1275         obstack_free(&env->obst, in);
1276         pmap_destroy(reg_map);
1277
1278         return ret;
1279 }
1280
1281 /**
1282  * Modify the irg itself and the frame type.
1283  */
1284 static void modify_irg(be_abi_irg_t *env)
1285 {
1286         be_abi_call_t *call       = env->call;
1287         const arch_isa_t *isa     = env->birg->main_env->arch_env->isa;
1288         const arch_register_t *sp = arch_isa_sp(isa);
1289         ir_graph *irg             = env->birg->irg;
1290         ir_node *bl               = get_irg_start_block(irg);
1291         ir_node *end              = get_irg_end_block(irg);
1292         ir_node *arg_tuple        = get_irg_args(irg);
1293         ir_node *no_mem           = get_irg_no_mem(irg);
1294         ir_node *mem              = get_irg_initial_mem(irg);
1295         type *method_type         = get_entity_type(get_irg_entity(irg));
1296         pset *dont_save           = pset_new_ptr(8);
1297         int n_params              = get_method_n_params(method_type);
1298         int max_arg               = 0;
1299
1300         int i, j, n;
1301
1302         reg_node_map_t *rm;
1303         const arch_register_t *fp_reg;
1304         ir_node *frame_pointer;
1305         ir_node *barrier;
1306         ir_node *reg_params_bl;
1307         ir_node **args;
1308         const ir_edge_t *edge;
1309         ir_type *arg_type, *bet_type;
1310
1311         bitset_t *used_proj_nr;
1312         DEBUG_ONLY(firm_dbg_module_t *dbg = env->dbg;)
1313
1314         DBG((dbg, LEVEL_1, "introducing abi on %+F\n", irg));
1315
1316         /* Convert the Sel nodes in the irg to frame load/store/addr nodes. */
1317         irg_walk_graph(irg, lower_frame_sels_walker, NULL, env);
1318
1319         env->frame = obstack_alloc(&env->obst, sizeof(env->frame[0]));
1320         env->regs  = pmap_create();
1321
1322         /* Find the maximum proj number of the argument tuple proj */
1323         foreach_out_edge(arg_tuple, edge)  {
1324                 ir_node *irn = get_edge_src_irn(edge);
1325                 int nr       = get_Proj_proj(irn);
1326                 max_arg      = MAX(max_arg, nr);
1327         }
1328
1329         used_proj_nr = bitset_alloca(1024);
1330         max_arg      = MAX(max_arg + 1, n_params);
1331         args         = obstack_alloc(&env->obst, max_arg * sizeof(args[0]));
1332         memset(args, 0, max_arg * sizeof(args[0]));
1333
1334         /* Fill the argument vector */
1335         foreach_out_edge(arg_tuple, edge) {
1336                 ir_node *irn = get_edge_src_irn(edge);
1337                 int nr       = get_Proj_proj(irn);
1338                 args[nr]     = irn;
1339                 DBG((dbg, LEVEL_2, "\treading arg: %d -> %+F\n", nr, irn));
1340         }
1341
1342         arg_type = compute_arg_type(env, call, method_type);
1343         bet_type = call->cb->get_between_type(env->cb);
1344         stack_frame_init(env->frame, arg_type, bet_type, get_irg_frame_type(irg), isa->stack_dir);
1345
1346         /* Count the register params and add them to the number of Projs for the RegParams node */
1347         for(i = 0; i < n_params; ++i) {
1348                 be_abi_call_arg_t *arg = get_call_arg(call, 0, i);
1349                 if(arg->in_reg && args[i]) {
1350                         assert(arg->reg != sp && "cannot use stack pointer as parameter register");
1351                         assert(i == get_Proj_proj(args[i]));
1352
1353                         /* For now, associate the register with the old Proj from Start representing that argument. */
1354                         pmap_insert(env->regs, (void *) arg->reg, args[i]);
1355                         bitset_set(used_proj_nr, i);
1356                         DBG((dbg, LEVEL_2, "\targ #%d -> reg %s\n", i, arg->reg->name));
1357                 }
1358         }
1359
1360         /* Collect all callee-save registers */
1361         for(i = 0, n = arch_isa_get_n_reg_class(isa); i < n; ++i) {
1362                 const arch_register_class_t *cls = arch_isa_get_reg_class(isa, i);
1363                 for(j = 0; j < cls->n_regs; ++j) {
1364                         const arch_register_t *reg = &cls->regs[j];
1365                         if(arch_register_type_is(reg, callee_save) || arch_register_type_is(reg, ignore))
1366                                 pmap_insert(env->regs, (void *) reg, NULL);
1367                 }
1368         }
1369
1370         pmap_insert(env->regs, (void *) sp, NULL);
1371         pmap_insert(env->regs, (void *) isa->bp, NULL);
1372         reg_params_bl   = get_irg_start_block(irg);
1373         env->reg_params = be_new_RegParams(irg, reg_params_bl, pmap_count(env->regs));
1374
1375         /*
1376          * make proj nodes for the callee save registers.
1377          * memorize them, since Return nodes get those as inputs.
1378          *
1379          * Note, that if a register corresponds to an argument, the regs map contains
1380          * the old Proj from start for that argument.
1381          */
1382
1383         rm = reg_map_to_arr(&env->obst, env->regs);
1384         for(i = 0, n = pmap_count(env->regs); i < n; ++i) {
1385                 arch_register_t *reg = (void *) rm[i].reg;
1386                 ir_node *arg_proj    = rm[i].irn;
1387                 ir_mode *mode        = arg_proj ? get_irn_mode(arg_proj) : reg->reg_class->mode;
1388                 long nr              = i;
1389                 int pos              = BE_OUT_POS((int) nr);
1390                 int flags            = 0;
1391
1392                 ir_node *proj;
1393
1394                 assert(nr >= 0);
1395                 bitset_set(used_proj_nr, nr);
1396                 proj = new_r_Proj(irg, reg_params_bl, env->reg_params, mode, nr);
1397                 pmap_insert(env->regs, (void *) reg, proj);
1398                 be_set_constr_single_reg(env->reg_params, pos, reg);
1399                 arch_set_irn_register(env->birg->main_env->arch_env, proj, reg);
1400
1401                 /*
1402                  * If the register is an ignore register,
1403                  * The Proj for that register shall also be ignored during register allocation.
1404                  */
1405                 if(arch_register_type_is(reg, ignore))
1406                         flags |= arch_irn_flags_ignore;
1407
1408                 if(reg == sp)
1409                         flags |= arch_irn_flags_modify_sp;
1410
1411                 be_node_set_flags(env->reg_params, pos, flags);
1412
1413                 DBG((dbg, LEVEL_2, "\tregister save proj #%d -> reg %s\n", nr, reg->name));
1414         }
1415         obstack_free(&env->obst, rm);
1416
1417         /* Generate the Prologue */
1418         fp_reg  = call->cb->prologue(env->cb, &mem, env->regs);
1419
1420         /* do the stack allocation BEFORE the barrier, or spill code
1421            might be added before it */
1422         env->init_sp  = be_abi_reg_map_get(env->regs, sp);
1423         env->init_sp = be_new_IncSP(sp, irg, bl, env->init_sp, no_mem, BE_STACK_FRAME_SIZE, be_stack_dir_expand);
1424         be_abi_reg_map_set(env->regs, sp, env->init_sp);
1425
1426         barrier = create_barrier(env, bl, &mem, env->regs, 0);
1427
1428         env->init_sp  = be_abi_reg_map_get(env->regs, sp);
1429         arch_set_irn_register(env->birg->main_env->arch_env, env->init_sp, sp);
1430
1431         frame_pointer = be_abi_reg_map_get(env->regs, fp_reg);
1432         set_irg_frame(irg, frame_pointer);
1433         pset_insert_ptr(env->ignore_regs, fp_reg);
1434
1435         /* Now, introduce stack param nodes for all parameters passed on the stack */
1436         for(i = 0; i < max_arg; ++i) {
1437                 ir_node *arg_proj = args[i];
1438                 ir_node *repl     = NULL;
1439
1440                 if(arg_proj != NULL) {
1441                         be_abi_call_arg_t *arg;
1442                         ir_type *param_type;
1443                         int nr = get_Proj_proj(arg_proj);
1444
1445                         nr         = MIN(nr, n_params);
1446                         arg        = get_call_arg(call, 0, nr);
1447                         param_type = get_method_param_type(method_type, nr);
1448
1449                         if(arg->in_reg) {
1450                                 repl = pmap_get(env->regs, (void *) arg->reg);
1451                         }
1452
1453                         else if(arg->on_stack) {
1454                                 /* For atomic parameters which are actually used, we create a StackParam node. */
1455                                 if(is_atomic_type(param_type) && get_irn_n_edges(args[i]) > 0) {
1456                                         ir_mode *mode                    = get_type_mode(param_type);
1457                                         const arch_register_class_t *cls = arch_isa_get_reg_class_for_mode(isa, mode);
1458                                         repl = be_new_StackParam(cls, isa->bp->reg_class, irg, reg_params_bl, mode, frame_pointer, arg->stack_ent);
1459                                 }
1460
1461                                 /* The stack parameter is not primitive (it is a struct or array),
1462                                 we thus will create a node representing the parameter's address
1463                                 on the stack. */
1464                                 else {
1465                                         repl = be_new_FrameAddr(sp->reg_class, irg, reg_params_bl, frame_pointer, arg->stack_ent);
1466                                 }
1467                         }
1468
1469                         assert(repl != NULL);
1470                         edges_reroute(args[i], repl, irg);
1471                 }
1472         }
1473
1474         /* All Return nodes hang on the End node, so look for them there. */
1475         for (i = 0, n = get_Block_n_cfgpreds(end); i < n; ++i) {
1476                 ir_node *irn = get_Block_cfgpred(end, i);
1477
1478                 if (is_Return(irn)) {
1479                         ir_node *ret = create_be_return(env, irn, get_nodes_block(irn), get_Return_mem(irn), get_Return_n_ress(irn));
1480                         exchange(irn, ret);
1481                 }
1482         }
1483         /* if we have endless loops here, n might be <= 0. Do NOT create a be_Return than,
1484            the code is dead and will never be executed. */
1485
1486         del_pset(dont_save);
1487         obstack_free(&env->obst, args);
1488 }
1489
1490 /**
1491  * Walker: puts all Alloc(stack_alloc) on a obstack
1492  */
1493 static void collect_alloca_walker(ir_node *irn, void *data)
1494 {
1495         be_abi_irg_t *env = data;
1496         if(get_irn_opcode(irn) == iro_Alloc && get_Alloc_where(irn) == stack_alloc)
1497                 obstack_ptr_grow(&env->obst, irn);
1498 }
1499
1500 be_abi_irg_t *be_abi_introduce(be_irg_t *birg)
1501 {
1502         be_abi_irg_t *env  = xmalloc(sizeof(env[0]));
1503         ir_node *old_frame = get_irg_frame(birg->irg);
1504         ir_graph *irg      = birg->irg;
1505
1506         pmap_entry *ent;
1507         ir_node *dummy;
1508
1509         obstack_init(&env->obst);
1510
1511         env->isa           = birg->main_env->arch_env->isa;
1512         env->method_type   = get_entity_type(get_irg_entity(irg));
1513         env->call          = be_abi_call_new();
1514         arch_isa_get_call_abi(env->isa, env->method_type, env->call);
1515
1516         env->ignore_regs      = pset_new_ptr_default();
1517         env->keep_map         = pmap_create();
1518         env->dce_survivor     = new_survive_dce();
1519         env->birg             = birg;
1520         env->stack_phis       = pset_new_ptr(16);
1521         env->init_sp = dummy  = new_r_Unknown(irg, env->isa->sp->reg_class->mode);
1522         FIRM_DBG_REGISTER(env->dbg, "firm.be.abi");
1523
1524         env->cb = env->call->cb->init(env->call, birg->main_env->arch_env, irg);
1525
1526         memcpy(&env->irn_handler, &abi_irn_handler, sizeof(abi_irn_handler));
1527         env->irn_ops.impl = &abi_irn_ops;
1528
1529         /* Lower all call nodes in the IRG. */
1530         process_calls(env);
1531
1532         /* Process the IRG */
1533         modify_irg(env);
1534
1535         /* We don't need the keep map anymore. */
1536         pmap_destroy(env->keep_map);
1537
1538         /* reroute the stack origin of the calls to the true stack origin. */
1539         edges_reroute(dummy, env->init_sp, irg);
1540         edges_reroute(old_frame, get_irg_frame(irg), irg);
1541
1542         /* Make some important node pointers survive the dead node elimination. */
1543         survive_dce_register_irn(env->dce_survivor, &env->init_sp);
1544         pmap_foreach(env->regs, ent)
1545                 survive_dce_register_irn(env->dce_survivor, (ir_node **) &ent->value);
1546
1547         arch_env_push_irn_handler(env->birg->main_env->arch_env, &env->irn_handler);
1548
1549         env->call->cb->done(env->cb);
1550         be_liveness(irg);
1551         return env;
1552 }
1553
1554 void be_abi_free(be_abi_irg_t *env)
1555 {
1556         free_survive_dce(env->dce_survivor);
1557         del_pset(env->stack_phis);
1558         del_pset(env->ignore_regs);
1559         pmap_destroy(env->regs);
1560         obstack_free(&env->obst, NULL);
1561         arch_env_pop_irn_handler(env->birg->main_env->arch_env);
1562         free(env);
1563 }
1564
1565 void be_abi_put_ignore_regs(be_abi_irg_t *abi, const arch_register_class_t *cls, bitset_t *bs)
1566 {
1567         arch_register_t *reg;
1568
1569         for(reg = pset_first(abi->ignore_regs); reg; reg = pset_next(abi->ignore_regs))
1570                 if(reg->reg_class == cls)
1571                         bitset_set(bs, reg->index);
1572 }
1573
1574
1575 /*
1576
1577   _____ _        ____  _             _
1578  |  ___(_)_  __ / ___|| |_ __ _  ___| | __
1579  | |_  | \ \/ / \___ \| __/ _` |/ __| |/ /
1580  |  _| | |>  <   ___) | || (_| | (__|   <
1581  |_|   |_/_/\_\ |____/ \__\__,_|\___|_|\_\
1582
1583 */
1584
1585 struct fix_stack_walker_info {
1586         nodeset *nodes;
1587         const arch_env_t *aenv;
1588 };
1589
1590 /**
1591  * Walker. Collect all stack modifying nodes.
1592  */
1593 static void collect_stack_nodes_walker(ir_node *irn, void *data)
1594 {
1595         struct fix_stack_walker_info *info = data;
1596
1597         if(arch_irn_is(info->aenv, irn, modify_sp))
1598                 pset_insert_ptr(info->nodes, irn);
1599 }
1600
1601 void be_abi_fix_stack_nodes(be_abi_irg_t *env)
1602 {
1603         dom_front_info_t *df;
1604         pset *stack_nodes = pset_new_ptr(16);
1605         struct fix_stack_walker_info info;
1606
1607         info.nodes = stack_nodes;
1608         info.aenv  = env->birg->main_env->arch_env;
1609
1610         /* We need dominance frontiers for fix up */
1611         df = be_compute_dominance_frontiers(env->birg->irg);
1612         irg_walk_graph(env->birg->irg, collect_stack_nodes_walker, NULL, &info);
1613         pset_insert_ptr(stack_nodes, env->init_sp);
1614         be_ssa_constr_set_phis(df, stack_nodes, env->stack_phis);
1615         del_pset(stack_nodes);
1616
1617         /* Liveness could have changed due to Phi nodes. */
1618         be_liveness(env->birg->irg);
1619
1620         /* free these dominance frontiers */
1621         be_free_dominance_frontiers(df);
1622 }
1623
1624 /**
1625  * Translates a direction of an IncSP node (either be_stack_dir_shrink, or ...expand)
1626  * into -1 or 1, respectively.
1627  * @param irn The node.
1628  * @return 1, if the direction of the IncSP was along, -1 if against.
1629  */
1630 static int get_dir(ir_node *irn)
1631 {
1632         return 1 - 2 * (be_get_IncSP_direction(irn) == be_stack_dir_shrink);
1633 }
1634
1635 static int process_stack_bias(be_abi_irg_t *env, ir_node *bl, int bias)
1636 {
1637         const arch_env_t *aenv = env->birg->main_env->arch_env;
1638         int omit_fp            = env->call->flags.bits.try_omit_fp;
1639         ir_node *irn;
1640
1641         sched_foreach(bl, irn) {
1642
1643                 /*
1644                         If the node modifies the stack pointer by a constant offset,
1645                         record that in the bias.
1646                 */
1647                 if(be_is_IncSP(irn)) {
1648                         int ofs = be_get_IncSP_offset(irn);
1649                         int dir = get_dir(irn);
1650
1651                         if(ofs == BE_STACK_FRAME_SIZE) {
1652                                 ofs = get_type_size_bytes(get_irg_frame_type(env->birg->irg));
1653                                 be_set_IncSP_offset(irn, ofs);
1654                         }
1655
1656                         if(omit_fp)
1657                                 bias += dir * ofs;
1658                 }
1659
1660                 /*
1661                         Else check, if the node relates to an entity on the stack frame.
1662                         If so, set the true offset (including the bias) for that
1663                         node.
1664                 */
1665                 else {
1666                         entity *ent = arch_get_frame_entity(aenv, irn);
1667                         if(ent) {
1668                                 int offset = get_stack_entity_offset(env->frame, ent, bias);
1669                                 arch_set_frame_offset(aenv, irn, offset);
1670                                 DBG((env->dbg, LEVEL_2, "%F has offset %d\n", ent, offset));
1671                         }
1672                 }
1673         }
1674
1675         return bias;
1676 }
1677
1678 /**
1679  * A helper struct for the bias walker.
1680  */
1681 struct bias_walk {
1682         be_abi_irg_t *env;     /**< The ABI irg environment. */
1683         int start_block_bias;  /**< The bias at the end of the start block. */
1684 };
1685
1686 /**
1687  * Block-Walker: fix all stack offsets
1688  */
1689 static void stack_bias_walker(ir_node *bl, void *data)
1690 {
1691         if(bl != get_irg_start_block(get_irn_irg(bl))) {
1692                 struct bias_walk *bw = data;
1693                 process_stack_bias(bw->env, bl, bw->start_block_bias);
1694         }
1695 }
1696
1697 void be_abi_fix_stack_bias(be_abi_irg_t *env)
1698 {
1699         ir_graph *irg  = env->birg->irg;
1700         struct bias_walk bw;
1701
1702         stack_frame_compute_initial_offset(env->frame);
1703         // stack_frame_dump(stdout, env->frame);
1704
1705         /* Determine the stack bias at the end of the start block. */
1706         bw.start_block_bias = process_stack_bias(env, get_irg_start_block(irg), 0);
1707
1708         /* fix the bias is all other blocks */
1709         bw.env = env;
1710         irg_block_walk_graph(irg, stack_bias_walker, NULL, &bw);
1711 }
1712
1713 ir_node *be_abi_get_callee_save_irn(be_abi_irg_t *abi, const arch_register_t *reg)
1714 {
1715         assert(arch_register_type_is(reg, callee_save));
1716         assert(pmap_contains(abi->regs, (void *) reg));
1717         return pmap_get(abi->regs, (void *) reg);
1718 }
1719
1720 /*
1721   _____ _____  _   _   _    _                 _ _
1722  |_   _|  __ \| \ | | | |  | |               | | |
1723    | | | |__) |  \| | | |__| | __ _ _ __   __| | | ___ _ __
1724    | | |  _  /| . ` | |  __  |/ _` | '_ \ / _` | |/ _ \ '__|
1725   _| |_| | \ \| |\  | | |  | | (_| | | | | (_| | |  __/ |
1726  |_____|_|  \_\_| \_| |_|  |_|\__,_|_| |_|\__,_|_|\___|_|
1727
1728   for Phi nodes which are created due to stack modifying nodes
1729   such as IncSP, AddSP and SetSP.
1730
1731   These Phis are always to be ignored by the reg alloc and are
1732   fixed on the SP register of the ISA.
1733 */
1734
1735 static const void *abi_get_irn_ops(const arch_irn_handler_t *handler, const ir_node *irn)
1736 {
1737         const be_abi_irg_t *abi = get_abi_from_handler(handler);
1738         const void *res = NULL;
1739
1740         if(is_Phi(irn) && pset_find_ptr(abi->stack_phis, (void *) irn))
1741                 res = &abi->irn_ops;
1742
1743         return res;
1744 }
1745
1746 static void be_abi_limited(void *data, bitset_t *bs)
1747 {
1748         be_abi_irg_t *abi = data;
1749         bitset_clear_all(bs);
1750         bitset_set(bs, abi->isa->sp->index);
1751 }
1752
1753 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)
1754 {
1755         be_abi_irg_t *abi          = get_abi_from_ops(self);
1756         const arch_register_t *reg = abi->isa->sp;
1757
1758         memset(req, 0, sizeof(req[0]));
1759
1760         if(pos == BE_OUT_POS(0)) {
1761                 req->cls         = reg->reg_class;
1762                 req->type        = arch_register_req_type_limited;
1763                 req->limited     = be_abi_limited;
1764                 req->limited_env = abi;
1765         }
1766
1767         else if(pos >= 0 && pos < get_irn_arity(irn)) {
1768                 req->cls  = reg->reg_class;
1769                 req->type = arch_register_req_type_normal;
1770         }
1771
1772         return req;
1773 }
1774
1775 static void abi_set_irn_reg(const void *self, ir_node *irn, const arch_register_t *reg)
1776 {
1777 }
1778
1779 static const arch_register_t *abi_get_irn_reg(const void *self, const ir_node *irn)
1780 {
1781         const be_abi_irg_t *abi = get_abi_from_ops(self);
1782         return abi->isa->sp;
1783 }
1784
1785 static arch_irn_class_t abi_classify(const void *_self, const ir_node *irn)
1786 {
1787         return arch_irn_class_normal;
1788 }
1789
1790 static arch_irn_flags_t abi_get_flags(const void *_self, const ir_node *irn)
1791 {
1792         return arch_irn_flags_ignore | arch_irn_flags_modify_sp;
1793 }
1794
1795 static entity *abi_get_frame_entity(const void *_self, const ir_node *irn)
1796 {
1797         return NULL;
1798 }
1799
1800 static void abi_set_stack_bias(const void *_self, ir_node *irn, int bias)
1801 {
1802 }
1803
1804 static const arch_irn_ops_if_t abi_irn_ops = {
1805         abi_get_irn_reg_req,
1806         abi_set_irn_reg,
1807         abi_get_irn_reg,
1808         abi_classify,
1809         abi_get_flags,
1810         abi_get_frame_entity,
1811         abi_set_stack_bias
1812 };
1813
1814 static const arch_irn_handler_t abi_irn_handler = {
1815         abi_get_irn_ops
1816 };