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