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