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