Fix beabi call sorting
[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 barrier.
1229  */
1230 static ir_node *create_barrier(ir_node *bl, ir_node **mem, pmap *regs,
1231                                int in_req)
1232 {
1233         int             n_regs = pmap_count(regs);
1234         int             n;
1235         ir_node        *irn;
1236         ir_node       **in;
1237         reg_node_map_t *rm;
1238
1239         in = ALLOCAN(ir_node*, n_regs+1);
1240         rm = ALLOCAN(reg_node_map_t, n_regs);
1241         reg_map_to_arr(rm, regs);
1242         for (n = 0; n < n_regs; ++n) {
1243                 in[n] = rm[n].irn;
1244         }
1245
1246         if (mem) {
1247                 in[n++] = *mem;
1248         }
1249
1250         irn = be_new_Barrier(bl, n, in);
1251
1252         for (n = 0; n < n_regs; ++n) {
1253                 ir_node                  *pred     = rm[n].irn;
1254                 const arch_register_t    *reg      = rm[n].reg;
1255                 arch_register_req_type_t  add_type = arch_register_req_type_none;
1256                 ir_node                  *proj;
1257                 const backend_info_t     *info;
1258
1259                 /* stupid workaround for now... as not all nodes report register
1260                  * requirements. */
1261                 info = be_get_info(skip_Proj(pred));
1262                 if (info != NULL && info->out_infos != NULL) {
1263                         const arch_register_req_t *ireq = arch_get_register_req_out(pred);
1264                         if (ireq->type & arch_register_req_type_ignore)
1265                                 add_type |= arch_register_req_type_ignore;
1266                         if (ireq->type & arch_register_req_type_produces_sp)
1267                                 add_type |= arch_register_req_type_produces_sp;
1268                 }
1269
1270                 proj = new_r_Proj(irn, get_irn_mode(pred), n);
1271                 be_node_set_reg_class_in(irn, n, reg->reg_class);
1272                 if (in_req) {
1273                         be_set_constr_single_reg_in(irn, n, reg,
1274                                                     arch_register_req_type_none);
1275                 }
1276                 be_set_constr_single_reg_out(irn, n, reg, add_type);
1277                 arch_set_irn_register(proj, reg);
1278
1279                 pmap_insert(regs, (void *) reg, proj);
1280         }
1281
1282         if (mem) {
1283                 *mem = new_r_Proj(irn, mode_M, n);
1284         }
1285
1286         return irn;
1287 }
1288
1289 /**
1290  * Creates a be_Return for a Return node.
1291  *
1292  * @param @env    the abi environment
1293  * @param irn     the Return node or NULL if there was none
1294  * @param bl      the block where the be_Retun should be placed
1295  * @param mem     the current memory
1296  * @param n_res   number of return results
1297  */
1298 static ir_node *create_be_return(be_abi_irg_t *env, ir_node *irn, ir_node *bl,
1299                 ir_node *mem, int n_res)
1300 {
1301         be_abi_call_t    *call     = env->call;
1302         ir_graph         *irg      = get_Block_irg(bl);
1303         const arch_env_t *arch_env = be_get_irg_arch_env(irg);
1304         dbg_info *dbgi;
1305         pmap *reg_map  = pmap_create();
1306         ir_node *keep  = (ir_node*)pmap_get(env->keep_map, bl);
1307         size_t in_max;
1308         ir_node *ret;
1309         int i, n;
1310         unsigned pop;
1311         ir_node **in;
1312         ir_node *stack;
1313         const arch_register_t **regs;
1314         pmap_entry *ent;
1315
1316         /*
1317                 get the valid stack node in this block.
1318                 If we had a call in that block there is a Keep constructed by process_calls()
1319                 which points to the last stack modification in that block. we'll use
1320                 it then. Else we use the stack from the start block and let
1321                 the ssa construction fix the usage.
1322         */
1323         stack = be_abi_reg_map_get(env->regs, arch_env->sp);
1324         if (keep) {
1325                 stack = get_irn_n(keep, 0);
1326                 kill_node(keep);
1327                 remove_End_keepalive(get_irg_end(irg), keep);
1328         }
1329
1330         /* Insert results for Return into the register map. */
1331         for (i = 0; i < n_res; ++i) {
1332                 ir_node *res           = get_Return_res(irn, i);
1333                 be_abi_call_arg_t *arg = get_call_arg(call, 1, i, 1);
1334                 assert(arg->in_reg && "return value must be passed in register");
1335                 pmap_insert(reg_map, (void *) arg->reg, res);
1336         }
1337
1338         /* Add uses of the callee save registers. */
1339         foreach_pmap(env->regs, ent) {
1340                 const arch_register_t *reg = (const arch_register_t*)ent->key;
1341                 if (reg->type & (arch_register_type_callee_save | arch_register_type_ignore))
1342                         pmap_insert(reg_map, ent->key, ent->value);
1343         }
1344
1345         be_abi_reg_map_set(reg_map, arch_env->sp, stack);
1346
1347         /* Make the Epilogue node and call the arch's epilogue maker. */
1348         create_barrier(bl, &mem, reg_map, 1);
1349         call->cb->epilogue(env->cb, bl, &mem, reg_map);
1350
1351         /*
1352                 Maximum size of the in array for Return nodes is
1353                 return args + callee save/ignore registers + memory + stack pointer
1354         */
1355         in_max = pmap_count(reg_map) + n_res + 2;
1356
1357         in   = ALLOCAN(ir_node*,               in_max);
1358         regs = ALLOCAN(arch_register_t const*, in_max);
1359
1360         in[0]   = mem;
1361         in[1]   = be_abi_reg_map_get(reg_map, arch_env->sp);
1362         regs[0] = NULL;
1363         regs[1] = arch_env->sp;
1364         n       = 2;
1365
1366         /* clear SP entry, since it has already been grown. */
1367         pmap_insert(reg_map, (void *) arch_env->sp, NULL);
1368         for (i = 0; i < n_res; ++i) {
1369                 be_abi_call_arg_t *arg = get_call_arg(call, 1, i, 1);
1370
1371                 in[n]     = be_abi_reg_map_get(reg_map, arg->reg);
1372                 regs[n++] = arg->reg;
1373
1374                 /* Clear the map entry to mark the register as processed. */
1375                 be_abi_reg_map_set(reg_map, arg->reg, NULL);
1376         }
1377
1378         /* grow the rest of the stuff. */
1379         foreach_pmap(reg_map, ent) {
1380                 if (ent->value) {
1381                         in[n]     = (ir_node*)ent->value;
1382                         regs[n++] = (const arch_register_t*)ent->key;
1383                 }
1384         }
1385
1386         /* The in array for the new back end return is now ready. */
1387         if (irn != NULL) {
1388                 dbgi = get_irn_dbg_info(irn);
1389         } else {
1390                 dbgi = NULL;
1391         }
1392         /* we have to pop the shadow parameter in in case of struct returns */
1393         pop = call->pop;
1394         ret = be_new_Return(dbgi, irg, bl, n_res, pop, n, in);
1395
1396         /* Set the register classes of the return's parameter accordingly. */
1397         for (i = 0; i < n; ++i) {
1398                 if (regs[i] == NULL)
1399                         continue;
1400
1401                 be_node_set_reg_class_in(ret, i, regs[i]->reg_class);
1402         }
1403
1404         /* Free the space of the Epilog's in array and the register <-> proj map. */
1405         pmap_destroy(reg_map);
1406
1407         return ret;
1408 }
1409
1410 typedef struct ent_pos_pair ent_pos_pair;
1411 struct ent_pos_pair {
1412         ir_entity    *ent;   /**< a value param entity */
1413         int          pos;    /**< its parameter number */
1414         ent_pos_pair *next;  /**< for linking */
1415 };
1416
1417 typedef struct lower_frame_sels_env_t {
1418         ent_pos_pair *value_param_list;          /**< the list of all value param entities */
1419         ir_node      *frame;                     /**< the current frame */
1420         const arch_register_class_t *sp_class;   /**< register class of the stack pointer */
1421         const arch_register_class_t *link_class; /**< register class of the link pointer */
1422         ir_type      *value_tp;                  /**< the value type if any */
1423         ir_type      *frame_tp;                  /**< the frame type */
1424         int          static_link_pos;            /**< argument number of the hidden static link */
1425 } lower_frame_sels_env_t;
1426
1427 /**
1428  * Return an entity from the backend for an value param entity.
1429  *
1430  * @param ent  an value param type entity
1431  * @param ctx  context
1432  */
1433 static ir_entity *get_argument_entity(ir_entity *ent, lower_frame_sels_env_t *ctx)
1434 {
1435         ir_entity *argument_ent = (ir_entity*)get_entity_link(ent);
1436
1437         if (argument_ent == NULL) {
1438                 /* we have NO argument entity yet: This is bad, as we will
1439                 * need one for backing store.
1440                 * Create one here.
1441                 */
1442                 ir_type *frame_tp = ctx->frame_tp;
1443                 unsigned offset   = get_type_size_bytes(frame_tp);
1444                 ir_type  *tp      = get_entity_type(ent);
1445                 unsigned align    = get_type_alignment_bytes(tp);
1446
1447                 offset += align - 1;
1448                 offset &= ~(align - 1);
1449
1450                 argument_ent = copy_entity_own(ent, frame_tp);
1451
1452                 /* must be automatic to set a fixed layout */
1453                 set_entity_offset(argument_ent, offset);
1454                 offset += get_type_size_bytes(tp);
1455
1456                 set_type_size_bytes(frame_tp, offset);
1457                 set_entity_link(ent, argument_ent);
1458         }
1459         return argument_ent;
1460 }
1461 /**
1462  * Walker: Replaces Sels of frame type and
1463  * value param type entities by FrameAddress.
1464  * Links all used entities.
1465  */
1466 static void lower_frame_sels_walker(ir_node *irn, void *data)
1467 {
1468         lower_frame_sels_env_t *ctx = (lower_frame_sels_env_t*)data;
1469
1470         if (is_Sel(irn)) {
1471                 ir_node *ptr = get_Sel_ptr(irn);
1472
1473                 if (ptr == ctx->frame) {
1474                         ir_entity    *ent = get_Sel_entity(irn);
1475                         ir_node      *bl  = get_nodes_block(irn);
1476                         ir_node      *nw;
1477                         int          pos = 0;
1478                         int          is_value_param = 0;
1479
1480                         if (get_entity_owner(ent) == ctx->value_tp) {
1481                                 is_value_param = 1;
1482
1483                                 /* replace by its copy from the argument type */
1484                                 pos = get_struct_member_index(ctx->value_tp, ent);
1485                                 ent = get_argument_entity(ent, ctx);
1486                         }
1487
1488                         nw = be_new_FrameAddr(ctx->sp_class, bl, ctx->frame, ent);
1489                         exchange(irn, nw);
1490
1491                         /* check, if it's a param Sel and if have not seen this entity before */
1492                         if (is_value_param && get_entity_link(ent) == NULL) {
1493                                 ent_pos_pair pair;
1494
1495                                 pair.ent  = ent;
1496                                 pair.pos  = pos;
1497                                 pair.next = NULL;
1498                                 ARR_APP1(ent_pos_pair, ctx->value_param_list, pair);
1499                                 /* just a mark */
1500                                 set_entity_link(ent, ctx->value_param_list);
1501                         }
1502                 }
1503         }
1504 }
1505
1506 /**
1507  * Check if a value parameter is transmitted as a register.
1508  * This might happen if the address of an parameter is taken which is
1509  * transmitted in registers.
1510  *
1511  * Note that on some architectures this case must be handled specially
1512  * because the place of the backing store is determined by their ABI.
1513  *
1514  * In the default case we move the entity to the frame type and create
1515  * a backing store into the first block.
1516  */
1517 static void fix_address_of_parameter_access(be_abi_irg_t *env, ir_graph *irg,
1518                                             ent_pos_pair *value_param_list)
1519 {
1520         be_abi_call_t    *call     = env->call;
1521         const arch_env_t *arch_env = be_get_irg_arch_env(irg);
1522         ent_pos_pair  *entry, *new_list;
1523         ir_type       *frame_tp;
1524         int           i, n = ARR_LEN(value_param_list);
1525
1526         new_list = NULL;
1527         for (i = 0; i < n; ++i) {
1528                 int               pos  = value_param_list[i].pos;
1529                 be_abi_call_arg_t *arg = get_call_arg(call, 0, pos, 1);
1530
1531                 if (arg->in_reg) {
1532                         DBG((dbg, LEVEL_2, "\targ #%d need backing store\n", pos));
1533                         value_param_list[i].next = new_list;
1534                         new_list = &value_param_list[i];
1535                 }
1536         }
1537         if (new_list != NULL) {
1538                 /* ok, change the graph */
1539                 ir_node *start_bl = get_irg_start_block(irg);
1540                 ir_node *first_bl = get_first_block_succ(start_bl);
1541                 ir_node *frame, *imem, *nmem, *store, *mem, *args;
1542                 optimization_state_t state;
1543                 unsigned offset;
1544
1545                 assert(first_bl && first_bl != start_bl);
1546                 /* we had already removed critical edges, so the following
1547                    assertion should be always true. */
1548                 assert(get_Block_n_cfgpreds(first_bl) == 1);
1549
1550                 /* now create backing stores */
1551                 frame = get_irg_frame(irg);
1552                 imem = get_irg_initial_mem(irg);
1553
1554                 save_optimization_state(&state);
1555                 set_optimize(0);
1556                 nmem = new_r_Proj(get_irg_start(irg), mode_M, pn_Start_M);
1557                 restore_optimization_state(&state);
1558
1559                 /* reroute all edges to the new memory source */
1560                 edges_reroute(imem, nmem, irg);
1561
1562                 store   = NULL;
1563                 mem     = imem;
1564                 args    = get_irg_args(irg);
1565                 for (entry = new_list; entry != NULL; entry = entry->next) {
1566                         int     i     = entry->pos;
1567                         ir_type *tp   = get_entity_type(entry->ent);
1568                         ir_mode *mode = get_type_mode(tp);
1569                         ir_node *addr;
1570
1571                         /* address for the backing store */
1572                         addr = be_new_FrameAddr(arch_env->sp->reg_class, first_bl, frame, entry->ent);
1573
1574                         if (store)
1575                                 mem = new_r_Proj(store, mode_M, pn_Store_M);
1576
1577                         /* the backing store itself */
1578                         store = new_r_Store(first_bl, mem, addr,
1579                                             new_r_Proj(args, mode, i), cons_none);
1580                 }
1581                 /* the new memory Proj gets the last Proj from store */
1582                 set_Proj_pred(nmem, store);
1583                 set_Proj_proj(nmem, pn_Store_M);
1584
1585                 /* move all entities to the frame type */
1586                 frame_tp = get_irg_frame_type(irg);
1587                 offset   = get_type_size_bytes(frame_tp);
1588
1589                 /* we will add new entities: set the layout to undefined */
1590                 assert(get_type_state(frame_tp) == layout_fixed);
1591                 set_type_state(frame_tp, layout_undefined);
1592                 for (entry = new_list; entry != NULL; entry = entry->next) {
1593                         ir_entity *ent = entry->ent;
1594
1595                         /* If the entity is still on the argument type, move it to the
1596                          * frame type.
1597                          * This happens if the value_param type was build due to compound
1598                          * params. */
1599                         if (get_entity_owner(ent) != frame_tp) {
1600                                 ir_type  *tp   = get_entity_type(ent);
1601                                 unsigned align = get_type_alignment_bytes(tp);
1602
1603                                 offset += align - 1;
1604                                 offset &= ~(align - 1);
1605                                 set_entity_owner(ent, frame_tp);
1606                                 /* must be automatic to set a fixed layout */
1607                                 set_entity_offset(ent, offset);
1608                                 offset += get_type_size_bytes(tp);
1609                         }
1610                 }
1611                 set_type_size_bytes(frame_tp, offset);
1612                 /* fix the layout again */
1613                 set_type_state(frame_tp, layout_fixed);
1614         }
1615 }
1616
1617 /**
1618  * The start block has no jump, instead it has an initial exec Proj.
1619  * The backend wants to handle all blocks the same way, so we replace
1620  * the out cfg edge with a real jump.
1621  */
1622 static void fix_start_block(ir_graph *irg)
1623 {
1624         ir_node         *initial_X   = get_irg_initial_exec(irg);
1625         ir_node         *start_block = get_irg_start_block(irg);
1626         const ir_edge_t *edge;
1627
1628         assert(is_Proj(initial_X));
1629
1630         foreach_out_edge(initial_X, edge) {
1631                 ir_node *block = get_edge_src_irn(edge);
1632
1633                 if (is_Anchor(block))
1634                         continue;
1635                 if (block != start_block) {
1636                         ir_node *jmp = new_r_Jmp(start_block);
1637                         set_Block_cfgpred(block, get_edge_src_pos(edge), jmp);
1638                         set_irg_initial_exec(irg, jmp);
1639                         return;
1640                 }
1641         }
1642         panic("Initial exec has no follow block in %+F", irg);
1643 }
1644
1645 /**
1646  * Update the entity of Sels to the outer value parameters.
1647  */
1648 static void update_outer_frame_sels(ir_node *irn, void *env)
1649 {
1650         lower_frame_sels_env_t *ctx = (lower_frame_sels_env_t*)env;
1651         ir_node                *ptr;
1652         ir_entity              *ent;
1653         int                    pos = 0;
1654
1655         if (! is_Sel(irn))
1656                 return;
1657         ptr = get_Sel_ptr(irn);
1658         if (! is_arg_Proj(ptr))
1659                 return;
1660         if (get_Proj_proj(ptr) != ctx->static_link_pos)
1661                 return;
1662         ent   = get_Sel_entity(irn);
1663
1664         if (get_entity_owner(ent) == ctx->value_tp) {
1665                 /* replace by its copy from the argument type */
1666                 pos = get_struct_member_index(ctx->value_tp, ent);
1667                 ent = get_argument_entity(ent, ctx);
1668                 set_Sel_entity(irn, ent);
1669
1670                 /* check, if we have not seen this entity before */
1671                 if (get_entity_link(ent) == NULL) {
1672                         ent_pos_pair pair;
1673
1674                         pair.ent  = ent;
1675                         pair.pos  = pos;
1676                         pair.next = NULL;
1677                         ARR_APP1(ent_pos_pair, ctx->value_param_list, pair);
1678                         /* just a mark */
1679                         set_entity_link(ent, ctx->value_param_list);
1680                 }
1681         }
1682 }
1683
1684 /**
1685  * Fix access to outer local variables.
1686  */
1687 static void fix_outer_variable_access(be_abi_irg_t *env,
1688                                       lower_frame_sels_env_t *ctx)
1689 {
1690         int      i;
1691         ir_graph *irg;
1692         (void) env;
1693
1694         for (i = get_class_n_members(ctx->frame_tp) - 1; i >= 0; --i) {
1695                 ir_entity *ent = get_class_member(ctx->frame_tp, i);
1696
1697                 if (! is_method_entity(ent))
1698                         continue;
1699
1700                 irg = get_entity_irg(ent);
1701                 if (irg == NULL)
1702                         continue;
1703
1704                 /*
1705                  * FIXME: find the number of the static link parameter
1706                  * for now we assume 0 here
1707                  */
1708                 ctx->static_link_pos = 0;
1709
1710                 irg_walk_graph(irg, NULL, update_outer_frame_sels, ctx);
1711         }
1712 }
1713
1714 /**
1715  * Modify the irg itself and the frame type.
1716  */
1717 static void modify_irg(ir_graph *irg)
1718 {
1719         be_abi_irg_t          *env          = be_get_irg_abi(irg);
1720         be_abi_call_t         *call         = env->call;
1721         const arch_env_t      *arch_env     = be_get_irg_arch_env(irg);
1722         const arch_register_t *sp           = arch_env->sp;
1723         ir_type               *method_type  = get_entity_type(get_irg_entity(irg));
1724         be_irg_t              *birg         = be_birg_from_irg(irg);
1725         struct obstack        *obst         = be_get_be_obst(irg);
1726         be_stack_layout_t     *stack_layout = be_get_irg_stack_layout(irg);
1727         ir_node *end;
1728         ir_node *old_mem;
1729         ir_node *new_mem_proj;
1730         ir_node *mem;
1731
1732         int n_params;
1733         int i, n;
1734         unsigned j;
1735         unsigned frame_size;
1736
1737         reg_node_map_t *rm;
1738         const arch_register_t *fp_reg;
1739         ir_node *frame_pointer;
1740         ir_node *start_bl;
1741         ir_node **args;
1742         ir_node *arg_tuple;
1743         const ir_edge_t *edge;
1744         ir_type *arg_type, *bet_type, *tp;
1745         lower_frame_sels_env_t ctx;
1746         ir_entity **param_map;
1747
1748         DBG((dbg, LEVEL_1, "introducing abi on %+F\n", irg));
1749
1750         /* Must fetch memory here, otherwise the start Barrier gets the wrong
1751          * memory, which leads to loops in the DAG. */
1752         old_mem = get_irg_initial_mem(irg);
1753
1754         irp_reserve_resources(irp, IR_RESOURCE_ENTITY_LINK);
1755
1756         /* set the links of all frame entities to NULL, we use it
1757            to detect if an entity is already linked in the value_param_list */
1758         tp = get_method_value_param_type(method_type);
1759         ctx.value_tp = tp;
1760         if (tp != NULL) {
1761                 /* clear the links of the clone type, let the
1762                    original entities point to its clones */
1763                 for (i = get_struct_n_members(tp) - 1; i >= 0; --i) {
1764                         ir_entity *mem  = get_struct_member(tp, i);
1765                         set_entity_link(mem, NULL);
1766                 }
1767         }
1768
1769         arg_type = compute_arg_type(env, irg, call, method_type, tp, &param_map);
1770
1771         /* Convert the Sel nodes in the irg to frame addr nodes: */
1772         ctx.value_param_list = NEW_ARR_F(ent_pos_pair, 0);
1773         ctx.frame            = get_irg_frame(irg);
1774         ctx.sp_class         = arch_env->sp->reg_class;
1775         ctx.link_class       = arch_env->link_class;
1776         ctx.frame_tp         = get_irg_frame_type(irg);
1777
1778         /* layout the stackframe now */
1779         if (get_type_state(ctx.frame_tp) == layout_undefined) {
1780                 default_layout_compound_type(ctx.frame_tp);
1781         }
1782
1783         /* we will possible add new entities to the frame: set the layout to undefined */
1784         assert(get_type_state(ctx.frame_tp) == layout_fixed);
1785         set_type_state(ctx.frame_tp, layout_undefined);
1786
1787         irg_walk_graph(irg, lower_frame_sels_walker, NULL, &ctx);
1788
1789         /* fix the frame type layout again */
1790         set_type_state(ctx.frame_tp, layout_fixed);
1791         /* align stackframe to 4 byte */
1792         frame_size = get_type_size_bytes(ctx.frame_tp);
1793         if (frame_size % 4 != 0) {
1794                 set_type_size_bytes(ctx.frame_tp, frame_size + 4 - (frame_size % 4));
1795         }
1796
1797         env->regs  = pmap_create();
1798
1799         n_params = get_method_n_params(method_type);
1800         args     = OALLOCNZ(obst, ir_node*, n_params);
1801
1802         /*
1803          * for inner function we must now fix access to outer frame entities.
1804          */
1805         fix_outer_variable_access(env, &ctx);
1806
1807         /* Check if a value parameter is transmitted as a register.
1808          * This might happen if the address of an parameter is taken which is
1809          * transmitted in registers.
1810          *
1811          * Note that on some architectures this case must be handled specially
1812          * because the place of the backing store is determined by their ABI.
1813          *
1814          * In the default case we move the entity to the frame type and create
1815          * a backing store into the first block.
1816          */
1817         fix_address_of_parameter_access(env, irg, ctx.value_param_list);
1818
1819         DEL_ARR_F(ctx.value_param_list);
1820         irp_free_resources(irp, IR_RESOURCE_ENTITY_LINK);
1821
1822         /* Fill the argument vector */
1823         arg_tuple = get_irg_args(irg);
1824         foreach_out_edge(arg_tuple, edge) {
1825                 ir_node *irn = get_edge_src_irn(edge);
1826                 if (! is_Anchor(irn)) {
1827                         int nr       = get_Proj_proj(irn);
1828                         args[nr]     = irn;
1829                         DBG((dbg, LEVEL_2, "\treading arg: %d -> %+F\n", nr, irn));
1830                 }
1831         }
1832
1833         bet_type = call->cb->get_between_type(env->cb);
1834         stack_frame_init(stack_layout, arg_type, bet_type,
1835                          get_irg_frame_type(irg), arch_env->stack_dir, param_map);
1836         stack_layout->sp_relative = call->flags.bits.try_omit_fp;
1837
1838         /* Count the register params and add them to the number of Projs for the RegParams node */
1839         for (i = 0; i < n_params; ++i) {
1840                 be_abi_call_arg_t *arg = get_call_arg(call, 0, i, 1);
1841                 if (arg->in_reg && args[i]) {
1842                         assert(arg->reg != sp && "cannot use stack pointer as parameter register");
1843                         assert(i == get_Proj_proj(args[i]));
1844
1845                         /* For now, associate the register with the old Proj from Start representing that argument. */
1846                         pmap_insert(env->regs, (void *) arg->reg, args[i]);
1847                         DBG((dbg, LEVEL_2, "\targ #%d -> reg %s\n", i, arg->reg->name));
1848                 }
1849         }
1850
1851         /* Collect all callee-save registers */
1852         for (i = 0, n = arch_env->n_register_classes; i < n; ++i) {
1853                 const arch_register_class_t *cls = &arch_env->register_classes[i];
1854                 for (j = 0; j < cls->n_regs; ++j) {
1855                         const arch_register_t *reg = &cls->regs[j];
1856                         if (reg->type & (arch_register_type_callee_save | arch_register_type_state)) {
1857                                 pmap_insert(env->regs, (void *) reg, NULL);
1858                         }
1859                 }
1860         }
1861
1862         /* handle start block here (place a jump in the block) */
1863         fix_start_block(irg);
1864
1865         pmap_insert(env->regs, (void *) sp, NULL);
1866         pmap_insert(env->regs, (void *) arch_env->bp, NULL);
1867         start_bl   = get_irg_start_block(irg);
1868         env->start = be_new_Start(NULL, start_bl, pmap_count(env->regs) + 1);
1869
1870         /*
1871          * make proj nodes for the callee save registers.
1872          * memorize them, since Return nodes get those as inputs.
1873          *
1874          * Note, that if a register corresponds to an argument, the regs map contains
1875          * the old Proj from start for that argument.
1876          */
1877
1878         rm = ALLOCAN(reg_node_map_t, pmap_count(env->regs));
1879         reg_map_to_arr(rm, env->regs);
1880         for (i = 0, n = pmap_count(env->regs); i < n; ++i) {
1881                 const arch_register_t    *reg      = rm[i].reg;
1882                 ir_mode                  *mode     = reg->reg_class->mode;
1883                 long                      nr       = i;
1884                 arch_register_req_type_t  add_type = arch_register_req_type_none;
1885                 ir_node                  *proj;
1886
1887                 if (reg == sp)
1888                         add_type |= arch_register_req_type_produces_sp | arch_register_req_type_ignore;
1889
1890                 assert(nr >= 0);
1891                 proj = new_r_Proj(env->start, mode, nr + 1);
1892                 pmap_insert(env->regs, (void *) reg, proj);
1893                 be_set_constr_single_reg_out(env->start, nr + 1, reg, add_type);
1894                 arch_set_irn_register(proj, reg);
1895
1896                 DBG((dbg, LEVEL_2, "\tregister save proj #%d -> reg %s\n", nr, reg->name));
1897         }
1898
1899         /* create a new initial memory proj */
1900         assert(is_Proj(old_mem));
1901         arch_set_out_register_req(env->start, 0, arch_no_register_req);
1902         new_mem_proj = new_r_Proj(env->start, mode_M, 0);
1903         mem = new_mem_proj;
1904         set_irg_initial_mem(irg, mem);
1905
1906         /* Generate the Prologue */
1907         fp_reg = call->cb->prologue(env->cb, &mem, env->regs, &stack_layout->initial_bias);
1908
1909         /* do the stack allocation BEFORE the barrier, or spill code
1910            might be added before it */
1911         env->init_sp = be_abi_reg_map_get(env->regs, sp);
1912         env->init_sp = be_new_IncSP(sp, start_bl, env->init_sp, BE_STACK_FRAME_SIZE_EXPAND, 0);
1913         be_abi_reg_map_set(env->regs, sp, env->init_sp);
1914
1915         create_barrier(start_bl, &mem, env->regs, 0);
1916
1917         env->init_sp = be_abi_reg_map_get(env->regs, sp);
1918         arch_set_irn_register(env->init_sp, sp);
1919
1920         frame_pointer = be_abi_reg_map_get(env->regs, fp_reg);
1921         set_irg_frame(irg, frame_pointer);
1922         rbitset_clear(birg->allocatable_regs, fp_reg->global_index);
1923
1924         /* rewire old mem users to new mem */
1925         exchange(old_mem, mem);
1926
1927         /* keep the mem (for functions with an endless loop = no return) */
1928         keep_alive(mem);
1929
1930         set_irg_initial_mem(irg, mem);
1931
1932         /* Now, introduce stack param nodes for all parameters passed on the stack */
1933         for (i = 0; i < n_params; ++i) {
1934                 ir_node *arg_proj = args[i];
1935                 ir_node *repl     = NULL;
1936
1937                 if (arg_proj != NULL) {
1938                         be_abi_call_arg_t *arg;
1939                         ir_type *param_type;
1940                         int     nr = get_Proj_proj(arg_proj);
1941                         ir_mode *mode;
1942
1943                         nr         = MIN(nr, n_params);
1944                         arg        = get_call_arg(call, 0, nr, 1);
1945                         param_type = get_method_param_type(method_type, nr);
1946
1947                         if (arg->in_reg) {
1948                                 repl = (ir_node*)pmap_get(env->regs, arg->reg);
1949                         } else if (arg->on_stack) {
1950                                 ir_node *addr = be_new_FrameAddr(sp->reg_class, start_bl, frame_pointer, arg->stack_ent);
1951
1952                                 /* For atomic parameters which are actually used, we create a Load node. */
1953                                 if (is_atomic_type(param_type) && get_irn_n_edges(args[i]) > 0) {
1954                                         ir_mode *mode      = get_type_mode(param_type);
1955                                         ir_mode *load_mode = arg->load_mode;
1956
1957                                         ir_node *load = new_r_Load(start_bl, new_r_NoMem(irg), addr, load_mode, cons_floats);
1958                                         repl = new_r_Proj(load, load_mode, pn_Load_res);
1959
1960                                         if (mode != load_mode) {
1961                                                 repl = new_r_Conv(start_bl, repl, mode);
1962                                         }
1963                                 } else {
1964                                         /* The stack parameter is not primitive (it is a struct or array),
1965                                          * we thus will create a node representing the parameter's address
1966                                          * on the stack. */
1967                                         repl = addr;
1968                                 }
1969                         }
1970
1971                         assert(repl != NULL);
1972
1973                         /* Beware: the mode of the register parameters is always the mode of the register class
1974                            which may be wrong. Add Conv's then. */
1975                         mode = get_irn_mode(args[i]);
1976                         if (mode != get_irn_mode(repl)) {
1977                                 repl = new_r_Conv(get_nodes_block(repl), repl, mode);
1978                         }
1979                         exchange(args[i], repl);
1980                 }
1981         }
1982
1983         /* the arg proj is not needed anymore now and should be only used by the anchor */
1984         assert(get_irn_n_edges(arg_tuple) == 1);
1985         kill_node(arg_tuple);
1986         set_irg_args(irg, new_r_Bad(irg));
1987
1988         /* All Return nodes hang on the End node, so look for them there. */
1989         end = get_irg_end_block(irg);
1990         for (i = 0, n = get_Block_n_cfgpreds(end); i < n; ++i) {
1991                 ir_node *irn = get_Block_cfgpred(end, i);
1992
1993                 if (is_Return(irn)) {
1994                         ir_node *blk = get_nodes_block(irn);
1995                         ir_node *mem = get_Return_mem(irn);
1996                         ir_node *ret = create_be_return(env, irn, blk, mem, get_Return_n_ress(irn));
1997                         exchange(irn, ret);
1998                 }
1999         }
2000
2001         /* if we have endless loops here, n might be <= 0. Do NOT create a be_Return then,
2002            the code is dead and will never be executed. */
2003 }
2004
2005 /** Fix the state inputs of calls that still hang on unknowns */
2006 static void fix_call_state_inputs(ir_graph *irg)
2007 {
2008         be_abi_irg_t     *env      = be_get_irg_abi(irg);
2009         const arch_env_t *arch_env = be_get_irg_arch_env(irg);
2010         int i, n, n_states;
2011         arch_register_t **stateregs = NEW_ARR_F(arch_register_t*, 0);
2012
2013         /* Collect caller save registers */
2014         n = arch_env->n_register_classes;
2015         for (i = 0; i < n; ++i) {
2016                 unsigned j;
2017                 const arch_register_class_t *cls = &arch_env->register_classes[i];
2018                 for (j = 0; j < cls->n_regs; ++j) {
2019                         const arch_register_t *reg = arch_register_for_index(cls, j);
2020                         if (reg->type & arch_register_type_state) {
2021                                 ARR_APP1(arch_register_t*, stateregs, (arch_register_t *)reg);
2022                         }
2023                 }
2024         }
2025
2026         n = ARR_LEN(env->calls);
2027         n_states = ARR_LEN(stateregs);
2028         for (i = 0; i < n; ++i) {
2029                 int s, arity;
2030                 ir_node *call = env->calls[i];
2031
2032                 arity = get_irn_arity(call);
2033
2034                 /* the state reg inputs are the last n inputs of the calls */
2035                 for (s = 0; s < n_states; ++s) {
2036                         int inp = arity - n_states + s;
2037                         const arch_register_t *reg = stateregs[s];
2038                         ir_node *regnode = be_abi_reg_map_get(env->regs, reg);
2039
2040                         set_irn_n(call, inp, regnode);
2041                 }
2042         }
2043
2044         DEL_ARR_F(stateregs);
2045 }
2046
2047 /**
2048  * Create a trampoline entity for the given method.
2049  */
2050 static ir_entity *create_trampoline(be_main_env_t *be, ir_entity *method)
2051 {
2052         ir_type   *type   = get_entity_type(method);
2053         ident     *old_id = get_entity_ld_ident(method);
2054         ident     *id     = id_mangle3("", old_id, "$stub");
2055         ir_type   *parent = be->pic_trampolines_type;
2056         ir_entity *ent    = new_entity(parent, old_id, type);
2057         set_entity_ld_ident(ent, id);
2058         set_entity_visibility(ent, ir_visibility_private);
2059
2060         return ent;
2061 }
2062
2063 /**
2064  * Returns the trampoline entity for the given method.
2065  */
2066 static ir_entity *get_trampoline(be_main_env_t *env, ir_entity *method)
2067 {
2068         ir_entity *result = (ir_entity*)pmap_get(env->ent_trampoline_map, method);
2069         if (result == NULL) {
2070                 result = create_trampoline(env, method);
2071                 pmap_insert(env->ent_trampoline_map, method, result);
2072         }
2073
2074         return result;
2075 }
2076
2077 static ir_entity *create_pic_symbol(be_main_env_t *be, ir_entity *entity)
2078 {
2079         ident     *old_id = get_entity_ld_ident(entity);
2080         ident     *id     = id_mangle3("", old_id, "$non_lazy_ptr");
2081         ir_type   *e_type = get_entity_type(entity);
2082         ir_type   *type   = new_type_pointer(e_type);
2083         ir_type   *parent = be->pic_symbols_type;
2084         ir_entity *ent    = new_entity(parent, old_id, type);
2085         set_entity_ld_ident(ent, id);
2086         set_entity_visibility(ent, ir_visibility_private);
2087
2088         return ent;
2089 }
2090
2091 static ir_entity *get_pic_symbol(be_main_env_t *env, ir_entity *entity)
2092 {
2093         ir_entity *result = (ir_entity*)pmap_get(env->ent_pic_symbol_map, entity);
2094         if (result == NULL) {
2095                 result = create_pic_symbol(env, entity);
2096                 pmap_insert(env->ent_pic_symbol_map, entity, result);
2097         }
2098
2099         return result;
2100 }
2101
2102
2103
2104 /**
2105  * Returns non-zero if a given entity can be accessed using a relative address.
2106  */
2107 static int can_address_relative(ir_entity *entity)
2108 {
2109         return get_entity_visibility(entity) != ir_visibility_external
2110                 && !(get_entity_linkage(entity) & IR_LINKAGE_MERGE);
2111 }
2112
2113 static ir_node *get_pic_base(ir_graph *irg)
2114 {
2115         const arch_env_t *arch_env = be_get_irg_arch_env(irg);
2116         if (arch_env->impl->get_pic_base == NULL)
2117                 return NULL;
2118         return arch_env->impl->get_pic_base(irg);
2119 }
2120
2121 /** patches SymConsts to work in position independent code */
2122 static void fix_pic_symconsts(ir_node *node, void *data)
2123 {
2124         ir_graph         *irg = get_irn_irg(node);
2125         be_main_env_t    *be  = be_get_irg_main_env(irg);
2126         ir_node          *pic_base;
2127         ir_node          *add;
2128         ir_node          *block;
2129         ir_mode          *mode;
2130         ir_node          *load;
2131         ir_node          *load_res;
2132         int               arity, i;
2133         (void) data;
2134
2135         arity = get_irn_arity(node);
2136         for (i = 0; i < arity; ++i) {
2137                 dbg_info  *dbgi;
2138                 ir_node   *pred = get_irn_n(node, i);
2139                 ir_entity *entity;
2140                 ir_entity *pic_symbol;
2141                 ir_node   *pic_symconst;
2142
2143                 if (!is_SymConst(pred))
2144                         continue;
2145
2146                 entity = get_SymConst_entity(pred);
2147                 block  = get_nodes_block(pred);
2148
2149                 /* calls can jump to relative addresses, so we can directly jump to
2150                    the (relatively) known call address or the trampoline */
2151                 if (i == 1 && is_Call(node)) {
2152                         ir_entity *trampoline;
2153                         ir_node   *trampoline_const;
2154
2155                         if (can_address_relative(entity))
2156                                 continue;
2157
2158                         dbgi             = get_irn_dbg_info(pred);
2159                         trampoline       = get_trampoline(be, entity);
2160                         trampoline_const = new_rd_SymConst_addr_ent(dbgi, irg, mode_P_code,
2161                                                                     trampoline);
2162                         set_irn_n(node, i, trampoline_const);
2163                         continue;
2164                 }
2165
2166                 /* everything else is accessed relative to EIP */
2167                 mode     = get_irn_mode(pred);
2168                 pic_base = get_pic_base(irg);
2169
2170                 /* all ok now for locally constructed stuff */
2171                 if (can_address_relative(entity)) {
2172                         ir_node *add = new_r_Add(block, pic_base, pred, mode);
2173
2174                         /* make sure the walker doesn't visit this add again */
2175                         mark_irn_visited(add);
2176                         set_irn_n(node, i, add);
2177                         continue;
2178                 }
2179
2180                 /* get entry from pic symbol segment */
2181                 dbgi         = get_irn_dbg_info(pred);
2182                 pic_symbol   = get_pic_symbol(be, entity);
2183                 pic_symconst = new_rd_SymConst_addr_ent(dbgi, irg, mode_P_code,
2184                                                         pic_symbol);
2185                 add = new_r_Add(block, pic_base, pic_symconst, mode);
2186                 mark_irn_visited(add);
2187
2188                 /* we need an extra indirection for global data outside our current
2189                    module. The loads are always safe and can therefore float
2190                    and need no memory input */
2191                 load     = new_r_Load(block, new_r_NoMem(irg), add, mode, cons_floats);
2192                 load_res = new_r_Proj(load, mode, pn_Load_res);
2193
2194                 set_irn_n(node, i, load_res);
2195         }
2196 }
2197
2198 be_abi_irg_t *be_abi_introduce(ir_graph *irg)
2199 {
2200         be_abi_irg_t     *env         = XMALLOCZ(be_abi_irg_t);
2201         ir_node          *old_frame   = get_irg_frame(irg);
2202         be_options_t     *options     = be_get_irg_options(irg);
2203         const arch_env_t *arch_env    = be_get_irg_arch_env(irg);
2204         ir_entity        *entity      = get_irg_entity(irg);
2205         ir_type          *method_type = get_entity_type(entity);
2206         be_irg_t         *birg        = be_birg_from_irg(irg);
2207         struct obstack   *obst        = &birg->obst;
2208         unsigned          r;
2209
2210         pmap_entry *ent;
2211         ir_node *dummy;
2212
2213         /* determine allocatable registers */
2214         assert(birg->allocatable_regs == NULL);
2215         birg->allocatable_regs = rbitset_obstack_alloc(obst, arch_env->n_registers);
2216         for (r = 0; r < arch_env->n_registers; ++r) {
2217                 const arch_register_t *reg = &arch_env->registers[r];
2218                 if ( !(reg->type & arch_register_type_ignore)) {
2219                         rbitset_set(birg->allocatable_regs, r);
2220                 }
2221         }
2222
2223         /* break here if backend provides a custom API.
2224          * Note: we shouldn't have to setup any be_abi_irg_t* stuff at all,
2225          * but need more cleanup to make this work
2226          */
2227         be_set_irg_abi(irg, env);
2228
2229         be_omit_fp      = options->omit_fp;
2230
2231         env->dce_survivor = new_survive_dce();
2232         env->keep_map     = pmap_create();
2233         env->call         = be_abi_call_new(arch_env->sp->reg_class);
2234         arch_env_get_call_abi(arch_env, method_type, env->call);
2235
2236         env->init_sp = dummy = new_r_Dummy(irg, arch_env->sp->reg_class->mode);
2237         env->calls   = NEW_ARR_F(ir_node*, 0);
2238
2239         if (options->pic) {
2240                 irg_walk_graph(irg, fix_pic_symconsts, NULL, env);
2241         }
2242
2243         /* Lower all call nodes in the IRG. */
2244         process_calls(irg);
2245
2246         /*
2247                 Beware: init backend abi call object after processing calls,
2248                 otherwise some information might be not yet available.
2249         */
2250         env->cb = env->call->cb->init(env->call, irg);
2251
2252         /* Process the IRG */
2253         modify_irg(irg);
2254
2255         /* fix call inputs for state registers */
2256         fix_call_state_inputs(irg);
2257
2258         /* We don't need the keep map anymore. */
2259         pmap_destroy(env->keep_map);
2260         env->keep_map = NULL;
2261
2262         /* calls array is not needed anymore */
2263         DEL_ARR_F(env->calls);
2264         env->calls = NULL;
2265
2266         /* reroute the stack origin of the calls to the true stack origin. */
2267         exchange(dummy, env->init_sp);
2268         exchange(old_frame, get_irg_frame(irg));
2269
2270         /* Make some important node pointers survive the dead node elimination. */
2271         survive_dce_register_irn(env->dce_survivor, &env->init_sp);
2272         foreach_pmap(env->regs, ent) {
2273                 survive_dce_register_irn(env->dce_survivor, (ir_node **) &ent->value);
2274         }
2275
2276         env->call->cb->done(env->cb);
2277         env->cb = NULL;
2278         return env;
2279 }
2280
2281 void be_abi_free(ir_graph *irg)
2282 {
2283         be_abi_irg_t *env = be_get_irg_abi(irg);
2284
2285         if (env->call != NULL)
2286                 be_abi_call_free(env->call);
2287         if (env->dce_survivor != NULL)
2288                 free_survive_dce(env->dce_survivor);
2289         if (env->regs != NULL)
2290                 pmap_destroy(env->regs);
2291         free(env);
2292
2293         be_set_irg_abi(irg, NULL);
2294 }
2295
2296 void be_put_allocatable_regs(const ir_graph *irg,
2297                              const arch_register_class_t *cls, bitset_t *bs)
2298 {
2299         be_irg_t *birg             = be_birg_from_irg(irg);
2300         unsigned *allocatable_regs = birg->allocatable_regs;
2301         unsigned  i;
2302
2303         assert(bitset_size(bs) == cls->n_regs);
2304         bitset_clear_all(bs);
2305         for (i = 0; i < cls->n_regs; ++i) {
2306                 const arch_register_t *reg = &cls->regs[i];
2307                 if (rbitset_is_set(allocatable_regs, reg->global_index))
2308                         bitset_set(bs, i);
2309         }
2310 }
2311
2312 unsigned be_get_n_allocatable_regs(const ir_graph *irg,
2313                                    const arch_register_class_t *cls)
2314 {
2315         bitset_t *bs = bitset_alloca(cls->n_regs);
2316         be_put_allocatable_regs(irg, cls, bs);
2317         return bitset_popcount(bs);
2318 }
2319
2320 void be_set_allocatable_regs(const ir_graph *irg,
2321                              const arch_register_class_t *cls,
2322                              unsigned *raw_bitset)
2323 {
2324         be_irg_t *birg             = be_birg_from_irg(irg);
2325         unsigned *allocatable_regs = birg->allocatable_regs;
2326         unsigned  i;
2327
2328         rbitset_clear_all(raw_bitset, cls->n_regs);
2329         for (i = 0; i < cls->n_regs; ++i) {
2330                 const arch_register_t *reg = &cls->regs[i];
2331                 if (rbitset_is_set(allocatable_regs, reg->global_index))
2332                         rbitset_set(raw_bitset, i);
2333         }
2334 }
2335
2336 ir_node *be_abi_get_callee_save_irn(be_abi_irg_t *abi, const arch_register_t *reg)
2337 {
2338         assert(reg->type & arch_register_type_callee_save);
2339         assert(pmap_contains(abi->regs, (void *) reg));
2340         return (ir_node*)pmap_get(abi->regs, (void *) reg);
2341 }
2342
2343 ir_node *be_abi_get_ignore_irn(be_abi_irg_t *abi, const arch_register_t *reg)
2344 {
2345         assert(reg->type & arch_register_type_ignore);
2346         assert(pmap_contains(abi->regs, (void *) reg));
2347         return (ir_node*)pmap_get(abi->regs, (void *) reg);
2348 }
2349
2350 BE_REGISTER_MODULE_CONSTRUCTOR(be_init_abi);
2351 void be_init_abi(void)
2352 {
2353         FIRM_DBG_REGISTER(dbg, "firm.be.abi");
2354 }