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