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