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