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