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