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