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