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