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