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