mips backend updates:
[libfirm] / ir / be / beabi.c
1 /*
2  * Copyright (C) 1995-2007 University of Karlsruhe.  All right reserved.
3  *
4  * This file is part of libFirm.
5  *
6  * This file may be distributed and/or modified under the terms of the
7  * GNU General Public License version 2 as published by the Free Software
8  * Foundation and appearing in the file LICENSE.GPL included in the
9  * packaging of this file.
10  *
11  * Licensees holding valid libFirm Professional Edition licenses may use
12  * this file in accordance with the libFirm Commercial License.
13  * Agreement provided with the Software.
14  *
15  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE.
18  */
19
20 /**
21  * @file
22  * @brief       Backend ABI implementation.
23  * @author      Sebastian Hack
24  * @version     $Id$
25  */
26 #ifdef HAVE_CONFIG_H
27 # include "config.h"
28 #endif
29
30 #include "obst.h"
31 #include "offset.h"
32
33 #include "type.h"
34 #include "irgopt.h"
35
36 #include "irgraph_t.h"
37 #include "irnode_t.h"
38 #include "ircons_t.h"
39 #include "iredges_t.h"
40 #include "irgmod.h"
41 #include "irgwalk.h"
42 #include "irprintf_t.h"
43 #include "irgopt.h"
44 #include "irbitset.h"
45 #include "height.h"
46 #include "pdeq.h"
47 #include "irtools.h"
48 #include "raw_bitset.h"
49
50 #include "be.h"
51 #include "beabi.h"
52 #include "bearch_t.h"
53 #include "benode_t.h"
54 #include "belive_t.h"
55 #include "besched_t.h"
56 #include "beirg_t.h"
57 #include "bessaconstr.h"
58
59 typedef struct _be_abi_call_arg_t {
60         unsigned is_res   : 1;  /**< 1: the call argument is a return value. 0: it's a call parameter. */
61         unsigned in_reg   : 1;  /**< 1: this argument is transmitted in registers. */
62         unsigned on_stack : 1;  /**< 1: this argument is transmitted on the stack. */
63
64         int pos;
65         const arch_register_t *reg;
66         ir_entity *stack_ent;
67         unsigned alignment;
68         unsigned space_before;
69         unsigned space_after;
70 } be_abi_call_arg_t;
71
72 struct _be_abi_call_t {
73         be_abi_call_flags_t         flags;
74         const be_abi_callbacks_t    *cb;
75         ir_type                     *between_type;
76         set                         *params;
77         const arch_register_class_t *cls_addr;
78 };
79
80 struct _be_abi_irg_t {
81         struct obstack       obst;
82         be_stack_layout_t    *frame;        /**< The stack frame model. */
83         be_irg_t             *birg;         /**< The back end IRG. */
84         const arch_isa_t     *isa;          /**< The isa. */
85         survive_dce_t        *dce_survivor;
86
87         be_abi_call_t        *call;         /**< The ABI call information. */
88         ir_type              *method_type;  /**< The type of the method of the IRG. */
89
90         ir_node              *init_sp;      /**< The node representing the stack pointer
91                                                                              at the start of the function. */
92
93         ir_node              *start_barrier; /**< The barrier of the start block */
94
95         ir_node              *reg_params;   /**< The reg params node. */
96         pmap                 *regs;         /**< A map of all callee-save and ignore regs to
97                                                                                         their Projs to the RegParams node. */
98
99         int                  start_block_bias;  /**< The stack bias at the end of the start block. */
100
101         void                 *cb;           /**< ABI Callback self pointer. */
102
103         pmap                 *keep_map;     /**< mapping blocks to keep nodes. */
104         pset                 *ignore_regs;  /**< Additional registers which shall be ignored. */
105
106         ir_node             **calls;        /**< flexible array containing all be_Call nodes */
107
108         arch_register_req_t sp_req;
109         arch_register_req_t sp_cls_req;
110
111         DEBUG_ONLY(firm_dbg_module_t    *dbg;)          /**< The debugging module. */
112 };
113
114 static heights_t *ir_heights;
115
116 /* Flag: if set, try to omit the frame pointer if called by the backend */
117 static int be_omit_fp = 1;
118
119 /*
120      _    ____ ___    ____      _ _ _                _
121     / \  | __ )_ _|  / ___|__ _| | | |__   __ _  ___| | _____
122    / _ \ |  _ \| |  | |   / _` | | | '_ \ / _` |/ __| |/ / __|
123   / ___ \| |_) | |  | |__| (_| | | | |_) | (_| | (__|   <\__ \
124  /_/   \_\____/___|  \____\__,_|_|_|_.__/ \__,_|\___|_|\_\___/
125
126   These callbacks are used by the backend to set the parameters
127   for a specific call type.
128 */
129
130 /**
131  * Set compare function: compares two ABI call object arguments.
132  */
133 static int cmp_call_arg(const void *a, const void *b, size_t n)
134 {
135         const be_abi_call_arg_t *p = a, *q = b;
136         return !(p->is_res == q->is_res && p->pos == q->pos);
137 }
138
139 /**
140  * Get or set an ABI call object argument.
141  *
142  * @param call      the abi call
143  * @param is_res    true for call results, false for call arguments
144  * @param pos       position of the argument
145  * @param do_insert true if the argument is set, false if it's retrieved
146  */
147 static be_abi_call_arg_t *get_or_set_call_arg(be_abi_call_t *call, int is_res, int pos, int do_insert)
148 {
149         be_abi_call_arg_t arg;
150         unsigned hash;
151
152         memset(&arg, 0, sizeof(arg));
153         arg.is_res = is_res;
154         arg.pos    = pos;
155
156         hash = is_res * 128 + pos;
157
158         return do_insert
159                 ? set_insert(call->params, &arg, sizeof(arg), hash)
160                 : set_find(call->params, &arg, sizeof(arg), hash);
161 }
162
163 /**
164  * Retrieve an ABI call object argument.
165  *
166  * @param call      the ABI call object
167  * @param is_res    true for call results, false for call arguments
168  * @param pos       position of the argument
169  */
170 static INLINE be_abi_call_arg_t *get_call_arg(be_abi_call_t *call, int is_res, int pos)
171 {
172         return get_or_set_call_arg(call, is_res, pos, 0);
173 }
174
175 /* Set the flags for a call. */
176 void be_abi_call_set_flags(be_abi_call_t *call, be_abi_call_flags_t flags, const be_abi_callbacks_t *cb)
177 {
178         call->flags = flags;
179         call->cb    = cb;
180 }
181
182
183 /* Set register class for call address */
184 void be_abi_call_set_call_address_reg_class(be_abi_call_t *call, const arch_register_class_t *cls)
185 {
186         call->cls_addr = cls;
187 }
188
189
190 void be_abi_call_param_stack(be_abi_call_t *call, int arg_pos, unsigned alignment, unsigned space_before, unsigned space_after)
191 {
192         be_abi_call_arg_t *arg = get_or_set_call_arg(call, 0, arg_pos, 1);
193         arg->on_stack     = 1;
194         arg->alignment    = alignment;
195         arg->space_before = space_before;
196         arg->space_after  = space_after;
197         assert(alignment > 0 && "Alignment must be greater than 0");
198 }
199
200 void be_abi_call_param_reg(be_abi_call_t *call, int arg_pos, const arch_register_t *reg)
201 {
202         be_abi_call_arg_t *arg = get_or_set_call_arg(call, 0, arg_pos, 1);
203         arg->in_reg = 1;
204         arg->reg = reg;
205 }
206
207 void be_abi_call_res_reg(be_abi_call_t *call, int arg_pos, const arch_register_t *reg)
208 {
209         be_abi_call_arg_t *arg = get_or_set_call_arg(call, 1, arg_pos, 1);
210         arg->in_reg = 1;
211         arg->reg = reg;
212 }
213
214 /* Get the flags of a ABI call object. */
215 be_abi_call_flags_t be_abi_call_get_flags(const be_abi_call_t *call)
216 {
217         return call->flags;
218 }
219
220 /**
221  * Constructor for a new ABI call object.
222  *
223  * @return the new ABI call object
224  */
225 static be_abi_call_t *be_abi_call_new(const arch_register_class_t *cls_addr)
226 {
227         be_abi_call_t *call = xmalloc(sizeof(call[0]));
228
229         call->flags.val  = 0;
230         call->params     = new_set(cmp_call_arg, 16);
231         call->cb         = NULL;
232         call->cls_addr   = cls_addr;
233
234         call->flags.bits.try_omit_fp = be_omit_fp;
235
236         return call;
237 }
238
239 /**
240  * Destructor for an ABI call object.
241  */
242 static void be_abi_call_free(be_abi_call_t *call)
243 {
244         del_set(call->params);
245         free(call);
246 }
247
248 /*
249   _____                           _   _                 _ _ _
250  |  ___| __ __ _ _ __ ___   ___  | | | | __ _ _ __   __| | (_)_ __   __ _
251  | |_ | '__/ _` | '_ ` _ \ / _ \ | |_| |/ _` | '_ \ / _` | | | '_ \ / _` |
252  |  _|| | | (_| | | | | | |  __/ |  _  | (_| | | | | (_| | | | | | | (_| |
253  |_|  |_|  \__,_|_| |_| |_|\___| |_| |_|\__,_|_| |_|\__,_|_|_|_| |_|\__, |
254                                                                     |___/
255
256   Handling of the stack frame. It is composed of three types:
257   1) The type of the arguments which are pushed on the stack.
258   2) The "between type" which consists of stuff the call of the
259      function pushes on the stack (like the return address and
260          the old base pointer for ia32).
261   3) The Firm frame type which consists of all local variables
262      and the spills.
263 */
264
265 static int get_stack_entity_offset(be_stack_layout_t *frame, ir_entity *ent, int bias)
266 {
267         ir_type *t = get_entity_owner(ent);
268         int ofs    = get_entity_offset(ent);
269
270         int i, index;
271
272         /* Find the type the entity is contained in. */
273         for(index = 0; index < N_FRAME_TYPES; ++index) {
274                 if(frame->order[index] == t)
275                         break;
276         }
277
278         /* Add the size of all the types below the one of the entity to the entity's offset */
279         for(i = 0; i < index; ++i)
280                 ofs += get_type_size_bytes(frame->order[i]);
281
282         /* correct the offset by the initial position of the frame pointer */
283         ofs -= frame->initial_offset;
284
285         /* correct the offset with the current bias. */
286         ofs += bias;
287
288         return ofs;
289 }
290
291 /**
292  * Retrieve the entity with given offset from a frame type.
293  */
294 static ir_entity *search_ent_with_offset(ir_type *t, int offset)
295 {
296         int i, n;
297
298         for(i = 0, n = get_compound_n_members(t); i < n; ++i) {
299                 ir_entity *ent = get_compound_member(t, i);
300                 if(get_entity_offset(ent) == offset)
301                         return ent;
302         }
303
304         return NULL;
305 }
306
307 static int stack_frame_compute_initial_offset(be_stack_layout_t *frame)
308 {
309         ir_type  *base = frame->stack_dir < 0 ? frame->between_type : frame->frame_type;
310         ir_entity *ent = search_ent_with_offset(base, 0);
311
312         frame->initial_offset = ent ? get_stack_entity_offset(frame, ent, 0) : 0;
313
314         return frame->initial_offset;
315 }
316
317 /**
318  * Initializes the frame layout from parts
319  *
320  * @param frame     the stack layout that will be initialized
321  * @param args      the stack argument layout type
322  * @param between   the between layout type
323  * @param locals    the method frame type
324  * @param stack_dir the stack direction
325  * @param param_map an array mapping method argument positions to the stack argument type
326  *
327  * @return the initialized stack layout
328  */
329 static be_stack_layout_t *stack_frame_init(be_stack_layout_t *frame, ir_type *args,
330                                            ir_type *between, ir_type *locals, int stack_dir,
331                                            ir_entity *param_map[])
332 {
333         frame->arg_type       = args;
334         frame->between_type   = between;
335         frame->frame_type     = locals;
336         frame->initial_offset = 0;
337         frame->stack_dir      = stack_dir;
338         frame->order[1]       = between;
339         frame->param_map      = param_map;
340
341         if(stack_dir > 0) {
342                 frame->order[0] = args;
343                 frame->order[2] = locals;
344         }
345         else {
346                 frame->order[0] = locals;
347                 frame->order[2] = args;
348         }
349         return frame;
350 }
351
352 #if 0
353 /** Dumps the stack layout to file. */
354 static void stack_layout_dump(FILE *file, be_stack_layout_t *frame)
355 {
356         int i, j, n;
357
358         ir_fprintf(file, "initial offset: %d\n", frame->initial_offset);
359         for (j = 0; j < N_FRAME_TYPES; ++j) {
360                 ir_type *t = frame->order[j];
361
362                 ir_fprintf(file, "type %d: %F size: %d\n", j, t, get_type_size_bytes(t));
363                 for (i = 0, n = get_compound_n_members(t); i < n; ++i) {
364                         ir_entity *ent = get_compound_member(t, i);
365                         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));
366                 }
367         }
368 }
369 #endif
370
371 /**
372  * Returns non-zero if the call argument at given position
373  * is transfered on the stack.
374  */
375 static INLINE int is_on_stack(be_abi_call_t *call, int pos)
376 {
377         be_abi_call_arg_t *arg = get_call_arg(call, 0, pos);
378         return arg && !arg->in_reg;
379 }
380
381 /*
382    ____      _ _
383   / ___|__ _| | |___
384  | |   / _` | | / __|
385  | |__| (_| | | \__ \
386   \____\__,_|_|_|___/
387
388   Adjustment of the calls inside a graph.
389
390 */
391
392 /**
393  * Transform a call node.
394  * @param env The ABI environment for the current irg.
395  * @param irn The call node.
396  * @param curr_sp The stack pointer node to use.
397  * @return The stack pointer after the call.
398  */
399 static ir_node *adjust_call(be_abi_irg_t *env, ir_node *irn, ir_node *curr_sp, ir_node *alloca_copy)
400 {
401         ir_graph *irg             = env->birg->irg;
402         const arch_env_t *arch_env = env->birg->main_env->arch_env;
403         const arch_isa_t *isa     = arch_env->isa;
404         ir_type *mt               = get_Call_type(irn);
405         ir_node *call_ptr         = get_Call_ptr(irn);
406         int n_params              = get_method_n_params(mt);
407         ir_node *curr_mem         = get_Call_mem(irn);
408         ir_node *bl               = get_nodes_block(irn);
409         pset *results             = pset_new_ptr(8);
410         pset *caller_save         = pset_new_ptr(8);
411         pset *states              = pset_new_ptr(2);
412         int stack_size            = 0;
413         int stack_dir             = arch_isa_stack_dir(isa);
414         const arch_register_t *sp = arch_isa_sp(isa);
415         be_abi_call_t *call       = be_abi_call_new(sp->reg_class);
416         ir_mode *mach_mode        = sp->reg_class->mode;
417         struct obstack *obst      = &env->obst;
418         int no_alloc              = call->flags.bits.frame_is_setup_on_call;
419
420         ir_node *res_proj = NULL;
421         int curr_res_proj = pn_Call_max;
422         int n_low_args    = 0;
423         int n_pos         = 0;
424         int count;
425
426         ir_node *low_call;
427         ir_node **in;
428         ir_node **res_projs;
429         const arch_register_t *reg;
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                         int arg_size = get_type_size_bytes(get_method_param_type(mt, i));
445
446                         stack_size += round_up2(arg->space_before, arg->alignment);
447                         stack_size += round_up2(arg_size, arg->alignment);
448                         stack_size += round_up2(arg->space_after, arg->alignment);
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 if 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, stack_size);
492                         if(alloca_copy) {
493                                 add_irn_dep(curr_sp, alloca_copy);
494                                 alloca_copy = NULL;
495                         }
496                 }
497
498                 if(!do_seq) {
499                         obstack_ptr_grow(obst, get_Call_mem(irn));
500                         curr_mem = new_NoMem();
501                 } else {
502                         curr_mem = get_Call_mem(irn);
503                 }
504
505                 for(i = 0; i < n_pos; ++i) {
506                         int p                  = pos[i];
507                         be_abi_call_arg_t *arg = get_call_arg(call, 0, p);
508                         ir_node *param         = get_Call_param(irn, p);
509                         ir_node *addr          = curr_sp;
510                         ir_node *mem           = NULL;
511                         ir_type *param_type    = get_method_param_type(mt, p);
512                         int param_size         = get_type_size_bytes(param_type) + arg->space_after;
513
514                         /*
515                          * If we wanted to build the arguments sequentially,
516                          * the stack pointer for the next must be incremented,
517                          * and the memory value propagated.
518                          */
519                         if (do_seq) {
520                                 curr_ofs = 0;
521                                 addr = curr_sp = be_new_IncSP(sp, irg, bl, curr_sp, param_size + arg->space_before);
522                                 if(alloca_copy) {
523                                         add_irn_dep(curr_sp, alloca_copy);
524                                         alloca_copy = NULL;
525                                 }
526                                 add_irn_dep(curr_sp, curr_mem);
527                         }
528                         else {
529                                 curr_ofs += arg->space_before;
530                                 curr_ofs =  round_up2(curr_ofs, arg->alignment);
531
532                                 /* Make the expression to compute the argument's offset. */
533                                 if(curr_ofs > 0) {
534                                         ir_mode *constmode = mach_mode;
535                                         if(mode_is_reference(mach_mode)) {
536                                                 constmode = mode_Is;
537                                         }
538                                         addr = new_r_Const_long(irg, bl, constmode, curr_ofs);
539                                         addr = new_r_Add(irg, bl, curr_sp, addr, mach_mode);
540                                 }
541                         }
542
543                         /* Insert a store for primitive arguments. */
544                         if (is_atomic_type(param_type)) {
545                                 ir_node *store;
546                                 store = new_r_Store(irg, bl, curr_mem, addr, param);
547                                 mem = new_r_Proj(irg, bl, store, mode_M, pn_Store_M);
548                         }
549
550                         /* Make a mem copy for compound arguments. */
551                         else {
552                                 ir_node *copy;
553
554                                 assert(mode_is_reference(get_irn_mode(param)));
555                                 copy = new_r_CopyB(irg, bl, curr_mem, addr, param, param_type);
556                                 mem = new_r_Proj(irg, bl, copy, mode_M, pn_CopyB_M_regular);
557                         }
558
559                         curr_ofs += param_size;
560
561                         if (do_seq)
562                                 curr_mem = mem;
563                         else
564                                 obstack_ptr_grow(obst, mem);
565                 }
566
567                 in = (ir_node **) obstack_finish(obst);
568
569                 /* We need the sync only, if we didn't build the stores sequentially. */
570                 if(!do_seq) {
571                         if(n_pos >= 1) {
572                                 curr_mem = new_r_Sync(irg, bl, n_pos + 1, in);
573                         } else {
574                                 curr_mem = get_Call_mem(irn);
575                         }
576                 }
577                 obstack_free(obst, in);
578         }
579
580         /* Collect caller save registers */
581         for(i = 0, n = arch_isa_get_n_reg_class(isa); i < n; ++i) {
582                 int j;
583                 const arch_register_class_t *cls = arch_isa_get_reg_class(isa, i);
584                 for(j = 0; j < cls->n_regs; ++j) {
585                         const arch_register_t *reg = arch_register_for_index(cls, j);
586                         if(arch_register_type_is(reg, caller_save)) {
587                                 pset_insert_ptr(caller_save, (void *) reg);
588                         }
589                         if(arch_register_type_is(reg, state)) {
590                                 pset_insert_ptr(caller_save, (void*) reg);
591                                 pset_insert_ptr(states, (void*) reg);
592                         }
593                 }
594         }
595
596         /* search the greatest result proj number */
597
598         /* TODO: what if the result is NOT used? Currently there is
599          * no way to detect this later, especially there is no way to
600          * see this in the proj numbers.
601          * While this is ok for the register allocator, it is bad for
602          * backends which need to change the be_Call further (x87 simulator
603          * for instance. However for this particular case the call_type is
604          * sufficient.).
605          */
606         foreach_out_edge(irn, edge) {
607                 const ir_edge_t *res_edge;
608                 ir_node *irn = get_edge_src_irn(edge);
609
610                 if(is_Proj(irn) && get_Proj_proj(irn) == pn_Call_T_result) {
611                         res_proj = irn;
612                         foreach_out_edge(irn, res_edge) {
613                                 int proj;
614                                 be_abi_call_arg_t *arg;
615                                 ir_node *res = get_edge_src_irn(res_edge);
616
617                                 assert(is_Proj(res));
618
619                                 proj = get_Proj_proj(res);
620                                 arg = get_call_arg(call, 1, proj);
621
622                                 /*
623                                         shift the proj number to the right, since we will drop the
624                                         unspeakable Proj_T from the Call. Therefore, all real argument
625                                         Proj numbers must be increased by pn_be_Call_first_res
626                                 */
627                                 proj += pn_be_Call_first_res;
628                                 set_Proj_proj(res, proj);
629                                 obstack_ptr_grow(obst, res);
630
631                                 if(proj > curr_res_proj)
632                                         curr_res_proj = proj;
633                                 if(arg->in_reg) {
634                                         pset_remove_ptr(caller_save, arg->reg);
635                                         //pmap_insert(arg_regs, arg->reg, INT_TO_PTR(proj + 1))
636                                 }
637                         }
638                 }
639         }
640
641         curr_res_proj++;
642         obstack_ptr_grow(obst, NULL);
643         res_projs = obstack_finish(obst);
644
645         /* make the back end call node and set its register requirements. */
646         for(i = 0; i < n_low_args; ++i) {
647                 obstack_ptr_grow(obst, get_Call_param(irn, low_args[i]));
648         }
649         foreach_pset(states, reg) {
650                 const arch_register_class_t *cls = arch_register_get_class(reg);
651 #if 0
652                 ir_node *regnode = be_abi_reg_map_get(env->regs, reg);
653                 ir_fprintf(stderr, "Adding %+F\n", regnode);
654 #endif
655                 ir_node *regnode = new_rd_Unknown(irg, arch_register_class_mode(cls));
656                 obstack_ptr_grow(obst, regnode);
657         }
658         count = n_low_args + pset_count(states);
659
660         in = obstack_finish(obst);
661
662         if(env->call->flags.bits.call_has_imm && get_irn_opcode(call_ptr) == iro_SymConst) {
663                 low_call = be_new_Call(get_irn_dbg_info(irn), irg, bl, curr_mem,
664                                        curr_sp, curr_sp,
665                                        curr_res_proj + pset_count(caller_save), count,
666                                        in, get_Call_type(irn));
667                 be_Call_set_entity(low_call, get_SymConst_entity(call_ptr));
668         } else {
669                 low_call = be_new_Call(get_irn_dbg_info(irn), irg, bl, curr_mem,
670                                        curr_sp, call_ptr,
671                                        curr_res_proj + pset_count(caller_save),
672                                        count, in, get_Call_type(irn));
673         }
674         ARR_APP1(ir_node*, env->calls, low_call);
675
676         /*
677                 Set the register class of the call address to
678                 the backend provided class (default: stack pointer class)
679         */
680         be_node_set_reg_class(low_call, be_pos_Call_ptr, call->cls_addr);
681
682         DBG((env->dbg, LEVEL_3, "\tcreated backend call %+F\n", low_call));
683
684         /* Set the register classes and constraints of the Call parameters. */
685         for(i = 0; i < n_low_args; ++i) {
686                 int index = low_args[i];
687                 be_abi_call_arg_t *arg = get_call_arg(call, 0, index);
688                 assert(arg->reg != NULL);
689
690                 be_set_constr_single_reg(low_call, be_pos_Call_first_arg + index, arg->reg);
691         }
692
693         /* Set the register constraints of the results. */
694         for (i = 0; res_projs[i]; ++i) {
695                 int pn = get_Proj_proj(res_projs[i]);
696
697                 /* Correct Proj number since it has been adjusted! (see above) */
698                 const be_abi_call_arg_t *arg = get_call_arg(call, 1, pn - pn_Call_max);
699
700                 /* Matze: we need the information about the real mode for later
701                  * transforms (signed/unsigend compares, stores...), so leave the fixup
702                  * for the backend transform phase... */
703 #if 0
704                 /* correct mode */
705                 const arch_register_class_t *cls = arch_register_get_class(arg->reg);
706                 ir_mode *mode = arch_register_class_mode(cls);
707                 set_irn_mode(irn, mode);
708 #endif
709
710                 assert(arg->in_reg);
711                 be_set_constr_single_reg(low_call, BE_OUT_POS(pn), arg->reg);
712                 arch_set_irn_register(arch_env, res_projs[i], arg->reg);
713         }
714         obstack_free(obst, in);
715         exchange(irn, low_call);
716
717         /* redirect the result projs to the lowered call instead of the Proj_T */
718         for (i = 0; res_projs[i]; ++i)
719                 set_Proj_pred(res_projs[i], low_call);
720
721         /* set the now unnecessary projT to bad */
722         if(res_proj != NULL) {
723                 be_kill_node(res_proj);
724         }
725
726         /* Make additional projs for the caller save registers
727            and the Keep node which keeps them alive. */
728         if (pset_count(caller_save) > 0) {
729                 const arch_register_t *reg;
730                 ir_node               **in, *keep;
731                 int                   i, n;
732
733                 for (reg = pset_first(caller_save), n = 0; reg; reg = pset_next(caller_save), ++n) {
734                         ir_node *proj = new_r_Proj(irg, bl, low_call, reg->reg_class->mode, curr_res_proj);
735
736                         /* memorize the register in the link field. we need afterwards to set the register class of the keep correctly. */
737                         be_set_constr_single_reg(low_call, BE_OUT_POS(curr_res_proj), reg);
738
739                         /* a call can produce ignore registers, in this case set the flag and register for the Proj */
740                         if (arch_register_type_is(reg, ignore)) {
741                                 arch_set_irn_register(env->birg->main_env->arch_env, proj, reg);
742                                 be_node_set_flags(low_call, BE_OUT_POS(curr_res_proj), arch_irn_flags_ignore);
743                         }
744
745                         set_irn_link(proj, (void *) reg);
746                         obstack_ptr_grow(obst, proj);
747                         curr_res_proj++;
748                 }
749
750                 /* create the Keep for the caller save registers */
751                 in   = (ir_node **) obstack_finish(obst);
752                 keep = be_new_Keep(NULL, irg, bl, n, in);
753                 for (i = 0; i < n; ++i) {
754                         const arch_register_t *reg = get_irn_link(in[i]);
755                         be_node_set_reg_class(keep, i, reg->reg_class);
756                 }
757                 obstack_free(obst, in);
758         }
759
760         /* Clean up the stack. */
761         if(stack_size > 0) {
762                 ir_node *mem_proj = NULL;
763
764                 foreach_out_edge(low_call, edge) {
765                         ir_node *irn = get_edge_src_irn(edge);
766                         if(is_Proj(irn) && get_Proj_proj(irn) == pn_Call_M) {
767                                 mem_proj = irn;
768                                 break;
769                         }
770                 }
771
772                 if(!mem_proj) {
773                         mem_proj = new_r_Proj(irg, bl, low_call, mode_M, pn_Call_M);
774                         keep_alive(mem_proj);
775                 }
776
777                  /* Clean up the stack frame if we allocated it */
778                 if(!no_alloc) {
779                         curr_sp = be_new_IncSP(sp, irg, bl, curr_sp, -stack_size);
780                         add_irn_dep(curr_sp, mem_proj);
781                         if(alloca_copy) {
782                                 add_irn_dep(curr_sp, alloca_copy);
783                                 alloca_copy = NULL;
784                         }
785                 }
786         }
787
788         be_abi_call_free(call);
789         obstack_free(obst, pos);
790         del_pset(results);
791         del_pset(states);
792         del_pset(caller_save);
793
794         return curr_sp;
795 }
796
797 /**
798  * Adjust an alloca.
799  * The alloca is transformed into a back end alloca node and connected to the stack nodes.
800  */
801 static ir_node *adjust_alloc(be_abi_irg_t *env, ir_node *alloc, ir_node *curr_sp, ir_node **result_copy)
802 {
803         ir_node *block;
804         ir_graph *irg;
805         ir_node *alloc_mem;
806         ir_node *alloc_res;
807         ir_type *type;
808
809         const ir_edge_t *edge;
810         ir_node *new_alloc;
811         ir_node *size;
812         ir_node *addr;
813         ir_node *copy;
814         ir_node *ins[2];
815
816         if (get_Alloc_where(alloc) != stack_alloc) {
817                 assert(0);
818                 return alloc;
819         }
820
821         block = get_nodes_block(alloc);
822         irg = get_irn_irg(block);
823         alloc_mem = NULL;
824         alloc_res = NULL;
825         type = get_Alloc_type(alloc);
826
827         foreach_out_edge(alloc, edge) {
828                 ir_node *irn = get_edge_src_irn(edge);
829
830                 assert(is_Proj(irn));
831                 switch(get_Proj_proj(irn)) {
832                 case pn_Alloc_M:
833                         alloc_mem = irn;
834                         break;
835                 case pn_Alloc_res:
836                         alloc_res = irn;
837                         break;
838                 default:
839                         break;
840                 }
841         }
842
843         /* Beware: currently Alloc nodes without a result might happen,
844            only escape analysis kills them and this phase runs only for object
845            oriented source. We kill the Alloc here. */
846         if (alloc_res == NULL && alloc_mem) {
847                 exchange(alloc_mem, get_Alloc_mem(alloc));
848                 return curr_sp;
849         }
850
851         /* we might need to multiply the size with the element size */
852         if(type != get_unknown_type() && get_type_size_bytes(type) != 1) {
853                 tarval *tv = new_tarval_from_long(get_type_size_bytes(type), mode_Iu);
854                 ir_node *cnst = new_rd_Const(NULL, irg, block, mode_Iu, tv);
855                 ir_node *mul = new_rd_Mul(NULL, irg, block, get_Alloc_size(alloc),
856                                           cnst, mode_Iu);
857                 size = mul;
858         } else {
859                 size = get_Alloc_size(alloc);
860         }
861
862         /* The stack pointer will be modified in an unknown manner.
863            We cannot omit it. */
864         env->call->flags.bits.try_omit_fp = 0;
865         new_alloc = be_new_AddSP(env->isa->sp, irg, block, curr_sp, size);
866
867         if(alloc_mem != NULL) {
868                 ir_node *addsp_mem;
869                 ir_node *sync;
870
871                 addsp_mem = new_r_Proj(irg, block, new_alloc, mode_M, pn_be_AddSP_M);
872
873                 // We need to sync the output mem of the AddSP with the input mem
874                 // edge into the alloc node
875                 ins[0] = get_Alloc_mem(alloc);
876                 ins[1] = addsp_mem;
877                 sync = new_r_Sync(irg, block, 2, ins);
878
879                 exchange(alloc_mem, sync);
880         }
881
882         exchange(alloc, new_alloc);
883
884         /* fix projnum of alloca res */
885         set_Proj_proj(alloc_res, pn_be_AddSP_res);
886
887         addr = env->isa->stack_dir < 0 ? alloc_res : curr_sp;
888
889         /* copy the address away, since it could be used after further stack pointer modifications. */
890         /* Let it point curr_sp just for the moment, I'll reroute it in a second. */
891         *result_copy = copy = be_new_Copy(env->isa->sp->reg_class, irg, block, curr_sp);
892
893         /* Let all users of the Alloc() result now point to the copy. */
894         edges_reroute(alloc_res, copy, irg);
895
896         /* Rewire the copy appropriately. */
897         set_irn_n(copy, be_pos_Copy_op, addr);
898
899         curr_sp = alloc_res;
900
901         return curr_sp;
902 }  /* adjust_alloc */
903
904 /**
905  * Adjust a Free.
906  * The Free is transformed into a back end free node and connected to the stack nodes.
907  */
908 static ir_node *adjust_free(be_abi_irg_t *env, ir_node *free, ir_node *curr_sp)
909 {
910         ir_node *block;
911         ir_graph *irg;
912         ir_node *subsp, *mem, *res, *size, *sync;
913         ir_type *type;
914         ir_node *in[2];
915         ir_mode *sp_mode;
916
917         if (get_Free_where(free) != stack_alloc) {
918                 assert(0);
919                 return free;
920         }
921
922         block = get_nodes_block(free);
923         irg = get_irn_irg(block);
924         type = get_Free_type(free);
925         sp_mode = env->isa->sp->reg_class->mode;
926
927         /* we might need to multiply the size with the element size */
928         if(type != get_unknown_type() && get_type_size_bytes(type) != 1) {
929                 tarval *tv = new_tarval_from_long(get_type_size_bytes(type), mode_Iu);
930                 ir_node *cnst = new_rd_Const(NULL, irg, block, mode_Iu, tv);
931                 ir_node *mul = new_rd_Mul(NULL, irg, block, get_Free_size(free),
932                                           cnst, mode_Iu);
933                 size = mul;
934         } else {
935                 size = get_Free_size(free);
936         }
937
938         /* The stack pointer will be modified in an unknown manner.
939            We cannot omit it. */
940         env->call->flags.bits.try_omit_fp = 0;
941         subsp = be_new_SubSP(env->isa->sp, irg, block, curr_sp, size);
942
943         mem = new_r_Proj(irg, block, subsp, mode_M, pn_be_SubSP_M);
944         res = new_r_Proj(irg, block, subsp, sp_mode, pn_be_SubSP_res);
945
946         /* we need to sync the memory */
947         in[0] = get_Free_mem(free);
948         in[1] = mem;
949         sync = new_r_Sync(irg, block, 2, in);
950
951         /* and make the AddSP dependent on the former memory */
952         add_irn_dep(subsp, get_Free_mem(free));
953
954         /* kill the free */
955         exchange(free, sync);
956         curr_sp = res;
957
958         return curr_sp;
959 }  /* adjust_free */
960
961 /* the following function is replaced by the usage of the heights module */
962 #if 0
963 /**
964  * Walker for dependent_on().
965  * This function searches a node tgt recursively from a given node
966  * but is restricted to the given block.
967  * @return 1 if tgt was reachable from curr, 0 if not.
968  */
969 static int check_dependence(ir_node *curr, ir_node *tgt, ir_node *bl)
970 {
971         int n, i;
972
973         if (get_nodes_block(curr) != bl)
974                 return 0;
975
976         if (curr == tgt)
977                 return 1;
978
979         /* Phi functions stop the recursion inside a basic block */
980         if (! is_Phi(curr)) {
981                 for(i = 0, n = get_irn_arity(curr); i < n; ++i) {
982                         if (check_dependence(get_irn_n(curr, i), tgt, bl))
983                                 return 1;
984                 }
985         }
986
987         return 0;
988 }
989 #endif /* if 0 */
990
991 /**
992  * Check if a node is somehow data dependent on another one.
993  * both nodes must be in the same basic block.
994  * @param n1 The first node.
995  * @param n2 The second node.
996  * @return 1, if n1 is data dependent (transitively) on n2, 0 if not.
997  */
998 static int dependent_on(ir_node *n1, ir_node *n2)
999 {
1000         assert(get_nodes_block(n1) == get_nodes_block(n2));
1001
1002         return heights_reachable_in_block(ir_heights, n1, n2);
1003 }
1004
1005 static int cmp_call_dependecy(const void *c1, const void *c2)
1006 {
1007         ir_node *n1 = *(ir_node **) c1;
1008         ir_node *n2 = *(ir_node **) c2;
1009
1010         /*
1011                 Classical qsort() comparison function behavior:
1012                 0  if both elements are equal
1013                 1  if second is "smaller" that first
1014                 -1 if first is "smaller" that second
1015         */
1016         if (dependent_on(n1, n2))
1017                 return -1;
1018
1019         if (dependent_on(n2, n1))
1020                 return 1;
1021
1022         return 0;
1023 }
1024
1025 /**
1026  * Walker: links all Call/alloc/Free nodes to the Block they are contained.
1027  */
1028 static void link_calls_in_block_walker(ir_node *irn, void *data)
1029 {
1030         ir_opcode code = get_irn_opcode(irn);
1031
1032         if (code == iro_Call ||
1033                 (code == iro_Alloc && get_Alloc_where(irn) == stack_alloc) ||
1034                 (code == iro_Free && get_Free_where(irn) == stack_alloc)) {
1035                 be_abi_irg_t *env = data;
1036                 ir_node *bl       = get_nodes_block(irn);
1037                 void *save        = get_irn_link(bl);
1038
1039                 if (code == iro_Call)
1040                         env->call->flags.bits.irg_is_leaf = 0;
1041
1042                 set_irn_link(irn, save);
1043                 set_irn_link(bl, irn);
1044         }
1045 }
1046
1047 /**
1048  * Block-walker:
1049  * Process all Call nodes inside a basic block.
1050  * Note that the link field of the block must contain a linked list of all
1051  * Call nodes inside the Block. We first order this list according to data dependency
1052  * and that connect the calls together.
1053  */
1054 static void process_calls_in_block(ir_node *bl, void *data)
1055 {
1056         be_abi_irg_t *env = data;
1057         ir_node *curr_sp  = env->init_sp;
1058         ir_node *irn;
1059         int n;
1060
1061         for(irn = get_irn_link(bl), n = 0; irn; irn = get_irn_link(irn), ++n)
1062                 obstack_ptr_grow(&env->obst, irn);
1063
1064         /* If there were call nodes in the block. */
1065         if(n > 0) {
1066                 ir_node *keep;
1067                 ir_node **nodes;
1068                 ir_node *copy = NULL;
1069                 int i;
1070
1071                 nodes = obstack_finish(&env->obst);
1072
1073                 /* order the call nodes according to data dependency */
1074                 qsort(nodes, n, sizeof(nodes[0]), cmp_call_dependecy);
1075
1076                 for(i = n - 1; i >= 0; --i) {
1077                         ir_node *irn = nodes[i];
1078
1079                         DBG((env->dbg, LEVEL_3, "\tprocessing call %+F\n", irn));
1080                         switch(get_irn_opcode(irn)) {
1081                         case iro_Call:
1082                                 curr_sp = adjust_call(env, irn, curr_sp, copy);
1083                                 break;
1084                         case iro_Alloc:
1085                                 curr_sp = adjust_alloc(env, irn, curr_sp, &copy);
1086                                 break;
1087                         case iro_Free:
1088                                 curr_sp = adjust_free(env, irn, curr_sp);
1089                                 break;
1090                         default:
1091                                 break;
1092                         }
1093                 }
1094
1095                 obstack_free(&env->obst, nodes);
1096
1097                 /* Keep the last stack state in the block by tying it to Keep node */
1098                 nodes[0] = curr_sp;
1099                 keep     = be_new_Keep(env->isa->sp->reg_class, get_irn_irg(bl), bl, 1, nodes);
1100                 pmap_insert(env->keep_map, bl, keep);
1101         }
1102
1103         set_irn_link(bl, curr_sp);
1104 }  /* process_calls_in_block */
1105
1106 /**
1107  * Adjust all call nodes in the graph to the ABI conventions.
1108  */
1109 static void process_calls(be_abi_irg_t *env)
1110 {
1111         ir_graph *irg = env->birg->irg;
1112
1113         env->call->flags.bits.irg_is_leaf = 1;
1114         irg_walk_graph(irg, firm_clear_link, link_calls_in_block_walker, env);
1115
1116         ir_heights = heights_new(env->birg->irg);
1117         irg_block_walk_graph(irg, NULL, process_calls_in_block, env);
1118         heights_free(ir_heights);
1119 }
1120
1121 #if 0 /*
1122 static ir_node *setup_frame(be_abi_irg_t *env)
1123 {
1124         const arch_isa_t *isa = env->birg->main_env->arch_env->isa;
1125         const arch_register_t *sp = isa->sp;
1126         const arch_register_t *bp = isa->bp;
1127         be_abi_call_flags_bits_t flags = env->call->flags.bits;
1128         ir_graph *irg      = env->birg->irg;
1129         ir_node *bl        = get_irg_start_block(irg);
1130         ir_node *no_mem    = get_irg_no_mem(irg);
1131         ir_node *old_frame = get_irg_frame(irg);
1132         ir_node *stack     = pmap_get(env->regs, (void *) sp);
1133         ir_node *frame     = pmap_get(env->regs, (void *) bp);
1134
1135         int stack_nr       = get_Proj_proj(stack);
1136
1137         if(flags.try_omit_fp) {
1138                 stack = be_new_IncSP(sp, irg, bl, stack, no_mem, BE_STACK_FRAME_SIZE_EXPAND);
1139                 frame = stack;
1140         }
1141
1142         else {
1143                 frame = be_new_Copy(bp->reg_class, irg, bl, stack);
1144
1145                 be_node_set_flags(frame, -1, arch_irn_flags_dont_spill);
1146                 if(!flags.fp_free) {
1147                         be_set_constr_single_reg(frame, -1, bp);
1148                         be_node_set_flags(frame, -1, arch_irn_flags_ignore);
1149                         arch_set_irn_register(env->birg->main_env->arch_env, frame, bp);
1150                 }
1151
1152                 stack = be_new_IncSP(sp, irg, bl, stack, frame, BE_STACK_FRAME_SIZE_EXPAND);
1153         }
1154
1155         be_node_set_flags(env->reg_params, -(stack_nr + 1), arch_irn_flags_ignore);
1156         env->init_sp = stack;
1157         set_irg_frame(irg, frame);
1158         edges_reroute(old_frame, frame, irg);
1159
1160         return frame;
1161 }
1162
1163 static void clearup_frame(be_abi_irg_t *env, ir_node *ret, pmap *reg_map, struct obstack *obst)
1164 {
1165         const arch_isa_t *isa = env->birg->main_env->arch_env->isa;
1166         const arch_register_t *sp = isa->sp;
1167         const arch_register_t *bp = isa->bp;
1168         ir_graph *irg      = env->birg->irg;
1169         ir_node *ret_mem   = get_Return_mem(ret);
1170         ir_node *frame     = get_irg_frame(irg);
1171         ir_node *bl        = get_nodes_block(ret);
1172         ir_node *stack     = get_irn_link(bl);
1173
1174         pmap_entry *ent;
1175
1176         if(env->call->flags.bits.try_omit_fp) {
1177                 stack = be_new_IncSP(sp, irg, bl, stack, ret_mem, -BE_STACK_FRAME_SIZE_SHRINK);
1178         }
1179
1180         else {
1181                 stack = be_new_SetSP(sp, irg, bl, stack, frame, ret_mem);
1182                 be_set_constr_single_reg(stack, -1, sp);
1183                 be_node_set_flags(stack, -1, arch_irn_flags_ignore);
1184         }
1185
1186         pmap_foreach(env->regs, ent) {
1187                 const arch_register_t *reg = ent->key;
1188                 ir_node *irn               = ent->value;
1189
1190                 if(reg == sp)
1191                         obstack_ptr_grow(&env->obst, stack);
1192                 else if(reg == bp)
1193                         obstack_ptr_grow(&env->obst, frame);
1194                 else if(arch_register_type_is(reg, callee_save) || arch_register_type_is(reg, ignore))
1195                         obstack_ptr_grow(obst, irn);
1196         }
1197 }
1198 */
1199 #endif
1200
1201 /**
1202  * Computes the stack argument layout type.
1203  * Changes a possibly allocated value param type by moving
1204  * entities to the stack layout type.
1205  *
1206  * @param env          the ABI environment
1207  * @param call         the current call ABI
1208  * @param method_type  the method type
1209  * @param param_map    an array mapping method arguments to the stack layout type
1210  *
1211  * @return the stack argument layout type
1212  */
1213 static ir_type *compute_arg_type(be_abi_irg_t *env, be_abi_call_t *call, ir_type *method_type, ir_entity ***param_map)
1214 {
1215         int dir  = env->call->flags.bits.left_to_right ? 1 : -1;
1216         int inc  = env->birg->main_env->arch_env->isa->stack_dir * dir;
1217         int n    = get_method_n_params(method_type);
1218         int curr = inc > 0 ? 0 : n - 1;
1219         int ofs  = 0;
1220
1221         char buf[128];
1222         ir_type *res;
1223         int i;
1224         ir_type *val_param_tp = get_method_value_param_type(method_type);
1225         ident *id = get_entity_ident(get_irg_entity(env->birg->irg));
1226         ir_entity **map;
1227
1228         *param_map = map = obstack_alloc(&env->obst, n * sizeof(ir_entity *));
1229         res = new_type_struct(mangle_u(id, new_id_from_chars("arg_type", 8)));
1230         for (i = 0; i < n; ++i, curr += inc) {
1231                 ir_type *param_type    = get_method_param_type(method_type, curr);
1232                 be_abi_call_arg_t *arg = get_call_arg(call, 0, curr);
1233
1234                 map[i] = NULL;
1235                 if (arg->on_stack) {
1236                         if (val_param_tp) {
1237                                 /* the entity was already created, move it to the param type */
1238                                 arg->stack_ent = get_method_value_param_ent(method_type, i);
1239                                 remove_struct_member(val_param_tp, arg->stack_ent);
1240                                 set_entity_owner(arg->stack_ent, res);
1241                                 add_struct_member(res, arg->stack_ent);
1242                                 /* must be automatic to set a fixed layout */
1243                                 set_entity_allocation(arg->stack_ent, allocation_automatic);
1244                         }
1245                         else {
1246                                 snprintf(buf, sizeof(buf), "param_%d", i);
1247                                 arg->stack_ent = new_entity(res, new_id_from_str(buf), param_type);
1248                         }
1249                         ofs += arg->space_before;
1250                         ofs = round_up2(ofs, arg->alignment);
1251                         set_entity_offset(arg->stack_ent, ofs);
1252                         ofs += arg->space_after;
1253                         ofs += get_type_size_bytes(param_type);
1254                         map[i] = arg->stack_ent;
1255                 }
1256         }
1257         set_type_size_bytes(res, ofs);
1258         set_type_state(res, layout_fixed);
1259         return res;
1260 }
1261
1262 #if 0
1263 static void create_register_perms(const arch_isa_t *isa, ir_graph *irg, ir_node *bl, pmap *regs)
1264 {
1265         int i, j, n;
1266         struct obstack obst;
1267
1268         obstack_init(&obst);
1269
1270         /* Create a Perm after the RegParams node to delimit it. */
1271         for(i = 0, n = arch_isa_get_n_reg_class(isa); i < n; ++i) {
1272                 const arch_register_class_t *cls = arch_isa_get_reg_class(isa, i);
1273                 ir_node *perm;
1274                 ir_node **in;
1275                 int n_regs;
1276
1277                 for(n_regs = 0, j = 0; j < cls->n_regs; ++j) {
1278                         const arch_register_t *reg = &cls->regs[j];
1279                         ir_node *irn = pmap_get(regs, (void *) reg);
1280
1281                         if(irn && !arch_register_type_is(reg, ignore)) {
1282                                 n_regs++;
1283                                 obstack_ptr_grow(&obst, irn);
1284                                 set_irn_link(irn, (void *) reg);
1285                         }
1286                 }
1287
1288                 obstack_ptr_grow(&obst, NULL);
1289                 in = obstack_finish(&obst);
1290                 if(n_regs > 0) {
1291                         perm = be_new_Perm(cls, irg, bl, n_regs, in);
1292                         for(j = 0; j < n_regs; ++j) {
1293                                 ir_node *arg = in[j];
1294                                 arch_register_t *reg = get_irn_link(arg);
1295                                 pmap_insert(regs, reg, arg);
1296                                 be_set_constr_single_reg(perm, BE_OUT_POS(j), reg);
1297                         }
1298                 }
1299                 obstack_free(&obst, in);
1300         }
1301
1302         obstack_free(&obst, NULL);
1303 }
1304 #endif
1305
1306 typedef struct {
1307         const arch_register_t *reg;
1308         ir_node *irn;
1309 } reg_node_map_t;
1310
1311 static int cmp_regs(const void *a, const void *b)
1312 {
1313         const reg_node_map_t *p = a;
1314         const reg_node_map_t *q = b;
1315
1316         if(p->reg->reg_class == q->reg->reg_class)
1317                 return p->reg->index - q->reg->index;
1318         else
1319                 return p->reg->reg_class - q->reg->reg_class;
1320 }
1321
1322 static reg_node_map_t *reg_map_to_arr(struct obstack *obst, pmap *reg_map)
1323 {
1324         pmap_entry *ent;
1325         int n = pmap_count(reg_map);
1326         int i = 0;
1327         reg_node_map_t *res = obstack_alloc(obst, n * sizeof(res[0]));
1328
1329         pmap_foreach(reg_map, ent) {
1330                 res[i].reg = ent->key;
1331                 res[i].irn = ent->value;
1332                 i++;
1333         }
1334
1335         qsort(res, n, sizeof(res[0]), cmp_regs);
1336         return res;
1337 }
1338
1339 /**
1340  * Creates a barrier.
1341  */
1342 static ir_node *create_barrier(be_abi_irg_t *env, ir_node *bl, ir_node **mem, pmap *regs, int in_req)
1343 {
1344         ir_graph *irg = env->birg->irg;
1345         int n_regs    = pmap_count(regs);
1346         int n;
1347         ir_node *irn;
1348         ir_node **in;
1349         reg_node_map_t *rm;
1350
1351         rm = reg_map_to_arr(&env->obst, regs);
1352
1353         for(n = 0; n < n_regs; ++n)
1354                 obstack_ptr_grow(&env->obst, rm[n].irn);
1355
1356         if(mem) {
1357                 obstack_ptr_grow(&env->obst, *mem);
1358                 n++;
1359         }
1360
1361         in = (ir_node **) obstack_finish(&env->obst);
1362         irn = be_new_Barrier(irg, bl, n, in);
1363         obstack_free(&env->obst, in);
1364
1365         for(n = 0; n < n_regs; ++n) {
1366                 const arch_register_t *reg = rm[n].reg;
1367                 int flags                  = 0;
1368                 int pos                    = BE_OUT_POS(n);
1369                 ir_node *proj;
1370
1371                 proj = new_r_Proj(irg, bl, irn, get_irn_mode(rm[n].irn), n);
1372                 be_node_set_reg_class(irn, n, reg->reg_class);
1373                 if(in_req)
1374                         be_set_constr_single_reg(irn, n, reg);
1375                 be_set_constr_single_reg(irn, pos, reg);
1376                 be_node_set_reg_class(irn, pos, reg->reg_class);
1377                 arch_set_irn_register(env->birg->main_env->arch_env, proj, reg);
1378
1379                 /* if the proj projects a ignore register or a node which is set to ignore, propagate this property. */
1380                 if(arch_register_type_is(reg, ignore) || arch_irn_is(env->birg->main_env->arch_env, in[n], ignore))
1381                         flags |= arch_irn_flags_ignore;
1382
1383                 if(arch_irn_is(env->birg->main_env->arch_env, in[n], modify_sp))
1384                         flags |= arch_irn_flags_modify_sp;
1385
1386                 be_node_set_flags(irn, pos, flags);
1387
1388                 pmap_insert(regs, (void *) reg, proj);
1389         }
1390
1391         if(mem) {
1392                 *mem = new_r_Proj(irg, bl, irn, mode_M, n);
1393         }
1394
1395         obstack_free(&env->obst, rm);
1396         return irn;
1397 }
1398
1399 /**
1400  * Creates a be_Return for a Return node.
1401  *
1402  * @param @env    the abi environment
1403  * @param irn     the Return node or NULL if there was none
1404  * @param bl      the block where the be_Retun should be placed
1405  * @param mem     the current memory
1406  * @param n_res   number of return results
1407  */
1408 static ir_node *create_be_return(be_abi_irg_t *env, ir_node *irn, ir_node *bl, ir_node *mem, int n_res) {
1409         be_abi_call_t *call = env->call;
1410         const arch_isa_t *isa = env->birg->main_env->arch_env->isa;
1411
1412         pmap *reg_map  = pmap_create();
1413         ir_node *keep  = pmap_get(env->keep_map, bl);
1414         int in_max;
1415         ir_node *ret;
1416         int i, n;
1417         ir_node **in;
1418         ir_node *stack;
1419         const arch_register_t **regs;
1420         pmap_entry *ent ;
1421
1422         /*
1423                 get the valid stack node in this block.
1424                 If we had a call in that block there is a Keep constructed by process_calls()
1425                 which points to the last stack modification in that block. we'll use
1426                 it then. Else we use the stack from the start block and let
1427                 the ssa construction fix the usage.
1428         */
1429         stack = be_abi_reg_map_get(env->regs, isa->sp);
1430         if (keep) {
1431                 ir_node *bad = new_r_Bad(env->birg->irg);
1432                 stack = get_irn_n(keep, 0);
1433                 set_nodes_block(keep, bad);
1434                 set_irn_n(keep, 0, bad);
1435                 // exchange(keep, new_r_Bad(env->birg->irg));
1436         }
1437
1438         /* Insert results for Return into the register map. */
1439         for(i = 0; i < n_res; ++i) {
1440                 ir_node *res           = get_Return_res(irn, i);
1441                 be_abi_call_arg_t *arg = get_call_arg(call, 1, i);
1442                 assert(arg->in_reg && "return value must be passed in register");
1443                 pmap_insert(reg_map, (void *) arg->reg, res);
1444         }
1445
1446         /* Add uses of the callee save registers. */
1447         pmap_foreach(env->regs, ent) {
1448                 const arch_register_t *reg = ent->key;
1449                 if(arch_register_type_is(reg, callee_save) || arch_register_type_is(reg, ignore))
1450                         pmap_insert(reg_map, ent->key, ent->value);
1451         }
1452
1453         be_abi_reg_map_set(reg_map, isa->sp, stack);
1454
1455         /* Make the Epilogue node and call the arch's epilogue maker. */
1456         create_barrier(env, bl, &mem, reg_map, 1);
1457         call->cb->epilogue(env->cb, bl, &mem, reg_map);
1458
1459         /*
1460                 Maximum size of the in array for Return nodes is
1461                 return args + callee save/ignore registers + memory + stack pointer
1462         */
1463         in_max = pmap_count(reg_map) + n_res + 2;
1464
1465         in   = obstack_alloc(&env->obst, in_max * sizeof(in[0]));
1466         regs = obstack_alloc(&env->obst, in_max * sizeof(regs[0]));
1467
1468         in[0]   = mem;
1469         in[1]   = be_abi_reg_map_get(reg_map, isa->sp);
1470         regs[0] = NULL;
1471         regs[1] = isa->sp;
1472         n       = 2;
1473
1474         /* clear SP entry, since it has already been grown. */
1475         pmap_insert(reg_map, (void *) isa->sp, NULL);
1476         for(i = 0; i < n_res; ++i) {
1477                 be_abi_call_arg_t *arg = get_call_arg(call, 1, i);
1478
1479                 in[n]     = be_abi_reg_map_get(reg_map, arg->reg);
1480                 regs[n++] = arg->reg;
1481
1482                 /* Clear the map entry to mark the register as processed. */
1483                 be_abi_reg_map_set(reg_map, arg->reg, NULL);
1484         }
1485
1486         /* grow the rest of the stuff. */
1487         pmap_foreach(reg_map, ent) {
1488                 if(ent->value) {
1489                         in[n]     = ent->value;
1490                         regs[n++] = ent->key;
1491                 }
1492         }
1493
1494         /* The in array for the new back end return is now ready. */
1495         ret = be_new_Return(irn ? get_irn_dbg_info(irn) : NULL, env->birg->irg, bl, n_res, n, in);
1496
1497         /* Set the register classes of the return's parameter accordingly. */
1498         for(i = 0; i < n; ++i)
1499                 if(regs[i])
1500                         be_node_set_reg_class(ret, i, regs[i]->reg_class);
1501
1502         /* Free the space of the Epilog's in array and the register <-> proj map. */
1503         obstack_free(&env->obst, in);
1504         pmap_destroy(reg_map);
1505
1506         return ret;
1507 }
1508
1509 typedef struct lower_frame_sels_env_t {
1510         be_abi_irg_t *env;
1511         ir_entity    *value_param_list;  /**< the list of all value param entities */
1512 } lower_frame_sels_env_t;
1513
1514 /**
1515  * Walker: Replaces Sels of frame type and
1516  * value param type entities by FrameAddress.
1517  */
1518 static void lower_frame_sels_walker(ir_node *irn, void *data)
1519 {
1520         lower_frame_sels_env_t *ctx = data;
1521
1522         if (is_Sel(irn)) {
1523                 ir_graph *irg        = current_ir_graph;
1524                 ir_node  *frame      = get_irg_frame(irg);
1525                 ir_node  *param_base = get_irg_value_param_base(irg);
1526                 ir_node  *ptr        = get_Sel_ptr(irn);
1527
1528                 if (ptr == frame || ptr == param_base) {
1529                         be_abi_irg_t *env = ctx->env;
1530                         ir_entity    *ent = get_Sel_entity(irn);
1531                         ir_node      *bl  = get_nodes_block(irn);
1532                         ir_node      *nw;
1533
1534                         nw = be_new_FrameAddr(env->isa->sp->reg_class, irg, bl, frame, ent);
1535                         exchange(irn, nw);
1536
1537                         /* check, if it's a param sel and if have not seen this entity immediatly before */
1538                         if (ptr == param_base && ctx->value_param_list != ent) {
1539                                 set_entity_link(ent, ctx->value_param_list);
1540                                 ctx->value_param_list = ent;
1541                         }
1542                 }
1543         }
1544 }
1545
1546 /**
1547  * Check if a value parameter is transmitted as a register.
1548  * This might happen if the address of an parameter is taken which is
1549  * transmitted in registers.
1550  *
1551  * Note that on some architectures this case must be handled specially
1552  * because the place of the backing store is determined by their ABI.
1553  *
1554  * In the default case we move the entity to the frame type and create
1555  * a backing store into the first block.
1556  */
1557 static void fix_address_of_parameter_access(be_abi_irg_t *env, ir_entity *value_param_list) {
1558         be_abi_call_t *call = env->call;
1559         ir_graph *irg       = env->birg->irg;
1560         ir_entity *ent, *next_ent, *new_list;
1561         ir_type *frame_tp;
1562         DEBUG_ONLY(firm_dbg_module_t *dbg = env->dbg;)
1563
1564         new_list = NULL;
1565         for (ent = value_param_list; ent; ent = next_ent) {
1566                 int i = get_struct_member_index(get_entity_owner(ent), ent);
1567                 be_abi_call_arg_t *arg = get_call_arg(call, 0, i);
1568
1569                 next_ent = get_entity_link(ent);
1570                 if (arg->in_reg) {
1571                         DBG((dbg, LEVEL_2, "\targ #%d need backing store\n", i));
1572                         set_entity_link(ent, new_list);
1573                         new_list = ent;
1574                 }
1575         }
1576         if (new_list) {
1577                 /* ok, change the graph */
1578                 ir_node *start_bl = get_irg_start_block(irg);
1579                 ir_node *first_bl = NULL;
1580                 ir_node *frame, *imem, *nmem, *store, *mem, *args, *args_bl;
1581                 const ir_edge_t *edge;
1582                 optimization_state_t state;
1583                 int offset;
1584
1585                 foreach_block_succ(start_bl, edge) {
1586                         ir_node *succ = get_edge_src_irn(edge);
1587                         if (start_bl != succ) {
1588                                 first_bl = succ;
1589                                 break;
1590                         }
1591                 }
1592                 assert(first_bl);
1593                 /* we had already removed critical edges, so the following
1594                    assertion should be always true. */
1595                 assert(get_Block_n_cfgpreds(first_bl) == 1);
1596
1597                 /* now create backing stores */
1598                 frame = get_irg_frame(irg);
1599                 imem = get_irg_initial_mem(irg);
1600
1601                 save_optimization_state(&state);
1602                 set_optimize(0);
1603                 nmem = new_r_Proj(irg, first_bl, get_irg_start(irg), mode_M, pn_Start_M);
1604                 restore_optimization_state(&state);
1605
1606                 /* reroute all edges to the new memory source */
1607                 edges_reroute(imem, nmem, irg);
1608
1609                 store   = NULL;
1610                 mem     = imem;
1611                 args    = get_irg_args(irg);
1612                 args_bl = get_nodes_block(args);
1613                 for (ent = new_list; ent; ent = get_entity_link(ent)) {
1614                         int     i     = get_struct_member_index(get_entity_owner(ent), ent);
1615                         ir_type *tp   = get_entity_type(ent);
1616                         ir_mode *mode = get_type_mode(tp);
1617                         ir_node *addr;
1618
1619                         /* address for the backing store */
1620                         addr = be_new_FrameAddr(env->isa->sp->reg_class, irg, first_bl, frame, ent);
1621
1622                         if (store)
1623                                 mem = new_r_Proj(irg, first_bl, store, mode_M, pn_Store_M);
1624
1625                         /* the backing store itself */
1626                         store = new_r_Store(irg, first_bl, mem, addr,
1627                                             new_r_Proj(irg, args_bl, args, mode, i));
1628                 }
1629                 /* the new memory Proj gets the last Proj from store */
1630                 set_Proj_pred(nmem, store);
1631                 set_Proj_proj(nmem, pn_Store_M);
1632
1633                 /* move all entities to the frame type */
1634                 frame_tp = get_irg_frame_type(irg);
1635                 offset   = get_type_size_bytes(frame_tp);
1636                 for (ent = new_list; ent; ent = get_entity_link(ent)) {
1637                         ir_type *tp = get_entity_type(ent);
1638                         int align = get_type_alignment_bytes(tp);
1639
1640                         offset += align - 1;
1641                         offset &= -align;
1642                         set_entity_owner(ent, frame_tp);
1643                         add_class_member(frame_tp, ent);
1644                         /* must be automatic to set a fixed layout */
1645                         set_entity_allocation(ent, allocation_automatic);
1646                         set_entity_offset(ent, offset);
1647                         offset += get_type_size_bytes(tp);
1648                 }
1649                 set_type_size_bytes(frame_tp, offset);
1650         }
1651 }
1652
1653 /**
1654  * The start block has no jump, instead it has an initial exec Proj.
1655  * The backend wants to handle all blocks the same way, so we replace
1656  * the out cfg edge with a real jump.
1657  */
1658 static void fix_start_block(ir_node *block, void *env) {
1659         int      *done = env;
1660         int      i;
1661         ir_node  *start_block;
1662         ir_graph *irg;
1663
1664         /* we processed the start block, return */
1665         if (*done)
1666                 return;
1667
1668         irg         = get_irn_irg(block);
1669         start_block = get_irg_start_block(irg);
1670
1671         for (i = get_Block_n_cfgpreds(block) - 1; i >= 0; --i) {
1672                 ir_node *pred       = get_Block_cfgpred(block, i);
1673                 ir_node *pred_block = get_nodes_block(pred);
1674
1675                 /* ok, we are in the block, having start as cfg predecessor */
1676                 if (pred_block == start_block) {
1677                         ir_node *jump = new_r_Jmp(irg, pred_block);
1678                         set_Block_cfgpred(block, i, jump);
1679                         *done = 1;
1680                 }
1681         }
1682 }
1683
1684 /**
1685  * Modify the irg itself and the frame type.
1686  */
1687 static void modify_irg(be_abi_irg_t *env)
1688 {
1689         be_abi_call_t *call       = env->call;
1690         const arch_isa_t *isa     = env->birg->main_env->arch_env->isa;
1691         const arch_register_t *sp = arch_isa_sp(isa);
1692         ir_graph *irg             = env->birg->irg;
1693         ir_node *bl               = get_irg_start_block(irg);
1694         ir_node *end              = get_irg_end_block(irg);
1695         ir_node *old_mem          = get_irg_initial_mem(irg);
1696         ir_node *new_mem_proj;
1697         ir_node *mem;
1698         ir_type *method_type      = get_entity_type(get_irg_entity(irg));
1699         pset *dont_save           = pset_new_ptr(8);
1700
1701         int n_params;
1702         int i, j, n, temp;
1703
1704         reg_node_map_t *rm;
1705         const arch_register_t *fp_reg;
1706         ir_node *frame_pointer;
1707         ir_node *barrier;
1708         ir_node *reg_params_bl;
1709         ir_node **args;
1710         ir_node *arg_tuple;
1711         ir_node *value_param_base;
1712         const ir_edge_t *edge;
1713         ir_type *arg_type, *bet_type;
1714         lower_frame_sels_env_t ctx;
1715         ir_entity **param_map;
1716
1717         bitset_t *used_proj_nr;
1718         DEBUG_ONLY(firm_dbg_module_t *dbg = env->dbg;)
1719
1720         DBG((dbg, LEVEL_1, "introducing abi on %+F\n", irg));
1721
1722         /* Convert the Sel nodes in the irg to frame load/store/addr nodes. */
1723         ctx.env              = env;
1724         ctx.value_param_list = NULL;
1725         irg_walk_graph(irg, lower_frame_sels_walker, NULL, &ctx);
1726
1727         /* value_param_base anchor is not needed anymore now */
1728         value_param_base = get_irg_value_param_base(irg);
1729         be_kill_node(value_param_base);
1730         set_irg_value_param_base(irg, new_r_Bad(irg));
1731
1732         env->frame = obstack_alloc(&env->obst, sizeof(env->frame[0]));
1733         env->regs  = pmap_create();
1734
1735         used_proj_nr = bitset_alloca(1024);
1736         n_params     = get_method_n_params(method_type);
1737         args         = obstack_alloc(&env->obst, n_params * sizeof(args[0]));
1738         memset(args, 0, n_params * sizeof(args[0]));
1739
1740         /* Check if a value parameter is transmitted as a register.
1741          * This might happen if the address of an parameter is taken which is
1742          * transmitted in registers.
1743          *
1744          * Note that on some architectures this case must be handled specially
1745          * because the place of the backing store is determined by their ABI.
1746          *
1747          * In the default case we move the entity to the frame type and create
1748          * a backing store into the first block.
1749          */
1750         fix_address_of_parameter_access(env, ctx.value_param_list);
1751
1752         /* Fill the argument vector */
1753         arg_tuple = get_irg_args(irg);
1754         foreach_out_edge(arg_tuple, edge) {
1755                 ir_node *irn = get_edge_src_irn(edge);
1756                 int nr       = get_Proj_proj(irn);
1757                 args[nr]     = irn;
1758                 DBG((dbg, LEVEL_2, "\treading arg: %d -> %+F\n", nr, irn));
1759         }
1760
1761         arg_type = compute_arg_type(env, call, method_type, &param_map);
1762         bet_type = call->cb->get_between_type(env->cb);
1763         stack_frame_init(env->frame, arg_type, bet_type, get_irg_frame_type(irg), isa->stack_dir, param_map);
1764
1765         /* Count the register params and add them to the number of Projs for the RegParams node */
1766         for(i = 0; i < n_params; ++i) {
1767                 be_abi_call_arg_t *arg = get_call_arg(call, 0, i);
1768                 if(arg->in_reg && args[i]) {
1769                         assert(arg->reg != sp && "cannot use stack pointer as parameter register");
1770                         assert(i == get_Proj_proj(args[i]));
1771
1772                         /* For now, associate the register with the old Proj from Start representing that argument. */
1773                         pmap_insert(env->regs, (void *) arg->reg, args[i]);
1774                         bitset_set(used_proj_nr, i);
1775                         DBG((dbg, LEVEL_2, "\targ #%d -> reg %s\n", i, arg->reg->name));
1776                 }
1777         }
1778
1779         /* Collect all callee-save registers */
1780         for(i = 0, n = arch_isa_get_n_reg_class(isa); i < n; ++i) {
1781                 const arch_register_class_t *cls = arch_isa_get_reg_class(isa, i);
1782                 for(j = 0; j < cls->n_regs; ++j) {
1783                         const arch_register_t *reg = &cls->regs[j];
1784                         if(arch_register_type_is(reg, callee_save) ||
1785                                         arch_register_type_is(reg, state)) {
1786                                 pmap_insert(env->regs, (void *) reg, NULL);
1787                         }
1788                 }
1789         }
1790
1791         pmap_insert(env->regs, (void *) sp, NULL);
1792         pmap_insert(env->regs, (void *) isa->bp, NULL);
1793         reg_params_bl   = get_irg_start_block(irg);
1794         env->reg_params = be_new_RegParams(irg, reg_params_bl, pmap_count(env->regs));
1795         add_irn_dep(env->reg_params, get_irg_start(irg));
1796
1797         /*
1798          * make proj nodes for the callee save registers.
1799          * memorize them, since Return nodes get those as inputs.
1800          *
1801          * Note, that if a register corresponds to an argument, the regs map contains
1802          * the old Proj from start for that argument.
1803          */
1804
1805         rm = reg_map_to_arr(&env->obst, env->regs);
1806         for(i = 0, n = pmap_count(env->regs); i < n; ++i) {
1807                 arch_register_t *reg = (void *) rm[i].reg;
1808                 ir_mode *mode        = reg->reg_class->mode;
1809                 long nr              = i;
1810                 int pos              = BE_OUT_POS((int) nr);
1811                 int flags            = 0;
1812
1813                 ir_node *proj;
1814
1815                 assert(nr >= 0);
1816                 bitset_set(used_proj_nr, nr);
1817                 proj = new_r_Proj(irg, reg_params_bl, env->reg_params, mode, nr);
1818                 pmap_insert(env->regs, (void *) reg, proj);
1819                 be_set_constr_single_reg(env->reg_params, pos, reg);
1820                 arch_set_irn_register(env->birg->main_env->arch_env, proj, reg);
1821
1822                 /*
1823                  * If the register is an ignore register,
1824                  * The Proj for that register shall also be ignored during register allocation.
1825                  */
1826                 if(arch_register_type_is(reg, ignore))
1827                         flags |= arch_irn_flags_ignore;
1828
1829                 if(reg == sp)
1830                         flags |= arch_irn_flags_modify_sp;
1831
1832                 be_node_set_flags(env->reg_params, pos, flags);
1833
1834                 DBG((dbg, LEVEL_2, "\tregister save proj #%d -> reg %s\n", nr, reg->name));
1835         }
1836         obstack_free(&env->obst, rm);
1837
1838         /* create a new initial memory proj */
1839         assert(is_Proj(old_mem));
1840         new_mem_proj = new_r_Proj(irg, get_nodes_block(old_mem),
1841                                   new_r_Unknown(irg, mode_T), mode_M,
1842                                   get_Proj_proj(old_mem));
1843         mem = new_mem_proj;
1844
1845         /* Generate the Prologue */
1846         fp_reg  = call->cb->prologue(env->cb, &mem, env->regs);
1847
1848         /* do the stack allocation BEFORE the barrier, or spill code
1849            might be added before it */
1850         env->init_sp = be_abi_reg_map_get(env->regs, sp);
1851         env->init_sp = be_new_IncSP(sp, irg, bl, env->init_sp, BE_STACK_FRAME_SIZE_EXPAND);
1852         be_abi_reg_map_set(env->regs, sp, env->init_sp);
1853
1854         env->start_barrier = barrier = create_barrier(env, bl, &mem, env->regs, 0);
1855
1856         env->init_sp = be_abi_reg_map_get(env->regs, sp);
1857         arch_set_irn_register(env->birg->main_env->arch_env, env->init_sp, sp);
1858
1859         frame_pointer = be_abi_reg_map_get(env->regs, fp_reg);
1860         set_irg_frame(irg, frame_pointer);
1861         pset_insert_ptr(env->ignore_regs, fp_reg);
1862
1863         /* rewire old mem users to new mem */
1864         set_Proj_pred(new_mem_proj, get_Proj_pred(old_mem));
1865         exchange(old_mem, mem);
1866
1867         set_irg_initial_mem(irg, mem);
1868
1869         /* Now, introduce stack param nodes for all parameters passed on the stack */
1870         for(i = 0; i < n_params; ++i) {
1871                 ir_node *arg_proj = args[i];
1872                 ir_node *repl     = NULL;
1873
1874                 if(arg_proj != NULL) {
1875                         be_abi_call_arg_t *arg;
1876                         ir_type *param_type;
1877                         int nr = get_Proj_proj(arg_proj);
1878
1879                         nr         = MIN(nr, n_params);
1880                         arg        = get_call_arg(call, 0, nr);
1881                         param_type = get_method_param_type(method_type, nr);
1882
1883                         if(arg->in_reg) {
1884                                 repl = pmap_get(env->regs, (void *) arg->reg);
1885                         }
1886
1887                         else if(arg->on_stack) {
1888                                 /* For atomic parameters which are actually used, we create a StackParam node. */
1889                                 if(is_atomic_type(param_type) && get_irn_n_edges(args[i]) > 0) {
1890                                         ir_mode *mode                    = get_type_mode(param_type);
1891                                         const arch_register_class_t *cls = arch_isa_get_reg_class_for_mode(isa, mode);
1892                                         repl = be_new_StackParam(cls, isa->bp->reg_class, irg, reg_params_bl, mode, frame_pointer, arg->stack_ent);
1893                                 }
1894
1895                                 /* The stack parameter is not primitive (it is a struct or array),
1896                                 we thus will create a node representing the parameter's address
1897                                 on the stack. */
1898                                 else {
1899                                         repl = be_new_FrameAddr(sp->reg_class, irg, reg_params_bl, frame_pointer, arg->stack_ent);
1900                                 }
1901                         }
1902
1903                         assert(repl != NULL);
1904                         exchange(args[i], repl);
1905                 }
1906         }
1907
1908         /* the arg proj is not needed anymore now */
1909         assert(get_irn_n_edges(arg_tuple) == 0);
1910         be_kill_node(arg_tuple);
1911         set_irg_args(irg, new_rd_Bad(irg));
1912
1913         /* All Return nodes hang on the End node, so look for them there. */
1914         for (i = 0, n = get_Block_n_cfgpreds(end); i < n; ++i) {
1915                 ir_node *irn = get_Block_cfgpred(end, i);
1916
1917                 if (is_Return(irn)) {
1918                         ir_node *ret = create_be_return(env, irn, get_nodes_block(irn), get_Return_mem(irn), get_Return_n_ress(irn));
1919                         exchange(irn, ret);
1920                 }
1921         }
1922         /* if we have endless loops here, n might be <= 0. Do NOT create a be_Return then,
1923            the code is dead and will never be executed. */
1924
1925         del_pset(dont_save);
1926         obstack_free(&env->obst, args);
1927
1928         /* handle start block here (place a jump in the block) */
1929         temp = 0;
1930         irg_block_walk_graph(irg, fix_start_block, NULL, &temp);
1931 }
1932
1933 /** Fix the state inputs of calls that still hang on unknowns */
1934 static
1935 void fix_call_state_inputs(be_abi_irg_t *env)
1936 {
1937         const arch_isa_t *isa = env->isa;
1938         int i, n, n_states;
1939         arch_register_t **stateregs = NEW_ARR_F(arch_register_t*, 0);
1940
1941         /* Collect caller save registers */
1942         n = arch_isa_get_n_reg_class(isa);
1943         for(i = 0; i < n; ++i) {
1944                 int j;
1945                 const arch_register_class_t *cls = arch_isa_get_reg_class(isa, i);
1946                 for(j = 0; j < cls->n_regs; ++j) {
1947                         const arch_register_t *reg = arch_register_for_index(cls, j);
1948                         if(arch_register_type_is(reg, state)) {
1949                                 ARR_APP1(arch_register_t*, stateregs, (arch_register_t *)reg);
1950                         }
1951                 }
1952         }
1953
1954         n = ARR_LEN(env->calls);
1955         n_states = ARR_LEN(stateregs);
1956         for(i = 0; i < n; ++i) {
1957                 int s, arity;
1958                 ir_node *call = env->calls[i];
1959
1960                 arity = get_irn_arity(call);
1961
1962                 /* the statereg inputs are the last n inputs of the calls */
1963                 for(s = 0; s < n_states; ++s) {
1964                         int inp = arity - n_states + s;
1965                         const arch_register_t *reg = stateregs[s];
1966                         ir_node *regnode = be_abi_reg_map_get(env->regs, reg);
1967
1968                         set_irn_n(call, inp, regnode);
1969                 }
1970         }
1971 }
1972
1973 be_abi_irg_t *be_abi_introduce(be_irg_t *birg)
1974 {
1975         be_abi_irg_t *env  = xmalloc(sizeof(env[0]));
1976         ir_node *old_frame = get_irg_frame(birg->irg);
1977         ir_graph *irg      = birg->irg;
1978
1979         pmap_entry *ent;
1980         ir_node *dummy;
1981         optimization_state_t state;
1982         unsigned *limited_bitset;
1983
1984         be_omit_fp = birg->main_env->options->omit_fp;
1985
1986         obstack_init(&env->obst);
1987
1988         env->isa         = birg->main_env->arch_env->isa;
1989         env->method_type = get_entity_type(get_irg_entity(irg));
1990         env->call        = be_abi_call_new(env->isa->sp->reg_class);
1991         arch_isa_get_call_abi(env->isa, env->method_type, env->call);
1992
1993         env->ignore_regs  = pset_new_ptr_default();
1994         env->keep_map     = pmap_create();
1995         env->dce_survivor = new_survive_dce();
1996         env->birg         = birg;
1997
1998         env->sp_req.type    = arch_register_req_type_limited;
1999         env->sp_req.cls     = arch_register_get_class(env->isa->sp);
2000         limited_bitset      = rbitset_obstack_alloc(&env->obst, env->sp_req.cls->n_regs);
2001         rbitset_set(limited_bitset, arch_register_get_index(env->isa->sp));
2002         env->sp_req.limited = limited_bitset;
2003
2004         env->sp_cls_req.type  = arch_register_req_type_normal;
2005         env->sp_cls_req.cls   = arch_register_get_class(env->isa->sp);
2006
2007         /* Beware: later we replace this node by the real one, ensure it is not CSE'd
2008            to another Unknown or the stack pointer gets used */
2009         save_optimization_state(&state);
2010         set_optimize(0);
2011         env->init_sp = dummy  = new_r_Unknown(irg, env->isa->sp->reg_class->mode);
2012         restore_optimization_state(&state);
2013         FIRM_DBG_REGISTER(env->dbg, "firm.be.abi");
2014
2015         env->calls = NEW_ARR_F(ir_node*, 0);
2016
2017         /* Lower all call nodes in the IRG. */
2018         process_calls(env);
2019
2020         /*
2021                 Beware: init backend abi call object after processing calls,
2022                 otherwise some information might be not yet available.
2023         */
2024         env->cb = env->call->cb->init(env->call, birg->main_env->arch_env, irg);
2025
2026         /* Process the IRG */
2027         modify_irg(env);
2028
2029         /* fix call inputs for state registers */
2030         fix_call_state_inputs(env);
2031
2032         /* We don't need the keep map anymore. */
2033         pmap_destroy(env->keep_map);
2034
2035         /* calls array is not needed anymore */
2036         DEL_ARR_F(env->calls);
2037
2038         /* reroute the stack origin of the calls to the true stack origin. */
2039         exchange(dummy, env->init_sp);
2040         exchange(old_frame, get_irg_frame(irg));
2041
2042         /* Make some important node pointers survive the dead node elimination. */
2043         survive_dce_register_irn(env->dce_survivor, &env->init_sp);
2044         pmap_foreach(env->regs, ent) {
2045                 survive_dce_register_irn(env->dce_survivor, (ir_node **) &ent->value);
2046         }
2047
2048         env->call->cb->done(env->cb);
2049         env->cb = NULL;
2050         return env;
2051 }
2052
2053 void be_abi_free(be_abi_irg_t *env)
2054 {
2055         be_abi_call_free(env->call);
2056         free_survive_dce(env->dce_survivor);
2057         del_pset(env->ignore_regs);
2058         pmap_destroy(env->regs);
2059         obstack_free(&env->obst, NULL);
2060         free(env);
2061 }
2062
2063 void be_abi_put_ignore_regs(be_abi_irg_t *abi, const arch_register_class_t *cls, bitset_t *bs)
2064 {
2065         arch_register_t *reg;
2066
2067         for(reg = pset_first(abi->ignore_regs); reg; reg = pset_next(abi->ignore_regs))
2068                 if(reg->reg_class == cls)
2069                         bitset_set(bs, reg->index);
2070 }
2071
2072 /* Returns the stack layout from a abi environment. */
2073 const be_stack_layout_t *be_abi_get_stack_layout(const be_abi_irg_t *abi) {
2074         return abi->frame;
2075 }
2076
2077 /*
2078
2079   _____ _        ____  _             _
2080  |  ___(_)_  __ / ___|| |_ __ _  ___| | __
2081  | |_  | \ \/ / \___ \| __/ _` |/ __| |/ /
2082  |  _| | |>  <   ___) | || (_| | (__|   <
2083  |_|   |_/_/\_\ |____/ \__\__,_|\___|_|\_\
2084
2085 */
2086
2087 typedef ir_node **node_array;
2088
2089 typedef struct fix_stack_walker_env_t {
2090         node_array sp_nodes;
2091         const arch_env_t *arch_env;
2092 } fix_stack_walker_env_t;
2093
2094 /**
2095  * Walker. Collect all stack modifying nodes.
2096  */
2097 static void collect_stack_nodes_walker(ir_node *node, void *data)
2098 {
2099         fix_stack_walker_env_t *env = data;
2100
2101         if (arch_irn_is(env->arch_env, node, modify_sp)) {
2102                 assert(get_irn_mode(node) != mode_M && get_irn_mode(node) != mode_T);
2103                 ARR_APP1(ir_node*, env->sp_nodes, node);
2104         }
2105 }
2106
2107 void be_abi_fix_stack_nodes(be_abi_irg_t *env)
2108 {
2109         be_ssa_construction_env_t senv;
2110         int i, len;
2111         ir_node **phis;
2112         be_irg_t *birg = env->birg;
2113         be_lv_t *lv = be_get_birg_liveness(birg);
2114         fix_stack_walker_env_t walker_env;
2115         arch_isa_t *isa;
2116
2117         walker_env.sp_nodes = NEW_ARR_F(ir_node*, 0);
2118         walker_env.arch_env = birg->main_env->arch_env;
2119         isa = walker_env.arch_env->isa;
2120
2121         irg_walk_graph(birg->irg, collect_stack_nodes_walker, NULL, &walker_env);
2122
2123         /* nothing to be done if we didn't find any node, in fact we mustn't
2124          * continue, as for endless loops incsp might have had no users and is bad
2125          * now.
2126          */
2127         len = ARR_LEN(walker_env.sp_nodes);
2128         if(len == 0) {
2129                 DEL_ARR_F(walker_env.sp_nodes);
2130                 return;
2131         }
2132
2133         be_ssa_construction_init(&senv, birg);
2134         be_ssa_construction_add_copies(&senv, walker_env.sp_nodes,
2135                                    ARR_LEN(walker_env.sp_nodes));
2136         be_ssa_construction_fix_users_array(&senv, walker_env.sp_nodes,
2137                                       ARR_LEN(walker_env.sp_nodes));
2138
2139         if(lv != NULL) {
2140                 len = ARR_LEN(walker_env.sp_nodes);
2141                 for(i = 0; i < len; ++i) {
2142                         be_liveness_update(lv, walker_env.sp_nodes[i]);
2143                 }
2144                 be_ssa_construction_update_liveness_phis(&senv, lv);
2145         }
2146
2147         phis = be_ssa_construction_get_new_phis(&senv);
2148
2149         /* set register requirements for stack phis */
2150         len = ARR_LEN(phis);
2151         for(i = 0; i < len; ++i) {
2152                 ir_node *phi = phis[i];
2153                 be_set_phi_reg_req(walker_env.arch_env, phi, &env->sp_req);
2154                 be_set_phi_flags(walker_env.arch_env, phi, arch_irn_flags_ignore | arch_irn_flags_modify_sp);
2155                 arch_set_irn_register(walker_env.arch_env, phi, env->isa->sp);
2156         }
2157         be_ssa_construction_destroy(&senv);
2158
2159         DEL_ARR_F(walker_env.sp_nodes);
2160 }
2161
2162 static int process_stack_bias(be_abi_irg_t *env, ir_node *bl, int bias)
2163 {
2164         const arch_env_t *arch_env = env->birg->main_env->arch_env;
2165         int omit_fp            = env->call->flags.bits.try_omit_fp;
2166         ir_node *irn;
2167
2168         sched_foreach(bl, irn) {
2169
2170                 /*
2171                    Check, if the node relates to an entity on the stack frame.
2172                    If so, set the true offset (including the bias) for that
2173                    node.
2174                  */
2175                 ir_entity *ent = arch_get_frame_entity(arch_env, irn);
2176                 if(ent) {
2177                         int offset = get_stack_entity_offset(env->frame, ent, bias);
2178                         arch_set_frame_offset(arch_env, irn, offset);
2179                         DBG((env->dbg, LEVEL_2, "%F has offset %d (including bias %d)\n", ent, offset, bias));
2180                 }
2181
2182                 /*
2183                    If the node modifies the stack pointer by a constant offset,
2184                    record that in the bias.
2185                  */
2186                 if(arch_irn_is(arch_env, irn, modify_sp)) {
2187                         int ofs = arch_get_sp_bias(arch_env, irn);
2188
2189                         if(be_is_IncSP(irn)) {
2190                                 if(ofs == BE_STACK_FRAME_SIZE_EXPAND) {
2191                                         ofs = get_type_size_bytes(get_irg_frame_type(env->birg->irg));
2192                                         be_set_IncSP_offset(irn, ofs);
2193                                 } else if(ofs == BE_STACK_FRAME_SIZE_SHRINK) {
2194                                         ofs = - get_type_size_bytes(get_irg_frame_type(env->birg->irg));
2195                                         be_set_IncSP_offset(irn, ofs);
2196                                 }
2197                         }
2198
2199                         if(omit_fp)
2200                                 bias += ofs;
2201                 }
2202         }
2203
2204         return bias;
2205 }
2206
2207 /**
2208  * A helper struct for the bias walker.
2209  */
2210 struct bias_walk {
2211         be_abi_irg_t *env;     /**< The ABI irg environment. */
2212         int start_block_bias;  /**< The bias at the end of the start block. */
2213         ir_node *start_block;  /**< The start block of the current graph. */
2214 };
2215
2216 /**
2217  * Block-Walker: fix all stack offsets
2218  */
2219 static void stack_bias_walker(ir_node *bl, void *data)
2220 {
2221         struct bias_walk *bw = data;
2222         if (bl != bw->start_block) {
2223                 process_stack_bias(bw->env, bl, bw->start_block_bias);
2224         }
2225 }
2226
2227 void be_abi_fix_stack_bias(be_abi_irg_t *env)
2228 {
2229         ir_graph *irg  = env->birg->irg;
2230         struct bias_walk bw;
2231
2232         stack_frame_compute_initial_offset(env->frame);
2233         // stack_layout_dump(stdout, env->frame);
2234
2235         /* Determine the stack bias at the end of the start block. */
2236         bw.start_block_bias = process_stack_bias(env, get_irg_start_block(irg), 0);
2237
2238         /* fix the bias is all other blocks */
2239         bw.env = env;
2240         bw.start_block = get_irg_start_block(irg);
2241         irg_block_walk_graph(irg, stack_bias_walker, NULL, &bw);
2242 }
2243
2244 ir_node *be_abi_get_callee_save_irn(be_abi_irg_t *abi, const arch_register_t *reg)
2245 {
2246         assert(arch_register_type_is(reg, callee_save));
2247         assert(pmap_contains(abi->regs, (void *) reg));
2248         return pmap_get(abi->regs, (void *) reg);
2249 }
2250
2251 ir_node *be_abi_get_ignore_irn(be_abi_irg_t *abi, const arch_register_t *reg)
2252 {
2253         assert(arch_register_type_is(reg, ignore));
2254         assert(pmap_contains(abi->regs, (void *) reg));
2255         return pmap_get(abi->regs, (void *) reg);
2256 }
2257
2258 ir_node *be_abi_get_start_barrier(be_abi_irg_t *abi)
2259 {
2260         return abi->start_barrier;
2261 }
2262
2263 /**
2264  * Returns non-zero if the ABI has omitted the frame pointer in
2265  * the current graph.
2266  */
2267 int be_abi_omit_fp(const be_abi_irg_t *abi) {
2268         return abi->call->flags.bits.try_omit_fp;
2269 }