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