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