beabi: simplify fix_start_block, avoid links to replaced nodes through anchors
[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         ir_node *jmp         = new_r_Jmp(start_block);
1627
1628         assert(is_Proj(initial_X));
1629         exchange(initial_X, jmp);
1630         set_irg_initial_exec(irg, new_r_Bad(irg));
1631 }
1632
1633 /**
1634  * Update the entity of Sels to the outer value parameters.
1635  */
1636 static void update_outer_frame_sels(ir_node *irn, void *env)
1637 {
1638         lower_frame_sels_env_t *ctx = (lower_frame_sels_env_t*)env;
1639         ir_node                *ptr;
1640         ir_entity              *ent;
1641         int                    pos = 0;
1642
1643         if (! is_Sel(irn))
1644                 return;
1645         ptr = get_Sel_ptr(irn);
1646         if (! is_arg_Proj(ptr))
1647                 return;
1648         if (get_Proj_proj(ptr) != ctx->static_link_pos)
1649                 return;
1650         ent   = get_Sel_entity(irn);
1651
1652         if (get_entity_owner(ent) == ctx->value_tp) {
1653                 /* replace by its copy from the argument type */
1654                 pos = get_struct_member_index(ctx->value_tp, ent);
1655                 ent = get_argument_entity(ent, ctx);
1656                 set_Sel_entity(irn, ent);
1657
1658                 /* check, if we have not seen this entity before */
1659                 if (get_entity_link(ent) == NULL) {
1660                         ent_pos_pair pair;
1661
1662                         pair.ent  = ent;
1663                         pair.pos  = pos;
1664                         pair.next = NULL;
1665                         ARR_APP1(ent_pos_pair, ctx->value_param_list, pair);
1666                         /* just a mark */
1667                         set_entity_link(ent, ctx->value_param_list);
1668                 }
1669         }
1670 }
1671
1672 /**
1673  * Fix access to outer local variables.
1674  */
1675 static void fix_outer_variable_access(be_abi_irg_t *env,
1676                                       lower_frame_sels_env_t *ctx)
1677 {
1678         int      i;
1679         ir_graph *irg;
1680         (void) env;
1681
1682         for (i = get_class_n_members(ctx->frame_tp) - 1; i >= 0; --i) {
1683                 ir_entity *ent = get_class_member(ctx->frame_tp, i);
1684
1685                 if (! is_method_entity(ent))
1686                         continue;
1687
1688                 irg = get_entity_irg(ent);
1689                 if (irg == NULL)
1690                         continue;
1691
1692                 /*
1693                  * FIXME: find the number of the static link parameter
1694                  * for now we assume 0 here
1695                  */
1696                 ctx->static_link_pos = 0;
1697
1698                 irg_walk_graph(irg, NULL, update_outer_frame_sels, ctx);
1699         }
1700 }
1701
1702 /**
1703  * Modify the irg itself and the frame type.
1704  */
1705 static void modify_irg(ir_graph *irg)
1706 {
1707         be_abi_irg_t          *env          = be_get_irg_abi(irg);
1708         be_abi_call_t         *call         = env->call;
1709         const arch_env_t      *arch_env     = be_get_irg_arch_env(irg);
1710         const arch_register_t *sp           = arch_env->sp;
1711         ir_type               *method_type  = get_entity_type(get_irg_entity(irg));
1712         be_irg_t              *birg         = be_birg_from_irg(irg);
1713         struct obstack        *obst         = be_get_be_obst(irg);
1714         be_stack_layout_t     *stack_layout = be_get_irg_stack_layout(irg);
1715         ir_node *end;
1716         ir_node *old_mem;
1717         ir_node *new_mem_proj;
1718         ir_node *mem;
1719
1720         int n_params;
1721         int i, n;
1722         unsigned j;
1723         unsigned frame_size;
1724
1725         reg_node_map_t *rm;
1726         const arch_register_t *fp_reg;
1727         ir_node *frame_pointer;
1728         ir_node *start_bl;
1729         ir_node **args;
1730         ir_node *arg_tuple;
1731         const ir_edge_t *edge;
1732         ir_type *arg_type, *bet_type, *tp;
1733         lower_frame_sels_env_t ctx;
1734         ir_entity **param_map;
1735
1736         DBG((dbg, LEVEL_1, "introducing abi on %+F\n", irg));
1737
1738         /* Must fetch memory here, otherwise the start Barrier gets the wrong
1739          * memory, which leads to loops in the DAG. */
1740         old_mem = get_irg_initial_mem(irg);
1741
1742         irp_reserve_resources(irp, IR_RESOURCE_ENTITY_LINK);
1743
1744         /* set the links of all frame entities to NULL, we use it
1745            to detect if an entity is already linked in the value_param_list */
1746         tp = get_method_value_param_type(method_type);
1747         ctx.value_tp = tp;
1748         if (tp != NULL) {
1749                 /* clear the links of the clone type, let the
1750                    original entities point to its clones */
1751                 for (i = get_struct_n_members(tp) - 1; i >= 0; --i) {
1752                         ir_entity *mem  = get_struct_member(tp, i);
1753                         set_entity_link(mem, NULL);
1754                 }
1755         }
1756
1757         arg_type = compute_arg_type(env, irg, call, method_type, tp, &param_map);
1758
1759         /* Convert the Sel nodes in the irg to frame addr nodes: */
1760         ctx.value_param_list = NEW_ARR_F(ent_pos_pair, 0);
1761         ctx.frame            = get_irg_frame(irg);
1762         ctx.sp_class         = arch_env->sp->reg_class;
1763         ctx.link_class       = arch_env->link_class;
1764         ctx.frame_tp         = get_irg_frame_type(irg);
1765
1766         /* layout the stackframe now */
1767         if (get_type_state(ctx.frame_tp) == layout_undefined) {
1768                 default_layout_compound_type(ctx.frame_tp);
1769         }
1770
1771         /* we will possible add new entities to the frame: set the layout to undefined */
1772         assert(get_type_state(ctx.frame_tp) == layout_fixed);
1773         set_type_state(ctx.frame_tp, layout_undefined);
1774
1775         irg_walk_graph(irg, lower_frame_sels_walker, NULL, &ctx);
1776
1777         /* fix the frame type layout again */
1778         set_type_state(ctx.frame_tp, layout_fixed);
1779         /* align stackframe to 4 byte */
1780         frame_size = get_type_size_bytes(ctx.frame_tp);
1781         if (frame_size % 4 != 0) {
1782                 set_type_size_bytes(ctx.frame_tp, frame_size + 4 - (frame_size % 4));
1783         }
1784
1785         env->regs  = pmap_create();
1786
1787         n_params = get_method_n_params(method_type);
1788         args     = OALLOCNZ(obst, ir_node*, n_params);
1789
1790         /*
1791          * for inner function we must now fix access to outer frame entities.
1792          */
1793         fix_outer_variable_access(env, &ctx);
1794
1795         /* Check if a value parameter is transmitted as a register.
1796          * This might happen if the address of an parameter is taken which is
1797          * transmitted in registers.
1798          *
1799          * Note that on some architectures this case must be handled specially
1800          * because the place of the backing store is determined by their ABI.
1801          *
1802          * In the default case we move the entity to the frame type and create
1803          * a backing store into the first block.
1804          */
1805         fix_address_of_parameter_access(env, irg, ctx.value_param_list);
1806
1807         DEL_ARR_F(ctx.value_param_list);
1808         irp_free_resources(irp, IR_RESOURCE_ENTITY_LINK);
1809
1810         /* Fill the argument vector */
1811         arg_tuple = get_irg_args(irg);
1812         foreach_out_edge(arg_tuple, edge) {
1813                 ir_node *irn = get_edge_src_irn(edge);
1814                 if (! is_Anchor(irn)) {
1815                         int nr       = get_Proj_proj(irn);
1816                         args[nr]     = irn;
1817                         DBG((dbg, LEVEL_2, "\treading arg: %d -> %+F\n", nr, irn));
1818                 }
1819         }
1820
1821         bet_type = call->cb->get_between_type(env->cb);
1822         stack_frame_init(stack_layout, arg_type, bet_type,
1823                          get_irg_frame_type(irg), arch_env->stack_dir, param_map);
1824         stack_layout->sp_relative = call->flags.bits.try_omit_fp;
1825
1826         /* Count the register params and add them to the number of Projs for the RegParams node */
1827         for (i = 0; i < n_params; ++i) {
1828                 be_abi_call_arg_t *arg = get_call_arg(call, 0, i, 1);
1829                 if (arg->in_reg && args[i]) {
1830                         assert(arg->reg != sp && "cannot use stack pointer as parameter register");
1831                         assert(i == get_Proj_proj(args[i]));
1832
1833                         /* For now, associate the register with the old Proj from Start representing that argument. */
1834                         pmap_insert(env->regs, (void *) arg->reg, args[i]);
1835                         DBG((dbg, LEVEL_2, "\targ #%d -> reg %s\n", i, arg->reg->name));
1836                 }
1837         }
1838
1839         /* Collect all callee-save registers */
1840         for (i = 0, n = arch_env->n_register_classes; i < n; ++i) {
1841                 const arch_register_class_t *cls = &arch_env->register_classes[i];
1842                 for (j = 0; j < cls->n_regs; ++j) {
1843                         const arch_register_t *reg = &cls->regs[j];
1844                         if (reg->type & (arch_register_type_callee_save | arch_register_type_state)) {
1845                                 pmap_insert(env->regs, (void *) reg, NULL);
1846                         }
1847                 }
1848         }
1849
1850         /* handle start block here (place a jump in the block) */
1851         fix_start_block(irg);
1852
1853         pmap_insert(env->regs, (void *) sp, NULL);
1854         pmap_insert(env->regs, (void *) arch_env->bp, NULL);
1855         start_bl   = get_irg_start_block(irg);
1856         env->start = be_new_Start(NULL, start_bl, pmap_count(env->regs) + 1);
1857         set_irg_start(irg, env->start);
1858
1859         /*
1860          * make proj nodes for the callee save registers.
1861          * memorize them, since Return nodes get those as inputs.
1862          *
1863          * Note, that if a register corresponds to an argument, the regs map contains
1864          * the old Proj from start for that argument.
1865          */
1866
1867         rm = ALLOCAN(reg_node_map_t, pmap_count(env->regs));
1868         reg_map_to_arr(rm, env->regs);
1869         for (i = 0, n = pmap_count(env->regs); i < n; ++i) {
1870                 const arch_register_t    *reg      = rm[i].reg;
1871                 ir_mode                  *mode     = reg->reg_class->mode;
1872                 long                      nr       = i;
1873                 arch_register_req_type_t  add_type = arch_register_req_type_none;
1874                 ir_node                  *proj;
1875
1876                 if (reg == sp)
1877                         add_type |= arch_register_req_type_produces_sp | arch_register_req_type_ignore;
1878
1879                 assert(nr >= 0);
1880                 proj = new_r_Proj(env->start, mode, nr + 1);
1881                 pmap_insert(env->regs, (void *) reg, proj);
1882                 be_set_constr_single_reg_out(env->start, nr + 1, reg, add_type);
1883                 arch_set_irn_register(proj, reg);
1884
1885                 DBG((dbg, LEVEL_2, "\tregister save proj #%d -> reg %s\n", nr, reg->name));
1886         }
1887
1888         /* create a new initial memory proj */
1889         assert(is_Proj(old_mem));
1890         arch_set_out_register_req(env->start, 0, arch_no_register_req);
1891         new_mem_proj = new_r_Proj(env->start, mode_M, 0);
1892         mem = new_mem_proj;
1893         set_irg_initial_mem(irg, mem);
1894
1895         /* Generate the Prologue */
1896         fp_reg = call->cb->prologue(env->cb, &mem, env->regs, &stack_layout->initial_bias);
1897
1898         /* do the stack allocation BEFORE the barrier, or spill code
1899            might be added before it */
1900         env->init_sp = be_abi_reg_map_get(env->regs, sp);
1901         env->init_sp = be_new_IncSP(sp, start_bl, env->init_sp, BE_STACK_FRAME_SIZE_EXPAND, 0);
1902         be_abi_reg_map_set(env->regs, sp, env->init_sp);
1903
1904         create_barrier(start_bl, &mem, env->regs, 0);
1905
1906         env->init_sp = be_abi_reg_map_get(env->regs, sp);
1907         arch_set_irn_register(env->init_sp, sp);
1908
1909         frame_pointer = be_abi_reg_map_get(env->regs, fp_reg);
1910         set_irg_frame(irg, frame_pointer);
1911         rbitset_clear(birg->allocatable_regs, fp_reg->global_index);
1912
1913         /* rewire old mem users to new mem */
1914         exchange(old_mem, mem);
1915
1916         /* keep the mem (for functions with an endless loop = no return) */
1917         keep_alive(mem);
1918
1919         set_irg_initial_mem(irg, mem);
1920
1921         /* Now, introduce stack param nodes for all parameters passed on the stack */
1922         for (i = 0; i < n_params; ++i) {
1923                 ir_node *arg_proj = args[i];
1924                 ir_node *repl     = NULL;
1925
1926                 if (arg_proj != NULL) {
1927                         be_abi_call_arg_t *arg;
1928                         ir_type *param_type;
1929                         int     nr = get_Proj_proj(arg_proj);
1930                         ir_mode *mode;
1931
1932                         nr         = MIN(nr, n_params);
1933                         arg        = get_call_arg(call, 0, nr, 1);
1934                         param_type = get_method_param_type(method_type, nr);
1935
1936                         if (arg->in_reg) {
1937                                 repl = (ir_node*)pmap_get(env->regs, arg->reg);
1938                         } else if (arg->on_stack) {
1939                                 ir_node *addr = be_new_FrameAddr(sp->reg_class, start_bl, frame_pointer, arg->stack_ent);
1940
1941                                 /* For atomic parameters which are actually used, we create a Load node. */
1942                                 if (is_atomic_type(param_type) && get_irn_n_edges(args[i]) > 0) {
1943                                         ir_mode *mode      = get_type_mode(param_type);
1944                                         ir_mode *load_mode = arg->load_mode;
1945
1946                                         ir_node *load = new_r_Load(start_bl, new_r_NoMem(irg), addr, load_mode, cons_floats);
1947                                         repl = new_r_Proj(load, load_mode, pn_Load_res);
1948
1949                                         if (mode != load_mode) {
1950                                                 repl = new_r_Conv(start_bl, repl, mode);
1951                                         }
1952                                 } else {
1953                                         /* The stack parameter is not primitive (it is a struct or array),
1954                                          * we thus will create a node representing the parameter's address
1955                                          * on the stack. */
1956                                         repl = addr;
1957                                 }
1958                         }
1959
1960                         assert(repl != NULL);
1961
1962                         /* Beware: the mode of the register parameters is always the mode of the register class
1963                            which may be wrong. Add Conv's then. */
1964                         mode = get_irn_mode(args[i]);
1965                         if (mode != get_irn_mode(repl)) {
1966                                 repl = new_r_Conv(get_nodes_block(repl), repl, mode);
1967                         }
1968                         exchange(args[i], repl);
1969                 }
1970         }
1971
1972         /* the arg proj is not needed anymore now and should be only used by the anchor */
1973         assert(get_irn_n_edges(arg_tuple) == 1);
1974         kill_node(arg_tuple);
1975         set_irg_args(irg, new_r_Bad(irg));
1976
1977         /* All Return nodes hang on the End node, so look for them there. */
1978         end = get_irg_end_block(irg);
1979         for (i = 0, n = get_Block_n_cfgpreds(end); i < n; ++i) {
1980                 ir_node *irn = get_Block_cfgpred(end, i);
1981
1982                 if (is_Return(irn)) {
1983                         ir_node *blk = get_nodes_block(irn);
1984                         ir_node *mem = get_Return_mem(irn);
1985                         ir_node *ret = create_be_return(env, irn, blk, mem, get_Return_n_ress(irn));
1986                         exchange(irn, ret);
1987                 }
1988         }
1989
1990         /* if we have endless loops here, n might be <= 0. Do NOT create a be_Return then,
1991            the code is dead and will never be executed. */
1992 }
1993
1994 /** Fix the state inputs of calls that still hang on unknowns */
1995 static void fix_call_state_inputs(ir_graph *irg)
1996 {
1997         be_abi_irg_t     *env      = be_get_irg_abi(irg);
1998         const arch_env_t *arch_env = be_get_irg_arch_env(irg);
1999         int i, n, n_states;
2000         arch_register_t **stateregs = NEW_ARR_F(arch_register_t*, 0);
2001
2002         /* Collect caller save registers */
2003         n = arch_env->n_register_classes;
2004         for (i = 0; i < n; ++i) {
2005                 unsigned j;
2006                 const arch_register_class_t *cls = &arch_env->register_classes[i];
2007                 for (j = 0; j < cls->n_regs; ++j) {
2008                         const arch_register_t *reg = arch_register_for_index(cls, j);
2009                         if (reg->type & arch_register_type_state) {
2010                                 ARR_APP1(arch_register_t*, stateregs, (arch_register_t *)reg);
2011                         }
2012                 }
2013         }
2014
2015         n = ARR_LEN(env->calls);
2016         n_states = ARR_LEN(stateregs);
2017         for (i = 0; i < n; ++i) {
2018                 int s, arity;
2019                 ir_node *call = env->calls[i];
2020
2021                 arity = get_irn_arity(call);
2022
2023                 /* the state reg inputs are the last n inputs of the calls */
2024                 for (s = 0; s < n_states; ++s) {
2025                         int inp = arity - n_states + s;
2026                         const arch_register_t *reg = stateregs[s];
2027                         ir_node *regnode = be_abi_reg_map_get(env->regs, reg);
2028
2029                         set_irn_n(call, inp, regnode);
2030                 }
2031         }
2032
2033         DEL_ARR_F(stateregs);
2034 }
2035
2036 /**
2037  * Create a trampoline entity for the given method.
2038  */
2039 static ir_entity *create_trampoline(be_main_env_t *be, ir_entity *method)
2040 {
2041         ir_type   *type   = get_entity_type(method);
2042         ident     *old_id = get_entity_ld_ident(method);
2043         ident     *id     = id_mangle3("", old_id, "$stub");
2044         ir_type   *parent = be->pic_trampolines_type;
2045         ir_entity *ent    = new_entity(parent, old_id, type);
2046         set_entity_ld_ident(ent, id);
2047         set_entity_visibility(ent, ir_visibility_private);
2048
2049         return ent;
2050 }
2051
2052 /**
2053  * Returns the trampoline entity for the given method.
2054  */
2055 static ir_entity *get_trampoline(be_main_env_t *env, ir_entity *method)
2056 {
2057         ir_entity *result = (ir_entity*)pmap_get(env->ent_trampoline_map, method);
2058         if (result == NULL) {
2059                 result = create_trampoline(env, method);
2060                 pmap_insert(env->ent_trampoline_map, method, result);
2061         }
2062
2063         return result;
2064 }
2065
2066 static ir_entity *create_pic_symbol(be_main_env_t *be, ir_entity *entity)
2067 {
2068         ident     *old_id = get_entity_ld_ident(entity);
2069         ident     *id     = id_mangle3("", old_id, "$non_lazy_ptr");
2070         ir_type   *e_type = get_entity_type(entity);
2071         ir_type   *type   = new_type_pointer(e_type);
2072         ir_type   *parent = be->pic_symbols_type;
2073         ir_entity *ent    = new_entity(parent, old_id, type);
2074         set_entity_ld_ident(ent, id);
2075         set_entity_visibility(ent, ir_visibility_private);
2076
2077         return ent;
2078 }
2079
2080 static ir_entity *get_pic_symbol(be_main_env_t *env, ir_entity *entity)
2081 {
2082         ir_entity *result = (ir_entity*)pmap_get(env->ent_pic_symbol_map, entity);
2083         if (result == NULL) {
2084                 result = create_pic_symbol(env, entity);
2085                 pmap_insert(env->ent_pic_symbol_map, entity, result);
2086         }
2087
2088         return result;
2089 }
2090
2091
2092
2093 /**
2094  * Returns non-zero if a given entity can be accessed using a relative address.
2095  */
2096 static int can_address_relative(ir_entity *entity)
2097 {
2098         return get_entity_visibility(entity) != ir_visibility_external
2099                 && !(get_entity_linkage(entity) & IR_LINKAGE_MERGE);
2100 }
2101
2102 static ir_node *get_pic_base(ir_graph *irg)
2103 {
2104         const arch_env_t *arch_env = be_get_irg_arch_env(irg);
2105         if (arch_env->impl->get_pic_base == NULL)
2106                 return NULL;
2107         return arch_env->impl->get_pic_base(irg);
2108 }
2109
2110 /** patches SymConsts to work in position independent code */
2111 static void fix_pic_symconsts(ir_node *node, void *data)
2112 {
2113         ir_graph         *irg = get_irn_irg(node);
2114         be_main_env_t    *be  = be_get_irg_main_env(irg);
2115         ir_node          *pic_base;
2116         ir_node          *add;
2117         ir_node          *block;
2118         ir_mode          *mode;
2119         ir_node          *load;
2120         ir_node          *load_res;
2121         int               arity, i;
2122         (void) data;
2123
2124         arity = get_irn_arity(node);
2125         for (i = 0; i < arity; ++i) {
2126                 dbg_info  *dbgi;
2127                 ir_node   *pred = get_irn_n(node, i);
2128                 ir_entity *entity;
2129                 ir_entity *pic_symbol;
2130                 ir_node   *pic_symconst;
2131
2132                 if (!is_SymConst(pred))
2133                         continue;
2134
2135                 entity = get_SymConst_entity(pred);
2136                 block  = get_nodes_block(pred);
2137
2138                 /* calls can jump to relative addresses, so we can directly jump to
2139                    the (relatively) known call address or the trampoline */
2140                 if (i == 1 && is_Call(node)) {
2141                         ir_entity *trampoline;
2142                         ir_node   *trampoline_const;
2143
2144                         if (can_address_relative(entity))
2145                                 continue;
2146
2147                         dbgi             = get_irn_dbg_info(pred);
2148                         trampoline       = get_trampoline(be, entity);
2149                         trampoline_const = new_rd_SymConst_addr_ent(dbgi, irg, mode_P_code,
2150                                                                     trampoline);
2151                         set_irn_n(node, i, trampoline_const);
2152                         continue;
2153                 }
2154
2155                 /* everything else is accessed relative to EIP */
2156                 mode     = get_irn_mode(pred);
2157                 pic_base = get_pic_base(irg);
2158
2159                 /* all ok now for locally constructed stuff */
2160                 if (can_address_relative(entity)) {
2161                         ir_node *add = new_r_Add(block, pic_base, pred, mode);
2162
2163                         /* make sure the walker doesn't visit this add again */
2164                         mark_irn_visited(add);
2165                         set_irn_n(node, i, add);
2166                         continue;
2167                 }
2168
2169                 /* get entry from pic symbol segment */
2170                 dbgi         = get_irn_dbg_info(pred);
2171                 pic_symbol   = get_pic_symbol(be, entity);
2172                 pic_symconst = new_rd_SymConst_addr_ent(dbgi, irg, mode_P_code,
2173                                                         pic_symbol);
2174                 add = new_r_Add(block, pic_base, pic_symconst, mode);
2175                 mark_irn_visited(add);
2176
2177                 /* we need an extra indirection for global data outside our current
2178                    module. The loads are always safe and can therefore float
2179                    and need no memory input */
2180                 load     = new_r_Load(block, new_r_NoMem(irg), add, mode, cons_floats);
2181                 load_res = new_r_Proj(load, mode, pn_Load_res);
2182
2183                 set_irn_n(node, i, load_res);
2184         }
2185 }
2186
2187 be_abi_irg_t *be_abi_introduce(ir_graph *irg)
2188 {
2189         be_abi_irg_t     *env         = XMALLOCZ(be_abi_irg_t);
2190         ir_node          *old_frame   = get_irg_frame(irg);
2191         be_options_t     *options     = be_get_irg_options(irg);
2192         const arch_env_t *arch_env    = be_get_irg_arch_env(irg);
2193         ir_entity        *entity      = get_irg_entity(irg);
2194         ir_type          *method_type = get_entity_type(entity);
2195         be_irg_t         *birg        = be_birg_from_irg(irg);
2196         struct obstack   *obst        = &birg->obst;
2197         unsigned          r;
2198
2199         pmap_entry *ent;
2200         ir_node *dummy;
2201
2202         /* determine allocatable registers */
2203         assert(birg->allocatable_regs == NULL);
2204         birg->allocatable_regs = rbitset_obstack_alloc(obst, arch_env->n_registers);
2205         for (r = 0; r < arch_env->n_registers; ++r) {
2206                 const arch_register_t *reg = &arch_env->registers[r];
2207                 if ( !(reg->type & arch_register_type_ignore)) {
2208                         rbitset_set(birg->allocatable_regs, r);
2209                 }
2210         }
2211
2212         /* break here if backend provides a custom API.
2213          * Note: we shouldn't have to setup any be_abi_irg_t* stuff at all,
2214          * but need more cleanup to make this work
2215          */
2216         be_set_irg_abi(irg, env);
2217
2218         be_omit_fp      = options->omit_fp;
2219
2220         env->dce_survivor = new_survive_dce();
2221         env->keep_map     = pmap_create();
2222         env->call         = be_abi_call_new(arch_env->sp->reg_class);
2223         arch_env_get_call_abi(arch_env, method_type, env->call);
2224
2225         env->init_sp = dummy = new_r_Dummy(irg, arch_env->sp->reg_class->mode);
2226         env->calls   = NEW_ARR_F(ir_node*, 0);
2227
2228         if (options->pic) {
2229                 irg_walk_graph(irg, fix_pic_symconsts, NULL, env);
2230         }
2231
2232         /* Lower all call nodes in the IRG. */
2233         process_calls(irg);
2234
2235         /*
2236                 Beware: init backend abi call object after processing calls,
2237                 otherwise some information might be not yet available.
2238         */
2239         env->cb = env->call->cb->init(env->call, irg);
2240
2241         /* Process the IRG */
2242         modify_irg(irg);
2243
2244         /* fix call inputs for state registers */
2245         fix_call_state_inputs(irg);
2246
2247         /* We don't need the keep map anymore. */
2248         pmap_destroy(env->keep_map);
2249         env->keep_map = NULL;
2250
2251         /* calls array is not needed anymore */
2252         DEL_ARR_F(env->calls);
2253         env->calls = NULL;
2254
2255         /* reroute the stack origin of the calls to the true stack origin. */
2256         exchange(dummy, env->init_sp);
2257         exchange(old_frame, get_irg_frame(irg));
2258
2259         /* Make some important node pointers survive the dead node elimination. */
2260         survive_dce_register_irn(env->dce_survivor, &env->init_sp);
2261         foreach_pmap(env->regs, ent) {
2262                 survive_dce_register_irn(env->dce_survivor, (ir_node **) &ent->value);
2263         }
2264
2265         env->call->cb->done(env->cb);
2266         env->cb = NULL;
2267         return env;
2268 }
2269
2270 void be_abi_free(ir_graph *irg)
2271 {
2272         be_abi_irg_t *env = be_get_irg_abi(irg);
2273
2274         if (env->call != NULL)
2275                 be_abi_call_free(env->call);
2276         if (env->dce_survivor != NULL)
2277                 free_survive_dce(env->dce_survivor);
2278         if (env->regs != NULL)
2279                 pmap_destroy(env->regs);
2280         free(env);
2281
2282         be_set_irg_abi(irg, NULL);
2283 }
2284
2285 void be_put_allocatable_regs(const ir_graph *irg,
2286                              const arch_register_class_t *cls, bitset_t *bs)
2287 {
2288         be_irg_t *birg             = be_birg_from_irg(irg);
2289         unsigned *allocatable_regs = birg->allocatable_regs;
2290         unsigned  i;
2291
2292         assert(bitset_size(bs) == cls->n_regs);
2293         bitset_clear_all(bs);
2294         for (i = 0; i < cls->n_regs; ++i) {
2295                 const arch_register_t *reg = &cls->regs[i];
2296                 if (rbitset_is_set(allocatable_regs, reg->global_index))
2297                         bitset_set(bs, i);
2298         }
2299 }
2300
2301 unsigned be_get_n_allocatable_regs(const ir_graph *irg,
2302                                    const arch_register_class_t *cls)
2303 {
2304         bitset_t *bs = bitset_alloca(cls->n_regs);
2305         be_put_allocatable_regs(irg, cls, bs);
2306         return bitset_popcount(bs);
2307 }
2308
2309 void be_set_allocatable_regs(const ir_graph *irg,
2310                              const arch_register_class_t *cls,
2311                              unsigned *raw_bitset)
2312 {
2313         be_irg_t *birg             = be_birg_from_irg(irg);
2314         unsigned *allocatable_regs = birg->allocatable_regs;
2315         unsigned  i;
2316
2317         rbitset_clear_all(raw_bitset, cls->n_regs);
2318         for (i = 0; i < cls->n_regs; ++i) {
2319                 const arch_register_t *reg = &cls->regs[i];
2320                 if (rbitset_is_set(allocatable_regs, reg->global_index))
2321                         rbitset_set(raw_bitset, i);
2322         }
2323 }
2324
2325 ir_node *be_abi_get_callee_save_irn(be_abi_irg_t *abi, const arch_register_t *reg)
2326 {
2327         assert(reg->type & arch_register_type_callee_save);
2328         assert(pmap_contains(abi->regs, (void *) reg));
2329         return (ir_node*)pmap_get(abi->regs, (void *) reg);
2330 }
2331
2332 ir_node *be_abi_get_ignore_irn(be_abi_irg_t *abi, const arch_register_t *reg)
2333 {
2334         assert(reg->type & arch_register_type_ignore);
2335         assert(pmap_contains(abi->regs, (void *) reg));
2336         return (ir_node*)pmap_get(abi->regs, (void *) reg);
2337 }
2338
2339 BE_REGISTER_MODULE_CONSTRUCTOR(be_init_abi);
2340 void be_init_abi(void)
2341 {
2342         FIRM_DBG_REGISTER(dbg, "firm.be.abi");
2343 }