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