be_abi_put_ignore_regs returns now number of ignore registers as unsigned
[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, Michael Beck
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;     /**< stack alignment */
68         unsigned space_before;  /**< allocate space before */
69         unsigned space_after;   /**< allocate 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 the size of a node representing a stack alloc or free for the minimum stack alignment.
799  *
800  * @param alignment  the minimum stack alignment
801  * @param size       the node containing the non-aligned size
802  * @param irg        the irg where new nodes are allocated on
803  * @param irg        the block where new nodes are allocated on
804  * @param dbg        debug info for new nodes
805  *
806  * @return a node representing the aligned size
807  */
808 static ir_node *adjust_alloc_size(unsigned stack_alignment, ir_node *size, ir_graph *irg, ir_node *block, dbg_info *dbg) {
809         if (stack_alignment > 1) {
810                 ir_mode *mode = get_irn_mode(size);
811                 tarval *tv = new_tarval_from_long(stack_alignment-1, mode);
812                 ir_node *mask = new_r_Const(irg, block, mode, tv);
813
814                 size = new_rd_Add(dbg, irg, block, size, mask, mode);
815
816                 tv   = new_tarval_from_long(-(long)stack_alignment, mode);
817                 mask = new_r_Const(irg, block, mode, tv);
818                 size = new_rd_And(dbg, irg, block, size, mask, mode);
819         }
820         return size;
821 }
822 /**
823  * Adjust an alloca.
824  * The alloca is transformed into a back end alloca node and connected to the stack nodes.
825  */
826 static ir_node *adjust_alloc(be_abi_irg_t *env, ir_node *alloc, ir_node *curr_sp, ir_node **result_copy)
827 {
828         ir_node *block;
829         ir_graph *irg;
830         ir_node *alloc_mem;
831         ir_node *alloc_res;
832         ir_type *type;
833         dbg_info *dbg;
834
835         const ir_edge_t *edge;
836         ir_node *new_alloc, *size, *addr, *copy, *ins[2];
837         unsigned stack_alignment;
838
839         if (get_Alloc_where(alloc) != stack_alloc) {
840                 assert(0);
841                 return alloc;
842         }
843
844         block = get_nodes_block(alloc);
845         irg = get_irn_irg(block);
846         alloc_mem = NULL;
847         alloc_res = NULL;
848         type = get_Alloc_type(alloc);
849
850         foreach_out_edge(alloc, edge) {
851                 ir_node *irn = get_edge_src_irn(edge);
852
853                 assert(is_Proj(irn));
854                 switch(get_Proj_proj(irn)) {
855                 case pn_Alloc_M:
856                         alloc_mem = irn;
857                         break;
858                 case pn_Alloc_res:
859                         alloc_res = irn;
860                         break;
861                 default:
862                         break;
863                 }
864         }
865
866         /* Beware: currently Alloc nodes without a result might happen,
867            only escape analysis kills them and this phase runs only for object
868            oriented source. We kill the Alloc here. */
869         if (alloc_res == NULL && alloc_mem) {
870                 exchange(alloc_mem, get_Alloc_mem(alloc));
871                 return curr_sp;
872         }
873
874         dbg = get_irn_dbg_info(alloc);
875
876         /* we might need to multiply the size with the element size */
877         if(type != get_unknown_type() && get_type_size_bytes(type) != 1) {
878                 tarval *tv = new_tarval_from_long(get_type_size_bytes(type), mode_Iu);
879                 ir_node *cnst = new_rd_Const(dbg, irg, block, mode_Iu, tv);
880                 ir_node *mul = new_rd_Mul(dbg, irg, block, get_Alloc_size(alloc),
881                                           cnst, mode_Iu);
882                 size = mul;
883         } else {
884                 size = get_Alloc_size(alloc);
885         }
886
887         /* The stack pointer will be modified in an unknown manner.
888            We cannot omit it. */
889         env->call->flags.bits.try_omit_fp = 0;
890
891         /* FIXME: size must be here round up for the stack alignment, but
892            this must be transmitted from the backend. */
893         stack_alignment = 4;
894         size = adjust_alloc_size(stack_alignment, size, irg, block, dbg);
895         new_alloc = be_new_AddSP(env->isa->sp, irg, block, curr_sp, size);
896         set_irn_dbg_info(new_alloc, dbg);
897
898         if(alloc_mem != NULL) {
899                 ir_node *addsp_mem;
900                 ir_node *sync;
901
902                 addsp_mem = new_r_Proj(irg, block, new_alloc, mode_M, pn_be_AddSP_M);
903
904                 /* We need to sync the output mem of the AddSP with the input mem
905                    edge into the alloc node. */
906                 ins[0] = get_Alloc_mem(alloc);
907                 ins[1] = addsp_mem;
908                 sync = new_r_Sync(irg, block, 2, ins);
909
910                 exchange(alloc_mem, sync);
911         }
912
913         exchange(alloc, new_alloc);
914
915         /* fix projnum of alloca res */
916         set_Proj_proj(alloc_res, pn_be_AddSP_res);
917
918         addr = env->isa->stack_dir < 0 ? alloc_res : curr_sp;
919
920         /* copy the address away, since it could be used after further stack pointer modifications. */
921         /* Let it point curr_sp just for the moment, I'll reroute it in a second. */
922         *result_copy = copy = be_new_Copy(env->isa->sp->reg_class, irg, block, curr_sp);
923
924         /* Let all users of the Alloc() result now point to the copy. */
925         edges_reroute(alloc_res, copy, irg);
926
927         /* Rewire the copy appropriately. */
928         set_irn_n(copy, be_pos_Copy_op, addr);
929
930         curr_sp = alloc_res;
931
932         return curr_sp;
933 }  /* adjust_alloc */
934
935 /**
936  * Adjust a Free.
937  * The Free is transformed into a back end free node and connected to the stack nodes.
938  */
939 static ir_node *adjust_free(be_abi_irg_t *env, ir_node *free, ir_node *curr_sp)
940 {
941         ir_node *block;
942         ir_graph *irg;
943         ir_node *subsp, *mem, *res, *size, *sync;
944         ir_type *type;
945         ir_node *in[2];
946         ir_mode *sp_mode;
947         unsigned stack_alignment;
948         dbg_info *dbg;
949
950         if (get_Free_where(free) != stack_alloc) {
951                 assert(0);
952                 return free;
953         }
954
955         block = get_nodes_block(free);
956         irg = get_irn_irg(block);
957         type = get_Free_type(free);
958         sp_mode = env->isa->sp->reg_class->mode;
959         dbg = get_irn_dbg_info(free);
960
961         /* we might need to multiply the size with the element size */
962         if(type != get_unknown_type() && get_type_size_bytes(type) != 1) {
963                 tarval *tv = new_tarval_from_long(get_type_size_bytes(type), mode_Iu);
964                 ir_node *cnst = new_rd_Const(dbg, irg, block, mode_Iu, tv);
965                 ir_node *mul = new_rd_Mul(dbg, irg, block, get_Free_size(free),
966                                           cnst, mode_Iu);
967                 size = mul;
968         } else {
969                 size = get_Free_size(free);
970         }
971
972         /* FIXME: size must be here round up for the stack alignment, but
973            this must be transmitted from the backend. */
974         stack_alignment = 4;
975         size = adjust_alloc_size(stack_alignment, size, irg, block, dbg);
976
977         /* The stack pointer will be modified in an unknown manner.
978            We cannot omit it. */
979         env->call->flags.bits.try_omit_fp = 0;
980         subsp = be_new_SubSP(env->isa->sp, irg, block, curr_sp, size);
981         set_irn_dbg_info(subsp, dbg);
982
983         mem = new_r_Proj(irg, block, subsp, mode_M, pn_be_SubSP_M);
984         res = new_r_Proj(irg, block, subsp, sp_mode, pn_be_SubSP_res);
985
986         /* we need to sync the memory */
987         in[0] = get_Free_mem(free);
988         in[1] = mem;
989         sync = new_r_Sync(irg, block, 2, in);
990
991         /* and make the AddSP dependent on the former memory */
992         add_irn_dep(subsp, get_Free_mem(free));
993
994         /* kill the free */
995         exchange(free, sync);
996         curr_sp = res;
997
998         return curr_sp;
999 }  /* adjust_free */
1000
1001 /* the following function is replaced by the usage of the heights module */
1002 #if 0
1003 /**
1004  * Walker for dependent_on().
1005  * This function searches a node tgt recursively from a given node
1006  * but is restricted to the given block.
1007  * @return 1 if tgt was reachable from curr, 0 if not.
1008  */
1009 static int check_dependence(ir_node *curr, ir_node *tgt, ir_node *bl)
1010 {
1011         int n, i;
1012
1013         if (get_nodes_block(curr) != bl)
1014                 return 0;
1015
1016         if (curr == tgt)
1017                 return 1;
1018
1019         /* Phi functions stop the recursion inside a basic block */
1020         if (! is_Phi(curr)) {
1021                 for(i = 0, n = get_irn_arity(curr); i < n; ++i) {
1022                         if (check_dependence(get_irn_n(curr, i), tgt, bl))
1023                                 return 1;
1024                 }
1025         }
1026
1027         return 0;
1028 }
1029 #endif /* if 0 */
1030
1031 /**
1032  * Check if a node is somehow data dependent on another one.
1033  * both nodes must be in the same basic block.
1034  * @param n1 The first node.
1035  * @param n2 The second node.
1036  * @return 1, if n1 is data dependent (transitively) on n2, 0 if not.
1037  */
1038 static int dependent_on(ir_node *n1, ir_node *n2)
1039 {
1040         assert(get_nodes_block(n1) == get_nodes_block(n2));
1041
1042         return heights_reachable_in_block(ir_heights, n1, n2);
1043 }
1044
1045 static int cmp_call_dependecy(const void *c1, const void *c2)
1046 {
1047         ir_node *n1 = *(ir_node **) c1;
1048         ir_node *n2 = *(ir_node **) c2;
1049
1050         /*
1051                 Classical qsort() comparison function behavior:
1052                 0  if both elements are equal
1053                 1  if second is "smaller" that first
1054                 -1 if first is "smaller" that second
1055         */
1056         if (dependent_on(n1, n2))
1057                 return -1;
1058
1059         if (dependent_on(n2, n1))
1060                 return 1;
1061
1062         return 0;
1063 }
1064
1065 /**
1066  * Walker: links all Call/alloc/Free nodes to the Block they are contained.
1067  */
1068 static void link_calls_in_block_walker(ir_node *irn, void *data)
1069 {
1070         ir_opcode code = get_irn_opcode(irn);
1071
1072         if (code == iro_Call ||
1073                 (code == iro_Alloc && get_Alloc_where(irn) == stack_alloc) ||
1074                 (code == iro_Free && get_Free_where(irn) == stack_alloc)) {
1075                 be_abi_irg_t *env = data;
1076                 ir_node *bl       = get_nodes_block(irn);
1077                 void *save        = get_irn_link(bl);
1078
1079                 if (code == iro_Call)
1080                         env->call->flags.bits.irg_is_leaf = 0;
1081
1082                 set_irn_link(irn, save);
1083                 set_irn_link(bl, irn);
1084         }
1085 }
1086
1087 /**
1088  * Block-walker:
1089  * Process all Call nodes inside a basic block.
1090  * Note that the link field of the block must contain a linked list of all
1091  * Call nodes inside the Block. We first order this list according to data dependency
1092  * and that connect the calls together.
1093  */
1094 static void process_calls_in_block(ir_node *bl, void *data)
1095 {
1096         be_abi_irg_t *env = data;
1097         ir_node *curr_sp  = env->init_sp;
1098         ir_node *irn;
1099         int n;
1100
1101         for(irn = get_irn_link(bl), n = 0; irn; irn = get_irn_link(irn), ++n)
1102                 obstack_ptr_grow(&env->obst, irn);
1103
1104         /* If there were call nodes in the block. */
1105         if(n > 0) {
1106                 ir_node *keep;
1107                 ir_node **nodes;
1108                 ir_node *copy = NULL;
1109                 int i;
1110
1111                 nodes = obstack_finish(&env->obst);
1112
1113                 /* order the call nodes according to data dependency */
1114                 qsort(nodes, n, sizeof(nodes[0]), cmp_call_dependecy);
1115
1116                 for(i = n - 1; i >= 0; --i) {
1117                         ir_node *irn = nodes[i];
1118
1119                         DBG((env->dbg, LEVEL_3, "\tprocessing call %+F\n", irn));
1120                         switch(get_irn_opcode(irn)) {
1121                         case iro_Call:
1122                                 curr_sp = adjust_call(env, irn, curr_sp, copy);
1123                                 break;
1124                         case iro_Alloc:
1125                                 curr_sp = adjust_alloc(env, irn, curr_sp, &copy);
1126                                 break;
1127                         case iro_Free:
1128                                 curr_sp = adjust_free(env, irn, curr_sp);
1129                                 break;
1130                         default:
1131                                 break;
1132                         }
1133                 }
1134
1135                 obstack_free(&env->obst, nodes);
1136
1137                 /* Keep the last stack state in the block by tying it to Keep node */
1138                 nodes[0] = curr_sp;
1139                 keep     = be_new_Keep(env->isa->sp->reg_class, get_irn_irg(bl), bl, 1, nodes);
1140                 pmap_insert(env->keep_map, bl, keep);
1141         }
1142
1143         set_irn_link(bl, curr_sp);
1144 }  /* process_calls_in_block */
1145
1146 /**
1147  * Adjust all call nodes in the graph to the ABI conventions.
1148  */
1149 static void process_calls(be_abi_irg_t *env)
1150 {
1151         ir_graph *irg = env->birg->irg;
1152
1153         env->call->flags.bits.irg_is_leaf = 1;
1154         irg_walk_graph(irg, firm_clear_link, link_calls_in_block_walker, env);
1155
1156         ir_heights = heights_new(env->birg->irg);
1157         irg_block_walk_graph(irg, NULL, process_calls_in_block, env);
1158         heights_free(ir_heights);
1159 }
1160
1161 #if 0 /*
1162 static ir_node *setup_frame(be_abi_irg_t *env)
1163 {
1164         const arch_isa_t *isa = env->birg->main_env->arch_env->isa;
1165         const arch_register_t *sp = isa->sp;
1166         const arch_register_t *bp = isa->bp;
1167         be_abi_call_flags_bits_t flags = env->call->flags.bits;
1168         ir_graph *irg      = env->birg->irg;
1169         ir_node *bl        = get_irg_start_block(irg);
1170         ir_node *no_mem    = get_irg_no_mem(irg);
1171         ir_node *old_frame = get_irg_frame(irg);
1172         ir_node *stack     = pmap_get(env->regs, (void *) sp);
1173         ir_node *frame     = pmap_get(env->regs, (void *) bp);
1174
1175         int stack_nr       = get_Proj_proj(stack);
1176
1177         if(flags.try_omit_fp) {
1178                 stack = be_new_IncSP(sp, irg, bl, stack, no_mem, BE_STACK_FRAME_SIZE_EXPAND);
1179                 frame = stack;
1180         }
1181
1182         else {
1183                 frame = be_new_Copy(bp->reg_class, irg, bl, stack);
1184
1185                 be_node_set_flags(frame, -1, arch_irn_flags_dont_spill);
1186                 if(!flags.fp_free) {
1187                         be_set_constr_single_reg(frame, -1, bp);
1188                         be_node_set_flags(frame, -1, arch_irn_flags_ignore);
1189                         arch_set_irn_register(env->birg->main_env->arch_env, frame, bp);
1190                 }
1191
1192                 stack = be_new_IncSP(sp, irg, bl, stack, frame, BE_STACK_FRAME_SIZE_EXPAND);
1193         }
1194
1195         be_node_set_flags(env->reg_params, -(stack_nr + 1), arch_irn_flags_ignore);
1196         env->init_sp = stack;
1197         set_irg_frame(irg, frame);
1198         edges_reroute(old_frame, frame, irg);
1199
1200         return frame;
1201 }
1202
1203 static void clearup_frame(be_abi_irg_t *env, ir_node *ret, pmap *reg_map, struct obstack *obst)
1204 {
1205         const arch_isa_t *isa = env->birg->main_env->arch_env->isa;
1206         const arch_register_t *sp = isa->sp;
1207         const arch_register_t *bp = isa->bp;
1208         ir_graph *irg      = env->birg->irg;
1209         ir_node *ret_mem   = get_Return_mem(ret);
1210         ir_node *frame     = get_irg_frame(irg);
1211         ir_node *bl        = get_nodes_block(ret);
1212         ir_node *stack     = get_irn_link(bl);
1213
1214         pmap_entry *ent;
1215
1216         if(env->call->flags.bits.try_omit_fp) {
1217                 stack = be_new_IncSP(sp, irg, bl, stack, ret_mem, -BE_STACK_FRAME_SIZE_SHRINK);
1218         }
1219
1220         else {
1221                 stack = be_new_SetSP(sp, irg, bl, stack, frame, ret_mem);
1222                 be_set_constr_single_reg(stack, -1, sp);
1223                 be_node_set_flags(stack, -1, arch_irn_flags_ignore);
1224         }
1225
1226         pmap_foreach(env->regs, ent) {
1227                 const arch_register_t *reg = ent->key;
1228                 ir_node *irn               = ent->value;
1229
1230                 if(reg == sp)
1231                         obstack_ptr_grow(&env->obst, stack);
1232                 else if(reg == bp)
1233                         obstack_ptr_grow(&env->obst, frame);
1234                 else if(arch_register_type_is(reg, callee_save) || arch_register_type_is(reg, ignore))
1235                         obstack_ptr_grow(obst, irn);
1236         }
1237 }
1238 */
1239 #endif
1240
1241 /**
1242  * Computes the stack argument layout type.
1243  * Changes a possibly allocated value param type by moving
1244  * entities to the stack layout type.
1245  *
1246  * @param env          the ABI environment
1247  * @param call         the current call ABI
1248  * @param method_type  the method type
1249  * @param param_map    an array mapping method arguments to the stack layout type
1250  *
1251  * @return the stack argument layout type
1252  */
1253 static ir_type *compute_arg_type(be_abi_irg_t *env, be_abi_call_t *call, ir_type *method_type, ir_entity ***param_map)
1254 {
1255         int dir  = env->call->flags.bits.left_to_right ? 1 : -1;
1256         int inc  = env->birg->main_env->arch_env->isa->stack_dir * dir;
1257         int n    = get_method_n_params(method_type);
1258         int curr = inc > 0 ? 0 : n - 1;
1259         int ofs  = 0;
1260
1261         char buf[128];
1262         ir_type *res;
1263         int i;
1264         ir_type *val_param_tp = get_method_value_param_type(method_type);
1265         ident *id = get_entity_ident(get_irg_entity(env->birg->irg));
1266         ir_entity **map;
1267
1268         *param_map = map = obstack_alloc(&env->obst, n * sizeof(ir_entity *));
1269         res = new_type_struct(mangle_u(id, new_id_from_chars("arg_type", 8)));
1270         for (i = 0; i < n; ++i, curr += inc) {
1271                 ir_type *param_type    = get_method_param_type(method_type, curr);
1272                 be_abi_call_arg_t *arg = get_call_arg(call, 0, curr);
1273
1274                 map[i] = NULL;
1275                 if (arg->on_stack) {
1276                         if (val_param_tp) {
1277                                 /* the entity was already created, move it to the param type */
1278                                 arg->stack_ent = get_method_value_param_ent(method_type, i);
1279                                 remove_struct_member(val_param_tp, arg->stack_ent);
1280                                 set_entity_owner(arg->stack_ent, res);
1281                                 add_struct_member(res, arg->stack_ent);
1282                                 /* must be automatic to set a fixed layout */
1283                                 set_entity_allocation(arg->stack_ent, allocation_automatic);
1284                         }
1285                         else {
1286                                 snprintf(buf, sizeof(buf), "param_%d", i);
1287                                 arg->stack_ent = new_entity(res, new_id_from_str(buf), param_type);
1288                         }
1289                         ofs += arg->space_before;
1290                         ofs = round_up2(ofs, arg->alignment);
1291                         set_entity_offset(arg->stack_ent, ofs);
1292                         ofs += arg->space_after;
1293                         ofs += get_type_size_bytes(param_type);
1294                         map[i] = arg->stack_ent;
1295                 }
1296         }
1297         set_type_size_bytes(res, ofs);
1298         set_type_state(res, layout_fixed);
1299         return res;
1300 }
1301
1302 #if 0
1303 static void create_register_perms(const arch_isa_t *isa, ir_graph *irg, ir_node *bl, pmap *regs)
1304 {
1305         int i, j, n;
1306         struct obstack obst;
1307
1308         obstack_init(&obst);
1309
1310         /* Create a Perm after the RegParams node to delimit it. */
1311         for(i = 0, n = arch_isa_get_n_reg_class(isa); i < n; ++i) {
1312                 const arch_register_class_t *cls = arch_isa_get_reg_class(isa, i);
1313                 ir_node *perm;
1314                 ir_node **in;
1315                 int n_regs;
1316
1317                 for(n_regs = 0, j = 0; j < cls->n_regs; ++j) {
1318                         const arch_register_t *reg = &cls->regs[j];
1319                         ir_node *irn = pmap_get(regs, (void *) reg);
1320
1321                         if(irn && !arch_register_type_is(reg, ignore)) {
1322                                 n_regs++;
1323                                 obstack_ptr_grow(&obst, irn);
1324                                 set_irn_link(irn, (void *) reg);
1325                         }
1326                 }
1327
1328                 obstack_ptr_grow(&obst, NULL);
1329                 in = obstack_finish(&obst);
1330                 if(n_regs > 0) {
1331                         perm = be_new_Perm(cls, irg, bl, n_regs, in);
1332                         for(j = 0; j < n_regs; ++j) {
1333                                 ir_node *arg = in[j];
1334                                 arch_register_t *reg = get_irn_link(arg);
1335                                 pmap_insert(regs, reg, arg);
1336                                 be_set_constr_single_reg(perm, BE_OUT_POS(j), reg);
1337                         }
1338                 }
1339                 obstack_free(&obst, in);
1340         }
1341
1342         obstack_free(&obst, NULL);
1343 }
1344 #endif
1345
1346 typedef struct {
1347         const arch_register_t *reg;
1348         ir_node *irn;
1349 } reg_node_map_t;
1350
1351 static int cmp_regs(const void *a, const void *b)
1352 {
1353         const reg_node_map_t *p = a;
1354         const reg_node_map_t *q = b;
1355
1356         if(p->reg->reg_class == q->reg->reg_class)
1357                 return p->reg->index - q->reg->index;
1358         else
1359                 return p->reg->reg_class - q->reg->reg_class;
1360 }
1361
1362 static reg_node_map_t *reg_map_to_arr(struct obstack *obst, pmap *reg_map)
1363 {
1364         pmap_entry *ent;
1365         int n = pmap_count(reg_map);
1366         int i = 0;
1367         reg_node_map_t *res = obstack_alloc(obst, n * sizeof(res[0]));
1368
1369         pmap_foreach(reg_map, ent) {
1370                 res[i].reg = ent->key;
1371                 res[i].irn = ent->value;
1372                 i++;
1373         }
1374
1375         qsort(res, n, sizeof(res[0]), cmp_regs);
1376         return res;
1377 }
1378
1379 /**
1380  * Creates a barrier.
1381  */
1382 static ir_node *create_barrier(be_abi_irg_t *env, ir_node *bl, ir_node **mem, pmap *regs, int in_req)
1383 {
1384         ir_graph *irg = env->birg->irg;
1385         int n_regs    = pmap_count(regs);
1386         int n;
1387         ir_node *irn;
1388         ir_node **in;
1389         reg_node_map_t *rm;
1390
1391         rm = reg_map_to_arr(&env->obst, regs);
1392
1393         for(n = 0; n < n_regs; ++n)
1394                 obstack_ptr_grow(&env->obst, rm[n].irn);
1395
1396         if(mem) {
1397                 obstack_ptr_grow(&env->obst, *mem);
1398                 n++;
1399         }
1400
1401         in = (ir_node **) obstack_finish(&env->obst);
1402         irn = be_new_Barrier(irg, bl, n, in);
1403         obstack_free(&env->obst, in);
1404
1405         for(n = 0; n < n_regs; ++n) {
1406                 const arch_register_t *reg = rm[n].reg;
1407                 int flags                  = 0;
1408                 int pos                    = BE_OUT_POS(n);
1409                 ir_node *proj;
1410
1411                 proj = new_r_Proj(irg, bl, irn, get_irn_mode(rm[n].irn), n);
1412                 be_node_set_reg_class(irn, n, reg->reg_class);
1413                 if(in_req)
1414                         be_set_constr_single_reg(irn, n, reg);
1415                 be_set_constr_single_reg(irn, pos, reg);
1416                 be_node_set_reg_class(irn, pos, reg->reg_class);
1417                 arch_set_irn_register(env->birg->main_env->arch_env, proj, reg);
1418
1419                 /* if the proj projects a ignore register or a node which is set to ignore, propagate this property. */
1420                 if(arch_register_type_is(reg, ignore) || arch_irn_is(env->birg->main_env->arch_env, in[n], ignore))
1421                         flags |= arch_irn_flags_ignore;
1422
1423                 if(arch_irn_is(env->birg->main_env->arch_env, in[n], modify_sp))
1424                         flags |= arch_irn_flags_modify_sp;
1425
1426                 be_node_set_flags(irn, pos, flags);
1427
1428                 pmap_insert(regs, (void *) reg, proj);
1429         }
1430
1431         if(mem) {
1432                 *mem = new_r_Proj(irg, bl, irn, mode_M, n);
1433         }
1434
1435         obstack_free(&env->obst, rm);
1436         return irn;
1437 }
1438
1439 /**
1440  * Creates a be_Return for a Return node.
1441  *
1442  * @param @env    the abi environment
1443  * @param irn     the Return node or NULL if there was none
1444  * @param bl      the block where the be_Retun should be placed
1445  * @param mem     the current memory
1446  * @param n_res   number of return results
1447  */
1448 static ir_node *create_be_return(be_abi_irg_t *env, ir_node *irn, ir_node *bl, ir_node *mem, int n_res) {
1449         be_abi_call_t *call = env->call;
1450         const arch_isa_t *isa = env->birg->main_env->arch_env->isa;
1451
1452         pmap *reg_map  = pmap_create();
1453         ir_node *keep  = pmap_get(env->keep_map, bl);
1454         int in_max;
1455         ir_node *ret;
1456         int i, n;
1457         ir_node **in;
1458         ir_node *stack;
1459         const arch_register_t **regs;
1460         pmap_entry *ent ;
1461
1462         /*
1463                 get the valid stack node in this block.
1464                 If we had a call in that block there is a Keep constructed by process_calls()
1465                 which points to the last stack modification in that block. we'll use
1466                 it then. Else we use the stack from the start block and let
1467                 the ssa construction fix the usage.
1468         */
1469         stack = be_abi_reg_map_get(env->regs, isa->sp);
1470         if (keep) {
1471                 ir_node *bad = new_r_Bad(env->birg->irg);
1472                 stack = get_irn_n(keep, 0);
1473                 set_nodes_block(keep, bad);
1474                 set_irn_n(keep, 0, bad);
1475                 // exchange(keep, new_r_Bad(env->birg->irg));
1476         }
1477
1478         /* Insert results for Return into the register map. */
1479         for(i = 0; i < n_res; ++i) {
1480                 ir_node *res           = get_Return_res(irn, i);
1481                 be_abi_call_arg_t *arg = get_call_arg(call, 1, i);
1482                 assert(arg->in_reg && "return value must be passed in register");
1483                 pmap_insert(reg_map, (void *) arg->reg, res);
1484         }
1485
1486         /* Add uses of the callee save registers. */
1487         pmap_foreach(env->regs, ent) {
1488                 const arch_register_t *reg = ent->key;
1489                 if(arch_register_type_is(reg, callee_save) || arch_register_type_is(reg, ignore))
1490                         pmap_insert(reg_map, ent->key, ent->value);
1491         }
1492
1493         be_abi_reg_map_set(reg_map, isa->sp, stack);
1494
1495         /* Make the Epilogue node and call the arch's epilogue maker. */
1496         create_barrier(env, bl, &mem, reg_map, 1);
1497         call->cb->epilogue(env->cb, bl, &mem, reg_map);
1498
1499         /*
1500                 Maximum size of the in array for Return nodes is
1501                 return args + callee save/ignore registers + memory + stack pointer
1502         */
1503         in_max = pmap_count(reg_map) + n_res + 2;
1504
1505         in   = obstack_alloc(&env->obst, in_max * sizeof(in[0]));
1506         regs = obstack_alloc(&env->obst, in_max * sizeof(regs[0]));
1507
1508         in[0]   = mem;
1509         in[1]   = be_abi_reg_map_get(reg_map, isa->sp);
1510         regs[0] = NULL;
1511         regs[1] = isa->sp;
1512         n       = 2;
1513
1514         /* clear SP entry, since it has already been grown. */
1515         pmap_insert(reg_map, (void *) isa->sp, NULL);
1516         for(i = 0; i < n_res; ++i) {
1517                 be_abi_call_arg_t *arg = get_call_arg(call, 1, i);
1518
1519                 in[n]     = be_abi_reg_map_get(reg_map, arg->reg);
1520                 regs[n++] = arg->reg;
1521
1522                 /* Clear the map entry to mark the register as processed. */
1523                 be_abi_reg_map_set(reg_map, arg->reg, NULL);
1524         }
1525
1526         /* grow the rest of the stuff. */
1527         pmap_foreach(reg_map, ent) {
1528                 if(ent->value) {
1529                         in[n]     = ent->value;
1530                         regs[n++] = ent->key;
1531                 }
1532         }
1533
1534         /* The in array for the new back end return is now ready. */
1535         ret = be_new_Return(irn ? get_irn_dbg_info(irn) : NULL, env->birg->irg, bl, n_res, n, in);
1536
1537         /* Set the register classes of the return's parameter accordingly. */
1538         for(i = 0; i < n; ++i)
1539                 if(regs[i])
1540                         be_node_set_reg_class(ret, i, regs[i]->reg_class);
1541
1542         /* Free the space of the Epilog's in array and the register <-> proj map. */
1543         obstack_free(&env->obst, in);
1544         pmap_destroy(reg_map);
1545
1546         return ret;
1547 }
1548
1549 typedef struct lower_frame_sels_env_t {
1550         be_abi_irg_t *env;
1551         ir_entity    *value_param_list;  /**< the list of all value param entities */
1552 } lower_frame_sels_env_t;
1553
1554 /**
1555  * Walker: Replaces Sels of frame type and
1556  * value param type entities by FrameAddress.
1557  */
1558 static void lower_frame_sels_walker(ir_node *irn, void *data)
1559 {
1560         lower_frame_sels_env_t *ctx = data;
1561
1562         if (is_Sel(irn)) {
1563                 ir_graph *irg        = current_ir_graph;
1564                 ir_node  *frame      = get_irg_frame(irg);
1565                 ir_node  *param_base = get_irg_value_param_base(irg);
1566                 ir_node  *ptr        = get_Sel_ptr(irn);
1567
1568                 if (ptr == frame || ptr == param_base) {
1569                         be_abi_irg_t *env = ctx->env;
1570                         ir_entity    *ent = get_Sel_entity(irn);
1571                         ir_node      *bl  = get_nodes_block(irn);
1572                         ir_node      *nw;
1573
1574                         nw = be_new_FrameAddr(env->isa->sp->reg_class, irg, bl, frame, ent);
1575                         exchange(irn, nw);
1576
1577                         /* check, if it's a param sel and if have not seen this entity immediatly before */
1578                         if (ptr == param_base && ctx->value_param_list != ent) {
1579                                 set_entity_link(ent, ctx->value_param_list);
1580                                 ctx->value_param_list = ent;
1581                         }
1582                 }
1583         }
1584 }
1585
1586 /**
1587  * Check if a value parameter is transmitted as a register.
1588  * This might happen if the address of an parameter is taken which is
1589  * transmitted in registers.
1590  *
1591  * Note that on some architectures this case must be handled specially
1592  * because the place of the backing store is determined by their ABI.
1593  *
1594  * In the default case we move the entity to the frame type and create
1595  * a backing store into the first block.
1596  */
1597 static void fix_address_of_parameter_access(be_abi_irg_t *env, ir_entity *value_param_list) {
1598         be_abi_call_t *call = env->call;
1599         ir_graph *irg       = env->birg->irg;
1600         ir_entity *ent, *next_ent, *new_list;
1601         ir_type *frame_tp;
1602         DEBUG_ONLY(firm_dbg_module_t *dbg = env->dbg;)
1603
1604         new_list = NULL;
1605         for (ent = value_param_list; ent; ent = next_ent) {
1606                 int i = get_struct_member_index(get_entity_owner(ent), ent);
1607                 be_abi_call_arg_t *arg = get_call_arg(call, 0, i);
1608
1609                 next_ent = get_entity_link(ent);
1610                 if (arg->in_reg) {
1611                         DBG((dbg, LEVEL_2, "\targ #%d need backing store\n", i));
1612                         set_entity_link(ent, new_list);
1613                         new_list = ent;
1614                 }
1615         }
1616         if (new_list) {
1617                 /* ok, change the graph */
1618                 ir_node *start_bl = get_irg_start_block(irg);
1619                 ir_node *first_bl = NULL;
1620                 ir_node *frame, *imem, *nmem, *store, *mem, *args, *args_bl;
1621                 const ir_edge_t *edge;
1622                 optimization_state_t state;
1623                 int offset;
1624
1625                 foreach_block_succ(start_bl, edge) {
1626                         ir_node *succ = get_edge_src_irn(edge);
1627                         if (start_bl != succ) {
1628                                 first_bl = succ;
1629                                 break;
1630                         }
1631                 }
1632                 assert(first_bl);
1633                 /* we had already removed critical edges, so the following
1634                    assertion should be always true. */
1635                 assert(get_Block_n_cfgpreds(first_bl) == 1);
1636
1637                 /* now create backing stores */
1638                 frame = get_irg_frame(irg);
1639                 imem = get_irg_initial_mem(irg);
1640
1641                 save_optimization_state(&state);
1642                 set_optimize(0);
1643                 nmem = new_r_Proj(irg, first_bl, get_irg_start(irg), mode_M, pn_Start_M);
1644                 restore_optimization_state(&state);
1645
1646                 /* reroute all edges to the new memory source */
1647                 edges_reroute(imem, nmem, irg);
1648
1649                 store   = NULL;
1650                 mem     = imem;
1651                 args    = get_irg_args(irg);
1652                 args_bl = get_nodes_block(args);
1653                 for (ent = new_list; ent; ent = get_entity_link(ent)) {
1654                         int     i     = get_struct_member_index(get_entity_owner(ent), ent);
1655                         ir_type *tp   = get_entity_type(ent);
1656                         ir_mode *mode = get_type_mode(tp);
1657                         ir_node *addr;
1658
1659                         /* address for the backing store */
1660                         addr = be_new_FrameAddr(env->isa->sp->reg_class, irg, first_bl, frame, ent);
1661
1662                         if (store)
1663                                 mem = new_r_Proj(irg, first_bl, store, mode_M, pn_Store_M);
1664
1665                         /* the backing store itself */
1666                         store = new_r_Store(irg, first_bl, mem, addr,
1667                                             new_r_Proj(irg, args_bl, args, mode, i));
1668                 }
1669                 /* the new memory Proj gets the last Proj from store */
1670                 set_Proj_pred(nmem, store);
1671                 set_Proj_proj(nmem, pn_Store_M);
1672
1673                 /* move all entities to the frame type */
1674                 frame_tp = get_irg_frame_type(irg);
1675                 offset   = get_type_size_bytes(frame_tp);
1676                 for (ent = new_list; ent; ent = get_entity_link(ent)) {
1677                         ir_type *tp = get_entity_type(ent);
1678                         int align = get_type_alignment_bytes(tp);
1679
1680                         offset += align - 1;
1681                         offset &= -align;
1682                         set_entity_owner(ent, frame_tp);
1683                         add_class_member(frame_tp, ent);
1684                         /* must be automatic to set a fixed layout */
1685                         set_entity_allocation(ent, allocation_automatic);
1686                         set_entity_offset(ent, offset);
1687                         offset += get_type_size_bytes(tp);
1688                 }
1689                 set_type_size_bytes(frame_tp, offset);
1690         }
1691 }
1692
1693 /**
1694  * The start block has no jump, instead it has an initial exec Proj.
1695  * The backend wants to handle all blocks the same way, so we replace
1696  * the out cfg edge with a real jump.
1697  */
1698 static void fix_start_block(ir_node *block, void *env) {
1699         int      *done = env;
1700         int      i;
1701         ir_node  *start_block;
1702         ir_graph *irg;
1703
1704         /* we processed the start block, return */
1705         if (*done)
1706                 return;
1707
1708         irg         = get_irn_irg(block);
1709         start_block = get_irg_start_block(irg);
1710
1711         for (i = get_Block_n_cfgpreds(block) - 1; i >= 0; --i) {
1712                 ir_node *pred       = get_Block_cfgpred(block, i);
1713                 ir_node *pred_block = get_nodes_block(pred);
1714
1715                 /* ok, we are in the block, having start as cfg predecessor */
1716                 if (pred_block == start_block) {
1717                         ir_node *jump = new_r_Jmp(irg, pred_block);
1718                         set_Block_cfgpred(block, i, jump);
1719                         *done = 1;
1720                 }
1721         }
1722 }
1723
1724 /**
1725  * Modify the irg itself and the frame type.
1726  */
1727 static void modify_irg(be_abi_irg_t *env)
1728 {
1729         be_abi_call_t *call       = env->call;
1730         const arch_isa_t *isa     = env->birg->main_env->arch_env->isa;
1731         const arch_register_t *sp = arch_isa_sp(isa);
1732         ir_graph *irg             = env->birg->irg;
1733         ir_node *bl               = get_irg_start_block(irg);
1734         ir_node *end              = get_irg_end_block(irg);
1735         ir_node *old_mem          = get_irg_initial_mem(irg);
1736         ir_node *new_mem_proj;
1737         ir_node *mem;
1738         ir_type *method_type      = get_entity_type(get_irg_entity(irg));
1739         pset *dont_save           = pset_new_ptr(8);
1740
1741         int n_params;
1742         int i, j, n, temp;
1743
1744         reg_node_map_t *rm;
1745         const arch_register_t *fp_reg;
1746         ir_node *frame_pointer;
1747         ir_node *barrier;
1748         ir_node *reg_params_bl;
1749         ir_node **args;
1750         ir_node *arg_tuple;
1751         ir_node *value_param_base;
1752         const ir_edge_t *edge;
1753         ir_type *arg_type, *bet_type;
1754         lower_frame_sels_env_t ctx;
1755         ir_entity **param_map;
1756
1757         bitset_t *used_proj_nr;
1758         DEBUG_ONLY(firm_dbg_module_t *dbg = env->dbg;)
1759
1760         DBG((dbg, LEVEL_1, "introducing abi on %+F\n", irg));
1761
1762         /* Convert the Sel nodes in the irg to frame load/store/addr nodes. */
1763         ctx.env              = env;
1764         ctx.value_param_list = NULL;
1765         irg_walk_graph(irg, lower_frame_sels_walker, NULL, &ctx);
1766
1767         /* value_param_base anchor is not needed anymore now */
1768         value_param_base = get_irg_value_param_base(irg);
1769         be_kill_node(value_param_base);
1770         set_irg_value_param_base(irg, new_r_Bad(irg));
1771
1772         env->frame = obstack_alloc(&env->obst, sizeof(env->frame[0]));
1773         env->regs  = pmap_create();
1774
1775         used_proj_nr = bitset_alloca(1024);
1776         n_params     = get_method_n_params(method_type);
1777         args         = obstack_alloc(&env->obst, n_params * sizeof(args[0]));
1778         memset(args, 0, n_params * sizeof(args[0]));
1779
1780         /* Check if a value parameter is transmitted as a register.
1781          * This might happen if the address of an parameter is taken which is
1782          * transmitted in registers.
1783          *
1784          * Note that on some architectures this case must be handled specially
1785          * because the place of the backing store is determined by their ABI.
1786          *
1787          * In the default case we move the entity to the frame type and create
1788          * a backing store into the first block.
1789          */
1790         fix_address_of_parameter_access(env, ctx.value_param_list);
1791
1792         /* Fill the argument vector */
1793         arg_tuple = get_irg_args(irg);
1794         foreach_out_edge(arg_tuple, edge) {
1795                 ir_node *irn = get_edge_src_irn(edge);
1796                 int nr       = get_Proj_proj(irn);
1797                 args[nr]     = irn;
1798                 DBG((dbg, LEVEL_2, "\treading arg: %d -> %+F\n", nr, irn));
1799         }
1800
1801         arg_type = compute_arg_type(env, call, method_type, &param_map);
1802         bet_type = call->cb->get_between_type(env->cb);
1803         stack_frame_init(env->frame, arg_type, bet_type, get_irg_frame_type(irg), isa->stack_dir, param_map);
1804
1805         /* Count the register params and add them to the number of Projs for the RegParams node */
1806         for(i = 0; i < n_params; ++i) {
1807                 be_abi_call_arg_t *arg = get_call_arg(call, 0, i);
1808                 if(arg->in_reg && args[i]) {
1809                         assert(arg->reg != sp && "cannot use stack pointer as parameter register");
1810                         assert(i == get_Proj_proj(args[i]));
1811
1812                         /* For now, associate the register with the old Proj from Start representing that argument. */
1813                         pmap_insert(env->regs, (void *) arg->reg, args[i]);
1814                         bitset_set(used_proj_nr, i);
1815                         DBG((dbg, LEVEL_2, "\targ #%d -> reg %s\n", i, arg->reg->name));
1816                 }
1817         }
1818
1819         /* Collect all callee-save registers */
1820         for(i = 0, n = arch_isa_get_n_reg_class(isa); i < n; ++i) {
1821                 const arch_register_class_t *cls = arch_isa_get_reg_class(isa, i);
1822                 for(j = 0; j < cls->n_regs; ++j) {
1823                         const arch_register_t *reg = &cls->regs[j];
1824                         if(arch_register_type_is(reg, callee_save) ||
1825                                         arch_register_type_is(reg, state)) {
1826                                 pmap_insert(env->regs, (void *) reg, NULL);
1827                         }
1828                 }
1829         }
1830
1831         pmap_insert(env->regs, (void *) sp, NULL);
1832         pmap_insert(env->regs, (void *) isa->bp, NULL);
1833         reg_params_bl   = get_irg_start_block(irg);
1834         env->reg_params = be_new_RegParams(irg, reg_params_bl, pmap_count(env->regs));
1835         add_irn_dep(env->reg_params, get_irg_start(irg));
1836
1837         /*
1838          * make proj nodes for the callee save registers.
1839          * memorize them, since Return nodes get those as inputs.
1840          *
1841          * Note, that if a register corresponds to an argument, the regs map contains
1842          * the old Proj from start for that argument.
1843          */
1844
1845         rm = reg_map_to_arr(&env->obst, env->regs);
1846         for(i = 0, n = pmap_count(env->regs); i < n; ++i) {
1847                 arch_register_t *reg = (void *) rm[i].reg;
1848                 ir_mode *mode        = reg->reg_class->mode;
1849                 long nr              = i;
1850                 int pos              = BE_OUT_POS((int) nr);
1851                 int flags            = 0;
1852
1853                 ir_node *proj;
1854
1855                 assert(nr >= 0);
1856                 bitset_set(used_proj_nr, nr);
1857                 proj = new_r_Proj(irg, reg_params_bl, env->reg_params, mode, nr);
1858                 pmap_insert(env->regs, (void *) reg, proj);
1859                 be_set_constr_single_reg(env->reg_params, pos, reg);
1860                 arch_set_irn_register(env->birg->main_env->arch_env, proj, reg);
1861
1862                 /*
1863                  * If the register is an ignore register,
1864                  * The Proj for that register shall also be ignored during register allocation.
1865                  */
1866                 if(arch_register_type_is(reg, ignore))
1867                         flags |= arch_irn_flags_ignore;
1868
1869                 if(reg == sp)
1870                         flags |= arch_irn_flags_modify_sp;
1871
1872                 be_node_set_flags(env->reg_params, pos, flags);
1873
1874                 DBG((dbg, LEVEL_2, "\tregister save proj #%d -> reg %s\n", nr, reg->name));
1875         }
1876         obstack_free(&env->obst, rm);
1877
1878         /* create a new initial memory proj */
1879         assert(is_Proj(old_mem));
1880         new_mem_proj = new_r_Proj(irg, get_nodes_block(old_mem),
1881                                   new_r_Unknown(irg, mode_T), mode_M,
1882                                   get_Proj_proj(old_mem));
1883         mem = new_mem_proj;
1884
1885         /* Generate the Prologue */
1886         fp_reg  = call->cb->prologue(env->cb, &mem, env->regs);
1887
1888         /* do the stack allocation BEFORE the barrier, or spill code
1889            might be added before it */
1890         env->init_sp = be_abi_reg_map_get(env->regs, sp);
1891         env->init_sp = be_new_IncSP(sp, irg, bl, env->init_sp, BE_STACK_FRAME_SIZE_EXPAND);
1892         be_abi_reg_map_set(env->regs, sp, env->init_sp);
1893
1894         env->start_barrier = barrier = create_barrier(env, bl, &mem, env->regs, 0);
1895
1896         env->init_sp = be_abi_reg_map_get(env->regs, sp);
1897         arch_set_irn_register(env->birg->main_env->arch_env, env->init_sp, sp);
1898
1899         frame_pointer = be_abi_reg_map_get(env->regs, fp_reg);
1900         set_irg_frame(irg, frame_pointer);
1901         pset_insert_ptr(env->ignore_regs, fp_reg);
1902
1903         /* rewire old mem users to new mem */
1904         set_Proj_pred(new_mem_proj, get_Proj_pred(old_mem));
1905         exchange(old_mem, mem);
1906
1907         set_irg_initial_mem(irg, mem);
1908
1909         /* Now, introduce stack param nodes for all parameters passed on the stack */
1910         for(i = 0; i < n_params; ++i) {
1911                 ir_node *arg_proj = args[i];
1912                 ir_node *repl     = NULL;
1913
1914                 if(arg_proj != NULL) {
1915                         be_abi_call_arg_t *arg;
1916                         ir_type *param_type;
1917                         int nr = get_Proj_proj(arg_proj);
1918
1919                         nr         = MIN(nr, n_params);
1920                         arg        = get_call_arg(call, 0, nr);
1921                         param_type = get_method_param_type(method_type, nr);
1922
1923                         if(arg->in_reg) {
1924                                 repl = pmap_get(env->regs, (void *) arg->reg);
1925                         }
1926
1927                         else if(arg->on_stack) {
1928                                 /* For atomic parameters which are actually used, we create a StackParam node. */
1929                                 if(is_atomic_type(param_type) && get_irn_n_edges(args[i]) > 0) {
1930                                         ir_mode *mode                    = get_type_mode(param_type);
1931                                         const arch_register_class_t *cls = arch_isa_get_reg_class_for_mode(isa, mode);
1932                                         repl = be_new_StackParam(cls, isa->bp->reg_class, irg, reg_params_bl, mode, frame_pointer, arg->stack_ent);
1933                                 }
1934
1935                                 /* The stack parameter is not primitive (it is a struct or array),
1936                                 we thus will create a node representing the parameter's address
1937                                 on the stack. */
1938                                 else {
1939                                         repl = be_new_FrameAddr(sp->reg_class, irg, reg_params_bl, frame_pointer, arg->stack_ent);
1940                                 }
1941                         }
1942
1943                         assert(repl != NULL);
1944                         exchange(args[i], repl);
1945                 }
1946         }
1947
1948         /* the arg proj is not needed anymore now */
1949         assert(get_irn_n_edges(arg_tuple) == 0);
1950         be_kill_node(arg_tuple);
1951         set_irg_args(irg, new_rd_Bad(irg));
1952
1953         /* All Return nodes hang on the End node, so look for them there. */
1954         for (i = 0, n = get_Block_n_cfgpreds(end); i < n; ++i) {
1955                 ir_node *irn = get_Block_cfgpred(end, i);
1956
1957                 if (is_Return(irn)) {
1958                         ir_node *ret = create_be_return(env, irn, get_nodes_block(irn), get_Return_mem(irn), get_Return_n_ress(irn));
1959                         exchange(irn, ret);
1960                 }
1961         }
1962         /* if we have endless loops here, n might be <= 0. Do NOT create a be_Return then,
1963            the code is dead and will never be executed. */
1964
1965         del_pset(dont_save);
1966         obstack_free(&env->obst, args);
1967
1968         /* handle start block here (place a jump in the block) */
1969         temp = 0;
1970         irg_block_walk_graph(irg, fix_start_block, NULL, &temp);
1971 }
1972
1973 /** Fix the state inputs of calls that still hang on unknowns */
1974 static
1975 void fix_call_state_inputs(be_abi_irg_t *env)
1976 {
1977         const arch_isa_t *isa = env->isa;
1978         int i, n, n_states;
1979         arch_register_t **stateregs = NEW_ARR_F(arch_register_t*, 0);
1980
1981         /* Collect caller save registers */
1982         n = arch_isa_get_n_reg_class(isa);
1983         for(i = 0; i < n; ++i) {
1984                 int j;
1985                 const arch_register_class_t *cls = arch_isa_get_reg_class(isa, i);
1986                 for(j = 0; j < cls->n_regs; ++j) {
1987                         const arch_register_t *reg = arch_register_for_index(cls, j);
1988                         if(arch_register_type_is(reg, state)) {
1989                                 ARR_APP1(arch_register_t*, stateregs, (arch_register_t *)reg);
1990                         }
1991                 }
1992         }
1993
1994         n = ARR_LEN(env->calls);
1995         n_states = ARR_LEN(stateregs);
1996         for(i = 0; i < n; ++i) {
1997                 int s, arity;
1998                 ir_node *call = env->calls[i];
1999
2000                 arity = get_irn_arity(call);
2001
2002                 /* the statereg inputs are the last n inputs of the calls */
2003                 for(s = 0; s < n_states; ++s) {
2004                         int inp = arity - n_states + s;
2005                         const arch_register_t *reg = stateregs[s];
2006                         ir_node *regnode = be_abi_reg_map_get(env->regs, reg);
2007
2008                         set_irn_n(call, inp, regnode);
2009                 }
2010         }
2011 }
2012
2013 be_abi_irg_t *be_abi_introduce(be_irg_t *birg)
2014 {
2015         be_abi_irg_t *env  = xmalloc(sizeof(env[0]));
2016         ir_node *old_frame = get_irg_frame(birg->irg);
2017         ir_graph *irg      = birg->irg;
2018
2019         pmap_entry *ent;
2020         ir_node *dummy;
2021         optimization_state_t state;
2022         unsigned *limited_bitset;
2023
2024         be_omit_fp = birg->main_env->options->omit_fp;
2025
2026         obstack_init(&env->obst);
2027
2028         env->isa         = birg->main_env->arch_env->isa;
2029         env->method_type = get_entity_type(get_irg_entity(irg));
2030         env->call        = be_abi_call_new(env->isa->sp->reg_class);
2031         arch_isa_get_call_abi(env->isa, env->method_type, env->call);
2032
2033         env->ignore_regs  = pset_new_ptr_default();
2034         env->keep_map     = pmap_create();
2035         env->dce_survivor = new_survive_dce();
2036         env->birg         = birg;
2037
2038         env->sp_req.type    = arch_register_req_type_limited;
2039         env->sp_req.cls     = arch_register_get_class(env->isa->sp);
2040         limited_bitset      = rbitset_obstack_alloc(&env->obst, env->sp_req.cls->n_regs);
2041         rbitset_set(limited_bitset, arch_register_get_index(env->isa->sp));
2042         env->sp_req.limited = limited_bitset;
2043
2044         env->sp_cls_req.type  = arch_register_req_type_normal;
2045         env->sp_cls_req.cls   = arch_register_get_class(env->isa->sp);
2046
2047         /* Beware: later we replace this node by the real one, ensure it is not CSE'd
2048            to another Unknown or the stack pointer gets used */
2049         save_optimization_state(&state);
2050         set_optimize(0);
2051         env->init_sp = dummy  = new_r_Unknown(irg, env->isa->sp->reg_class->mode);
2052         restore_optimization_state(&state);
2053         FIRM_DBG_REGISTER(env->dbg, "firm.be.abi");
2054
2055         env->calls = NEW_ARR_F(ir_node*, 0);
2056
2057         /* Lower all call nodes in the IRG. */
2058         process_calls(env);
2059
2060         /*
2061                 Beware: init backend abi call object after processing calls,
2062                 otherwise some information might be not yet available.
2063         */
2064         env->cb = env->call->cb->init(env->call, birg->main_env->arch_env, irg);
2065
2066         /* Process the IRG */
2067         modify_irg(env);
2068
2069         /* fix call inputs for state registers */
2070         fix_call_state_inputs(env);
2071
2072         /* We don't need the keep map anymore. */
2073         pmap_destroy(env->keep_map);
2074
2075         /* calls array is not needed anymore */
2076         DEL_ARR_F(env->calls);
2077
2078         /* reroute the stack origin of the calls to the true stack origin. */
2079         exchange(dummy, env->init_sp);
2080         exchange(old_frame, get_irg_frame(irg));
2081
2082         /* Make some important node pointers survive the dead node elimination. */
2083         survive_dce_register_irn(env->dce_survivor, &env->init_sp);
2084         pmap_foreach(env->regs, ent) {
2085                 survive_dce_register_irn(env->dce_survivor, (ir_node **) &ent->value);
2086         }
2087
2088         env->call->cb->done(env->cb);
2089         env->cb = NULL;
2090         return env;
2091 }
2092
2093 void be_abi_free(be_abi_irg_t *env)
2094 {
2095         be_abi_call_free(env->call);
2096         free_survive_dce(env->dce_survivor);
2097         del_pset(env->ignore_regs);
2098         pmap_destroy(env->regs);
2099         obstack_free(&env->obst, NULL);
2100         free(env);
2101 }
2102
2103 void be_abi_put_ignore_regs(be_abi_irg_t *abi, const arch_register_class_t *cls, bitset_t *bs)
2104 {
2105         arch_register_t *reg;
2106
2107         for(reg = pset_first(abi->ignore_regs); reg; reg = pset_next(abi->ignore_regs))
2108                 if(reg->reg_class == cls)
2109                         bitset_set(bs, reg->index);
2110 }
2111
2112 /* Returns the stack layout from a abi environment. */
2113 const be_stack_layout_t *be_abi_get_stack_layout(const be_abi_irg_t *abi) {
2114         return abi->frame;
2115 }
2116
2117 /*
2118
2119   _____ _        ____  _             _
2120  |  ___(_)_  __ / ___|| |_ __ _  ___| | __
2121  | |_  | \ \/ / \___ \| __/ _` |/ __| |/ /
2122  |  _| | |>  <   ___) | || (_| | (__|   <
2123  |_|   |_/_/\_\ |____/ \__\__,_|\___|_|\_\
2124
2125 */
2126
2127 typedef ir_node **node_array;
2128
2129 typedef struct fix_stack_walker_env_t {
2130         node_array sp_nodes;
2131         const arch_env_t *arch_env;
2132 } fix_stack_walker_env_t;
2133
2134 /**
2135  * Walker. Collect all stack modifying nodes.
2136  */
2137 static void collect_stack_nodes_walker(ir_node *node, void *data)
2138 {
2139         fix_stack_walker_env_t *env = data;
2140
2141         if (arch_irn_is(env->arch_env, node, modify_sp)) {
2142                 assert(get_irn_mode(node) != mode_M && get_irn_mode(node) != mode_T);
2143                 ARR_APP1(ir_node*, env->sp_nodes, node);
2144         }
2145 }
2146
2147 void be_abi_fix_stack_nodes(be_abi_irg_t *env)
2148 {
2149         be_ssa_construction_env_t senv;
2150         int i, len;
2151         ir_node **phis;
2152         be_irg_t *birg = env->birg;
2153         be_lv_t *lv = be_get_birg_liveness(birg);
2154         fix_stack_walker_env_t walker_env;
2155         arch_isa_t *isa;
2156
2157         walker_env.sp_nodes = NEW_ARR_F(ir_node*, 0);
2158         walker_env.arch_env = birg->main_env->arch_env;
2159         isa = walker_env.arch_env->isa;
2160
2161         irg_walk_graph(birg->irg, collect_stack_nodes_walker, NULL, &walker_env);
2162
2163         /* nothing to be done if we didn't find any node, in fact we mustn't
2164          * continue, as for endless loops incsp might have had no users and is bad
2165          * now.
2166          */
2167         len = ARR_LEN(walker_env.sp_nodes);
2168         if(len == 0) {
2169                 DEL_ARR_F(walker_env.sp_nodes);
2170                 return;
2171         }
2172
2173         be_ssa_construction_init(&senv, birg);
2174         be_ssa_construction_add_copies(&senv, walker_env.sp_nodes,
2175                                    ARR_LEN(walker_env.sp_nodes));
2176         be_ssa_construction_fix_users_array(&senv, walker_env.sp_nodes,
2177                                       ARR_LEN(walker_env.sp_nodes));
2178
2179         if(lv != NULL) {
2180                 len = ARR_LEN(walker_env.sp_nodes);
2181                 for(i = 0; i < len; ++i) {
2182                         be_liveness_update(lv, walker_env.sp_nodes[i]);
2183                 }
2184                 be_ssa_construction_update_liveness_phis(&senv, lv);
2185         }
2186
2187         phis = be_ssa_construction_get_new_phis(&senv);
2188
2189         /* set register requirements for stack phis */
2190         len = ARR_LEN(phis);
2191         for(i = 0; i < len; ++i) {
2192                 ir_node *phi = phis[i];
2193                 be_set_phi_reg_req(walker_env.arch_env, phi, &env->sp_req);
2194                 be_set_phi_flags(walker_env.arch_env, phi, arch_irn_flags_ignore | arch_irn_flags_modify_sp);
2195                 arch_set_irn_register(walker_env.arch_env, phi, env->isa->sp);
2196         }
2197         be_ssa_construction_destroy(&senv);
2198
2199         DEL_ARR_F(walker_env.sp_nodes);
2200 }
2201
2202 static int process_stack_bias(be_abi_irg_t *env, ir_node *bl, int bias)
2203 {
2204         const arch_env_t *arch_env = env->birg->main_env->arch_env;
2205         int omit_fp            = env->call->flags.bits.try_omit_fp;
2206         ir_node *irn;
2207
2208         sched_foreach(bl, irn) {
2209
2210                 /*
2211                    Check, if the node relates to an entity on the stack frame.
2212                    If so, set the true offset (including the bias) for that
2213                    node.
2214                  */
2215                 ir_entity *ent = arch_get_frame_entity(arch_env, irn);
2216                 if(ent) {
2217                         int offset = get_stack_entity_offset(env->frame, ent, bias);
2218                         arch_set_frame_offset(arch_env, irn, offset);
2219                         DBG((env->dbg, LEVEL_2, "%F has offset %d (including bias %d)\n", ent, offset, bias));
2220                 }
2221
2222                 /*
2223                    If the node modifies the stack pointer by a constant offset,
2224                    record that in the bias.
2225                  */
2226                 if(arch_irn_is(arch_env, irn, modify_sp)) {
2227                         int ofs = arch_get_sp_bias(arch_env, irn);
2228
2229                         if(be_is_IncSP(irn)) {
2230                                 if(ofs == BE_STACK_FRAME_SIZE_EXPAND) {
2231                                         ofs = get_type_size_bytes(get_irg_frame_type(env->birg->irg));
2232                                         be_set_IncSP_offset(irn, ofs);
2233                                 } else if(ofs == BE_STACK_FRAME_SIZE_SHRINK) {
2234                                         ofs = - get_type_size_bytes(get_irg_frame_type(env->birg->irg));
2235                                         be_set_IncSP_offset(irn, ofs);
2236                                 }
2237                         }
2238
2239                         if(omit_fp)
2240                                 bias += ofs;
2241                 }
2242         }
2243
2244         return bias;
2245 }
2246
2247 /**
2248  * A helper struct for the bias walker.
2249  */
2250 struct bias_walk {
2251         be_abi_irg_t *env;     /**< The ABI irg environment. */
2252         int start_block_bias;  /**< The bias at the end of the start block. */
2253         ir_node *start_block;  /**< The start block of the current graph. */
2254 };
2255
2256 /**
2257  * Block-Walker: fix all stack offsets
2258  */
2259 static void stack_bias_walker(ir_node *bl, void *data)
2260 {
2261         struct bias_walk *bw = data;
2262         if (bl != bw->start_block) {
2263                 process_stack_bias(bw->env, bl, bw->start_block_bias);
2264         }
2265 }
2266
2267 void be_abi_fix_stack_bias(be_abi_irg_t *env)
2268 {
2269         ir_graph *irg  = env->birg->irg;
2270         struct bias_walk bw;
2271
2272         stack_frame_compute_initial_offset(env->frame);
2273         // stack_layout_dump(stdout, env->frame);
2274
2275         /* Determine the stack bias at the end of the start block. */
2276         bw.start_block_bias = process_stack_bias(env, get_irg_start_block(irg), 0);
2277
2278         /* fix the bias is all other blocks */
2279         bw.env = env;
2280         bw.start_block = get_irg_start_block(irg);
2281         irg_block_walk_graph(irg, stack_bias_walker, NULL, &bw);
2282 }
2283
2284 ir_node *be_abi_get_callee_save_irn(be_abi_irg_t *abi, const arch_register_t *reg)
2285 {
2286         assert(arch_register_type_is(reg, callee_save));
2287         assert(pmap_contains(abi->regs, (void *) reg));
2288         return pmap_get(abi->regs, (void *) reg);
2289 }
2290
2291 ir_node *be_abi_get_ignore_irn(be_abi_irg_t *abi, const arch_register_t *reg)
2292 {
2293         assert(arch_register_type_is(reg, ignore));
2294         assert(pmap_contains(abi->regs, (void *) reg));
2295         return pmap_get(abi->regs, (void *) reg);
2296 }
2297
2298 ir_node *be_abi_get_start_barrier(be_abi_irg_t *abi)
2299 {
2300         return abi->start_barrier;
2301 }
2302
2303 /**
2304  * Returns non-zero if the ABI has omitted the frame pointer in
2305  * the current graph.
2306  */
2307 int be_abi_omit_fp(const be_abi_irg_t *abi) {
2308         return abi->call->flags.bits.try_omit_fp;
2309 }