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