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