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