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