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