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