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