wrapped debugging modules with DEBUG_ONLY
[libfirm] / ir / be / beabi.c
1 /**
2  * ABI lowering.
3  *
4  * @author Sebastian Hack
5  * @date 7.3.2005
6  */
7
8 #ifdef HAVE_CONFIG_H
9 # include "config.h"
10 #endif
11
12 #include "obst.h"
13 #include "offset.h"
14
15 #include "type.h"
16 #include "irgopt.h"
17
18 #include "irgraph_t.h"
19 #include "irnode_t.h"
20 #include "ircons_t.h"
21 #include "iredges_t.h"
22 #include "irgmod.h"
23 #include "irgwalk.h"
24 #include "irprintf_t.h"
25 #include "irgopt.h"
26
27 #include "be.h"
28 #include "beabi.h"
29 #include "bearch.h"
30 #include "benode_t.h"
31 #include "belive_t.h"
32 #include "besched_t.h"
33
34 #define MAX(x, y) ((x) > (y) ? (x) : (y))
35 #define MIN(x, y) ((x) < (y) ? (x) : (y))
36
37 typedef struct _be_abi_call_arg_t {
38         unsigned is_res   : 1;
39         unsigned in_reg   : 1;
40         unsigned on_stack : 1;
41
42         int pos;
43         const arch_register_t *reg;
44         entity *stack_ent;
45         unsigned alignment;
46         unsigned space_before;
47         unsigned space_after;
48 } be_abi_call_arg_t;
49
50 struct _be_abi_call_t {
51         be_abi_call_flags_t flags;
52         const be_abi_callbacks_t *cb;
53         type *between_type;
54         set *params;
55 };
56
57 #define N_FRAME_TYPES 3
58
59 typedef struct _be_stack_frame_t {
60         type *arg_type;
61         type *between_type;
62         type *frame_type;
63
64         type *order[N_FRAME_TYPES];        /**< arg, between and frame types ordered. */
65
66         int initial_offset;
67         int stack_dir;
68 } be_stack_frame_t;
69
70 struct _be_stack_slot_t {
71         struct _be_stack_frame_t *frame;
72         entity *ent;
73 };
74
75 struct _be_abi_irg_t {
76         struct obstack       obst;
77         be_stack_frame_t     *frame;        /**< The stack frame model. */
78         const be_irg_t       *birg;         /**< The back end IRG. */
79         const arch_isa_t     *isa;          /**< The isa. */
80         survive_dce_t        *dce_survivor;
81
82         be_abi_call_t        *call;         /**< The ABI call information. */
83         type                 *method_type;  /**< The type of the method of the IRG. */
84
85         ir_node              *init_sp;      /**< The node representing the stack pointer
86                                                                              at the start of the function. */
87
88         ir_node              *reg_params;   /**< The reg params node. */
89         pmap                 *regs;         /**< A map of all callee-save and ignore regs to
90                                                                                         their Projs to the RegParams node. */
91
92         pset                 *stack_phis;   /**< The set of all Phi nodes inserted due to
93                                                                                         stack pointer modifying nodes. */
94
95         int                  start_block_bias;  /**< The stack bias at the end of the start block. */
96
97         void                 *cb;           /**< ABI Callback self pointer. */
98
99         arch_irn_handler_t irn_handler;
100         arch_irn_ops_t     irn_ops;
101         DEBUG_ONLY(firm_dbg_module_t    *dbg;)          /**< The debugging module. */
102 };
103
104 #define get_abi_from_handler(ptr) firm_container_of(ptr, be_abi_irg_t, irn_handler)
105 #define get_abi_from_ops(ptr)     firm_container_of(ptr, be_abi_irg_t, irn_ops)
106
107 /* Forward, since be need it in be_abi_introduce(). */
108 static const arch_irn_ops_if_t abi_irn_ops;
109 static const arch_irn_handler_t abi_irn_handler;
110
111 /*
112      _    ____ ___    ____      _ _ _                _
113     / \  | __ )_ _|  / ___|__ _| | | |__   __ _  ___| | _____
114    / _ \ |  _ \| |  | |   / _` | | | '_ \ / _` |/ __| |/ / __|
115   / ___ \| |_) | |  | |__| (_| | | | |_) | (_| | (__|   <\__ \
116  /_/   \_\____/___|  \____\__,_|_|_|_.__/ \__,_|\___|_|\_\___/
117
118   These callbacks are used by the backend to set the parameters
119   for a specific call type.
120 */
121
122 /**
123  * Set compare function: compares two ABI call object arguments.
124  */
125 static int cmp_call_arg(const void *a, const void *b, size_t n)
126 {
127         const be_abi_call_arg_t *p = a, *q = b;
128         return !(p->is_res == q->is_res && p->pos == q->pos);
129 }
130
131 /**
132  * Get or set an ABI call object argument.
133  *
134  * @param call      the abi call
135  * @param is_res    true for call results, false for call arguments
136  * @param pos       position of the argument
137  * @param do_insert true if the argument is set, false if it's retrieved
138  */
139 static be_abi_call_arg_t *get_or_set_call_arg(be_abi_call_t *call, int is_res, int pos, int do_insert)
140 {
141         be_abi_call_arg_t arg;
142         unsigned hash;
143
144         memset(&arg, 0, sizeof(arg));
145         arg.is_res = is_res;
146         arg.pos    = pos;
147
148         hash = is_res * 128 + pos;
149
150         return do_insert
151                 ? set_insert(call->params, &arg, sizeof(arg), hash)
152                 : set_find(call->params, &arg, sizeof(arg), hash);
153 }
154
155 /**
156  * Retrieve an ABI call object argument.
157  *
158  * @param call      the ABI call object
159  * @param is_res    true for call results, false for call arguments
160  * @param pos       position of the argument
161  */
162 static INLINE be_abi_call_arg_t *get_call_arg(be_abi_call_t *call, int is_res, int pos)
163 {
164         return get_or_set_call_arg(call, is_res, pos, 0);
165 }
166
167 /* Set the flags for a call. */
168 void be_abi_call_set_flags(be_abi_call_t *call, be_abi_call_flags_t flags, const be_abi_callbacks_t *cb)
169 {
170         call->flags        = flags;
171         call->cb           = cb;
172 }
173
174 void be_abi_call_param_stack(be_abi_call_t *call, int arg_pos, unsigned alignment, unsigned space_before, unsigned space_after)
175 {
176         be_abi_call_arg_t *arg = get_or_set_call_arg(call, 0, arg_pos, 1);
177         arg->on_stack     = 1;
178         arg->alignment    = alignment;
179         arg->space_before = space_before;
180         arg->space_after  = space_after;
181         assert(alignment > 0 && "Alignment must be greater than 0");
182 }
183
184 void be_abi_call_param_reg(be_abi_call_t *call, int arg_pos, const arch_register_t *reg)
185 {
186         be_abi_call_arg_t *arg = get_or_set_call_arg(call, 0, arg_pos, 1);
187         arg->in_reg = 1;
188         arg->reg = reg;
189 }
190
191 void be_abi_call_res_reg(be_abi_call_t *call, int arg_pos, const arch_register_t *reg)
192 {
193         be_abi_call_arg_t *arg = get_or_set_call_arg(call, 1, arg_pos, 1);
194         arg->in_reg = 1;
195         arg->reg = reg;
196 }
197
198 /* Get the flags of a ABI call object. */
199 be_abi_call_flags_t be_abi_call_get_flags(const be_abi_call_t *call)
200 {
201         return call->flags;
202 }
203
204 /**
205  * Constructor for a new ABI call object.
206  *
207  * @return the new ABI call object
208  */
209 static be_abi_call_t *be_abi_call_new(void)
210 {
211         be_abi_call_t *call = xmalloc(sizeof(call[0]));
212         call->flags.val  = 0;
213         call->params     = new_set(cmp_call_arg, 16);
214         call->cb         = NULL;
215         return call;
216 }
217
218 /**
219  * Destructor for an ABI call object.
220  */
221 static void be_abi_call_free(be_abi_call_t *call)
222 {
223         del_set(call->params);
224         free(call);
225 }
226
227 /*
228   _____                           _   _                 _ _ _
229  |  ___| __ __ _ _ __ ___   ___  | | | | __ _ _ __   __| | (_)_ __   __ _
230  | |_ | '__/ _` | '_ ` _ \ / _ \ | |_| |/ _` | '_ \ / _` | | | '_ \ / _` |
231  |  _|| | | (_| | | | | | |  __/ |  _  | (_| | | | | (_| | | | | | | (_| |
232  |_|  |_|  \__,_|_| |_| |_|\___| |_| |_|\__,_|_| |_|\__,_|_|_|_| |_|\__, |
233                                                                     |___/
234
235   Handling of the stack frame. It is composed of three types:
236   1) The type of the arguments which are pushed on the stack.
237   2) The "between type" which consists of stuff the call of the
238      function pushes on the stack (like the return address and
239          the old base pointer for ia32).
240   3) The Firm frame type which consists of all local variables
241      and the spills.
242 */
243
244 static int get_stack_entity_offset(be_stack_frame_t *frame, entity *ent, int bias)
245 {
246         type *t = get_entity_owner(ent);
247         int ofs = get_entity_offset_bytes(ent);
248
249         int i, index;
250
251         /* Find the type the entity is contained in. */
252         for(index = 0; index < N_FRAME_TYPES; ++index) {
253                 if(frame->order[index] == t)
254                         break;
255         }
256
257         /* Add the size of all the types below the one of the entity to the entity's offset */
258         for(i = 0; i < index; ++i)
259                 ofs += get_type_size_bytes(frame->order[i]);
260
261         /* correct the offset by the initial position of the frame pointer */
262         ofs -= frame->initial_offset;
263
264         /* correct the offset with the current bias. */
265         ofs += bias;
266
267         return ofs;
268 }
269
270 /**
271  * Retrieve the entity with given offset from a frame type.
272  */
273 static entity *search_ent_with_offset(type *t, int offset)
274 {
275         int i, n;
276
277         for(i = 0, n = get_class_n_members(t); i < n; ++i) {
278                 entity *ent = get_class_member(t, i);
279                 if(get_entity_offset_bytes(ent) == offset)
280                         return ent;
281         }
282
283         return NULL;
284 }
285
286 static int stack_frame_compute_initial_offset(be_stack_frame_t *frame)
287 {
288         type   *base = frame->stack_dir < 0 ? frame->between_type : frame->frame_type;
289         entity *ent  = search_ent_with_offset(base, 0);
290         frame->initial_offset = 0;
291         frame->initial_offset = get_stack_entity_offset(frame, ent, 0);
292         return frame->initial_offset;
293 }
294
295 static be_stack_frame_t *stack_frame_init(be_stack_frame_t *frame, type *args, type *between, type *locals, int stack_dir)
296 {
297         frame->arg_type       = args;
298         frame->between_type   = between;
299         frame->frame_type     = locals;
300         frame->initial_offset = 0;
301         frame->stack_dir      = stack_dir;
302         frame->order[1]       = between;
303
304         if(stack_dir > 0) {
305                 frame->order[0] = args;
306                 frame->order[2] = locals;
307         }
308
309         else {
310                 frame->order[0] = locals;
311                 frame->order[2] = args;
312         }
313
314         return frame;
315 }
316
317 static void stack_frame_dump(FILE *file, be_stack_frame_t *frame)
318 {
319         int i, j, n;
320
321         ir_fprintf(file, "initial offset: %d\n", frame->initial_offset);
322         for(j = 0; j < N_FRAME_TYPES; ++j) {
323                 type *t = frame->order[j];
324
325                 ir_fprintf(file, "type %d: %Fm size: %d\n", j, t, get_type_size_bytes(t));
326                 for(i = 0, n = get_class_n_members(t); i < n; ++i) {
327                         entity *ent = get_class_member(t, i);
328                         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));
329                 }
330         }
331 }
332
333 /**
334  * If irn is a Sel node computes the address of an entity
335  * on the frame type return the entity, else NULL.
336  */
337 static INLINE entity *get_sel_ent(ir_node *irn)
338 {
339         if(is_Sel(irn) && get_Sel_ptr(irn) == get_irg_frame(get_irn_irg(irn))) {
340                 return get_Sel_entity(irn);
341         }
342
343         return NULL;
344 }
345
346 /**
347  * Walker: Replaces Loads, Stores and Sels of frame type entities
348  * by FrameLoad, FrameStore and FrameAdress.
349  */
350 static void lower_frame_sels_walker(ir_node *irn, void *data)
351 {
352         ir_node *nw  = NULL;
353         entity *ent = get_sel_ent(irn);
354
355         if(ent != NULL) {
356                 be_abi_irg_t *env = data;
357                 ir_node *bl       = get_nodes_block(irn);
358                 ir_graph *irg     = get_irn_irg(bl);
359                 ir_node *frame    = get_irg_frame(irg);
360
361                 nw = be_new_FrameAddr(env->isa->sp->reg_class, irg, bl, frame, ent);
362                 exchange(irn, nw);
363         }
364 }
365
366 /**
367  * Returns non-zero if the call argument at given position
368  * is transfered on the stack.
369  */
370 static INLINE int is_on_stack(be_abi_call_t *call, int pos)
371 {
372         be_abi_call_arg_t *arg = get_call_arg(call, 0, pos);
373         return arg && !arg->in_reg;
374 }
375
376 /*
377    ____      _ _
378   / ___|__ _| | |___
379  | |   / _` | | / __|
380  | |__| (_| | | \__ \
381   \____\__,_|_|_|___/
382
383   Adjustment of the calls inside a graph.
384
385 */
386
387 /**
388  * Transform a call node.
389  * @param env The ABI environment for the current irg.
390  * @param irn The call node.
391  * @param curr_sp The stack pointer node to use.
392  * @return The stack pointer after the call.
393  */
394 static ir_node *adjust_call(be_abi_irg_t *env, ir_node *irn, ir_node *curr_sp)
395 {
396         ir_graph *irg             = env->birg->irg;
397         const arch_isa_t *isa     = env->birg->main_env->arch_env->isa;
398         be_abi_call_t *call       = be_abi_call_new();
399         ir_type *mt               = get_Call_type(irn);
400         ir_node *call_ptr         = get_Call_ptr(irn);
401         int n_params              = get_method_n_params(mt);
402         ir_node *curr_mem         = get_Call_mem(irn);
403         ir_node *bl               = get_nodes_block(irn);
404         pset *results             = pset_new_ptr(8);
405         pset *caller_save         = pset_new_ptr(8);
406         int stack_size            = 0;
407         int stack_dir             = arch_isa_stack_dir(isa);
408         const arch_register_t *sp = arch_isa_sp(isa);
409         ir_mode *mach_mode        = sp->reg_class->mode;
410         struct obstack *obst      = &env->obst;
411         ir_node *no_mem           = get_irg_no_mem(irg);
412         int no_alloc              = call->flags.bits.frame_is_setup_on_call;
413
414         ir_node *res_proj = NULL;
415         int curr_res_proj = pn_Call_max;
416         int n_low_args    = 0;
417         int n_pos         = 0;
418
419         ir_node *low_call;
420         ir_node **in;
421         ir_node **res_projs;
422         const ir_edge_t *edge;
423         int *low_args;
424         int *pos;
425         int i, n;
426
427         /* Let the isa fill out the abi description for that call node. */
428         arch_isa_get_call_abi(isa, mt, call);
429
430         /* Insert code to put the stack arguments on the stack. */
431         assert(get_Call_n_params(irn) == n_params);
432         for(i = 0; i < n_params; ++i) {
433                 be_abi_call_arg_t *arg = get_call_arg(call, 0, i);
434                 assert(arg);
435                 if(arg->on_stack) {
436                         stack_size += arg->space_before;
437                         stack_size =  round_up2(stack_size, arg->alignment);
438                         stack_size += get_type_size_bytes(get_method_param_type(mt, i));
439                         stack_size += arg->space_after;
440                         obstack_int_grow(obst, i);
441                         n_pos++;
442                 }
443         }
444         pos = obstack_finish(obst);
445
446         /* Collect all arguments which are passed in registers. */
447         for(i = 0, n = get_Call_n_params(irn); i < n; ++i) {
448                 be_abi_call_arg_t *arg = get_call_arg(call, 0, i);
449                 if(arg && arg->in_reg) {
450                         obstack_int_grow(obst, i);
451                         n_low_args++;
452                 }
453         }
454         low_args = obstack_finish(obst);
455
456         /* If there are some parameters which shall be passed on the stack. */
457         if(n_pos > 0) {
458                 int curr_ofs      = 0;
459                 int do_seq        = call->flags.bits.store_args_sequential && !no_alloc;
460
461                 /* Reverse list of stack parameters if call arguments are from left to right */
462                 if(call->flags.bits.left_to_right) {
463                         for(i = 0; i < n_pos / 2; ++i) {
464                                 int other  = n_pos - i - 1;
465                                 int tmp    = pos[i];
466                                 pos[i]     = pos[other];
467                                 pos[other] = tmp;
468                         }
469                 }
470
471                 /*
472                  * If the stack is decreasing and we do not want to store sequentially,
473                  * or someone else allocated the call frame
474                  * we allocate as much space on the stack all parameters need, by
475                  * moving the stack pointer along the stack's direction.
476                  */
477                 if(stack_dir < 0 && !do_seq && !no_alloc) {
478                         curr_sp = be_new_IncSP(sp, irg, bl, curr_sp, no_mem, stack_size, be_stack_dir_expand);
479                 }
480
481                 assert(mode_is_reference(mach_mode) && "machine mode must be pointer");
482                 for(i = 0; i < n_pos; ++i) {
483                         int p                  = pos[i];
484                         be_abi_call_arg_t *arg = get_call_arg(call, 0, p);
485                         ir_node *param         = get_Call_param(irn, p);
486                         ir_node *addr          = curr_sp;
487                         ir_node *mem           = NULL;
488                         type *param_type       = get_method_param_type(mt, p);
489                         int param_size         = get_type_size_bytes(param_type) + arg->space_after;
490
491                         curr_ofs += arg->space_before;
492                         curr_ofs =  round_up2(curr_ofs, arg->alignment);
493
494                         /* Make the expression to compute the argument's offset. */
495                         if(curr_ofs > 0) {
496                                 addr = new_r_Const_long(irg, bl, mode_Is, curr_ofs);
497                                 addr = new_r_Add(irg, bl, curr_sp, addr, mach_mode);
498                         }
499
500                         /* Insert a store for primitive arguments. */
501                         if(is_atomic_type(param_type)) {
502                                 mem = new_r_Store(irg, bl, curr_mem, addr, param);
503                                 mem = new_r_Proj(irg, bl, mem, mode_M, pn_Store_M);
504                         }
505
506                         /* Make a mem copy for compound arguments. */
507                         else {
508                                 assert(mode_is_reference(get_irn_mode(param)));
509                                 mem = new_r_CopyB(irg, bl, curr_mem, addr, param, param_type);
510                                 mem = new_r_Proj(irg, bl, mem, mode_M, pn_CopyB_M_regular);
511                         }
512
513                         obstack_ptr_grow(obst, mem);
514
515                         curr_ofs += param_size;
516
517                         /*
518                          * If we wanted to build the arguments sequentially,
519                          * the stack pointer for the next must be incremented,
520                          * and the memory value propagated.
521                          */
522                         if(do_seq) {
523                                 curr_ofs = 0;
524                                 curr_sp  = be_new_IncSP(sp, irg, bl, curr_sp, no_mem, param_size, be_stack_dir_expand);
525                                 curr_mem = mem;
526                         }
527                 }
528
529                 in = (ir_node **) obstack_finish(obst);
530
531                 /* We need the sync only, if we didn't build the stores sequentially. */
532                 if(!do_seq)
533                         curr_mem = new_r_Sync(irg, bl, n_pos, in);
534                 obstack_free(obst, in);
535         }
536
537         /* Collect caller save registers */
538         for(i = 0, n = arch_isa_get_n_reg_class(isa); i < n; ++i) {
539                 int j;
540                 const arch_register_class_t *cls = arch_isa_get_reg_class(isa, i);
541                 for(j = 0; j < cls->n_regs; ++j) {
542                         const arch_register_t *reg = arch_register_for_index(cls, j);
543                         if(arch_register_type_is(reg, caller_save))
544                                 pset_insert_ptr(caller_save, (void *) reg);
545                 }
546         }
547
548         /* search the greatest result proj number */
549
550         /* TODO: what if the result is NOT used? Currently there is
551          * no way to detect this later, especially there is no way to
552          * see this in the proj numbers.
553          * While this is ok for the register allocator, it is bad for
554          * backends which need to change the be_Call further (x87 simulator
555          * for instance. However for this particular case the call_type is
556          * sufficient.).
557          */
558         foreach_out_edge(irn, edge) {
559                 const ir_edge_t *res_edge;
560                 ir_node *irn = get_edge_src_irn(edge);
561
562                 if(is_Proj(irn) && get_Proj_proj(irn) == pn_Call_T_result) {
563                         res_proj = irn;
564                         foreach_out_edge(irn, res_edge) {
565                                 int proj;
566                                 be_abi_call_arg_t *arg;
567                                 ir_node *res = get_edge_src_irn(res_edge);
568
569                                 assert(is_Proj(res));
570
571                                 proj = get_Proj_proj(res);
572                                 arg = get_call_arg(call, 1, proj);
573
574                                 /*
575                                         shift the proj number to the right, since we will drop the
576                                         unspeakable Proj_T from the Call. Therefore, all real argument
577                                         Proj numbers must be increased by pn_be_Call_first_res
578                                 */
579                                 proj += pn_be_Call_first_res;
580                                 set_Proj_proj(res, proj);
581                                 obstack_ptr_grow(obst, res);
582
583                                 if(proj > curr_res_proj)
584                                         curr_res_proj = proj;
585                                 if(arg->in_reg) {
586                                         pset_remove_ptr(caller_save, arg->reg);
587                                         //pmap_insert(arg_regs, arg->reg, INT_TO_PTR(proj + 1))
588                                 }
589                         }
590                 }
591         }
592
593         curr_res_proj++;
594         obstack_ptr_grow(obst, NULL);
595         res_projs = obstack_finish(obst);
596
597         /* make the back end call node and set its register requirements. */
598         for(i = 0; i < n_low_args; ++i)
599                 obstack_ptr_grow(obst, get_Call_param(irn, low_args[i]));
600
601         in = obstack_finish(obst);
602
603         if(env->call->flags.bits.call_has_imm && get_irn_opcode(call_ptr) == iro_SymConst) {
604                 low_call = be_new_Call(get_irn_dbg_info(irn), irg, bl, curr_mem, curr_sp, curr_sp,
605                                        curr_res_proj + pset_count(caller_save), n_low_args, in,
606                                        get_Call_type(irn));
607                 be_Call_set_entity(low_call, get_SymConst_entity(call_ptr));
608         }
609
610   else
611                 low_call = be_new_Call(get_irn_dbg_info(irn), irg, bl, curr_mem, curr_sp, call_ptr,
612                                        curr_res_proj + pset_count(caller_save), n_low_args, in,
613                                        get_Call_type(irn));
614
615         /*
616                 TODO:
617                 Set the register class of the call address to the same as the stack pointer's.
618                 That' probably buggy for some architectures.
619         */
620         be_node_set_reg_class(low_call, be_pos_Call_ptr, sp->reg_class);
621
622         /* Set the register classes and constraints of the Call parameters. */
623         for(i = 0; i < n_low_args; ++i) {
624                 int index = low_args[i];
625                 be_abi_call_arg_t *arg = get_call_arg(call, 0, index);
626                 assert(arg->reg != NULL);
627
628                 be_set_constr_single_reg(low_call, be_pos_Call_first_arg + index, arg->reg);
629         }
630
631         /* Set the register constraints of the results. */
632         for(i = 0; res_projs[i]; ++i) {
633                 ir_node *irn                 = res_projs[i];
634                 int proj                     = get_Proj_proj(irn);
635
636                 /* Correct Proj number since it has been adjusted! (see above) */
637                 const be_abi_call_arg_t *arg = get_call_arg(call, 1, proj - pn_Call_max);
638
639                 assert(arg->in_reg);
640                 be_set_constr_single_reg(low_call, BE_OUT_POS(proj), arg->reg);
641         }
642         obstack_free(obst, in);
643         exchange(irn, low_call);
644
645         /* redirect the result projs to the lowered call instead of the Proj_T */
646         for(i = 0; res_projs[i]; ++i)
647                 set_Proj_pred(res_projs[i], low_call);
648
649         /* Make additional projs for the caller save registers
650            and the Keep node which keeps them alive. */
651         if(pset_count(caller_save) > 0) {
652                 const arch_register_t *reg;
653                 ir_node **in, *keep;
654                 int i, n;
655
656                 for(reg = pset_first(caller_save), n = 0; reg; reg = pset_next(caller_save), ++n) {
657                         ir_node *proj = new_r_Proj(irg, bl, low_call, reg->reg_class->mode, curr_res_proj);
658
659                         /* memorize the register in the link field. we need afterwards to set the register class of the keep correctly. */
660                         be_set_constr_single_reg(low_call, BE_OUT_POS(curr_res_proj), reg);
661                         set_irn_link(proj, (void *) reg);
662                         obstack_ptr_grow(obst, proj);
663                         curr_res_proj++;
664                 }
665
666                 in   = (ir_node **) obstack_finish(obst);
667                 keep = be_new_Keep(NULL, irg, bl, n, in);
668                 for(i = 0; i < n; ++i) {
669                         const arch_register_t *reg = get_irn_link(in[i]);
670                         be_node_set_reg_class(keep, i, reg->reg_class);
671                 }
672                 obstack_free(obst, in);
673         }
674
675         /* Clean up the stack. */
676         if(stack_size > 0) {
677                 ir_node *mem_proj = NULL;
678
679                 foreach_out_edge(low_call, edge) {
680                         ir_node *irn = get_edge_src_irn(edge);
681                         if(is_Proj(irn) && get_Proj_proj(irn) == pn_Call_M) {
682                                 mem_proj = irn;
683                                 break;
684                         }
685                 }
686
687                 if(!mem_proj)
688                         mem_proj = new_r_Proj(irg, bl, low_call, mode_M, pn_Call_M);
689
690                  /* Clean up the stack frame if we allocated it */
691                 if(!no_alloc)
692                         curr_sp = be_new_IncSP(sp, irg, bl, curr_sp, mem_proj, stack_size, be_stack_dir_shrink);
693         }
694
695         be_abi_call_free(call);
696         obstack_free(obst, pos);
697         del_pset(results);
698         del_pset(caller_save);
699
700         return curr_sp;
701 }
702
703 /**
704  * Adjust an alloca.
705  * The alloca is transformed into a back end alloca node and connected to the stack nodes.
706  */
707 static ir_node *adjust_alloc(be_abi_irg_t *env, ir_node *alloc, ir_node *curr_sp)
708 {
709         if (get_Alloc_where(alloc) == stack_alloc) {
710                 ir_node *bl        = get_nodes_block(alloc);
711                 ir_graph *irg      = get_irn_irg(bl);
712                 ir_node *alloc_mem = NULL;
713                 ir_node *alloc_res = NULL;
714
715                 const ir_edge_t *edge;
716                 ir_node *new_alloc;
717
718                 env->call->flags.bits.try_omit_fp = 0;
719
720                 new_alloc = be_new_AddSP(env->isa->sp, irg, bl, curr_sp, get_Alloc_size(alloc));
721
722                 foreach_out_edge(alloc, edge) {
723                         ir_node *irn = get_edge_src_irn(edge);
724
725                         assert(is_Proj(irn));
726                         switch(get_Proj_proj(irn)) {
727                         case pn_Alloc_M:
728                                 alloc_mem = irn;
729                                 break;
730                         case pn_Alloc_res:
731                                 alloc_res = irn;
732                                 break;
733                         default:
734                                 break;
735                         }
736                 }
737
738     /* TODO: Beware: currently Alloc nodes without a result might happen,
739        only escape analysis kills them and this phase runs only for object
740        oriented source. So this must be fixed. */
741                 assert(alloc_res != NULL);
742                 exchange(alloc_res, env->isa->stack_dir < 0 ? new_alloc : curr_sp);
743
744                 if(alloc_mem != NULL)
745                         exchange(alloc_mem, new_r_NoMem(irg));
746
747                 curr_sp = new_alloc;
748         }
749
750         return curr_sp;
751 }
752
753 /**
754  * Walker for dependent_on().
755  * This function searches a node tgt recursively from a given node
756  * but is restricted to the given block.
757  * @return 1 if tgt was reachable from curr, 0 if not.
758  */
759 static int check_dependence(ir_node *curr, ir_node *tgt, ir_node *bl, unsigned long visited_nr)
760 {
761         int n, i;
762
763         if(get_irn_visited(curr) >= visited_nr)
764                 return 0;
765
766         set_irn_visited(curr, visited_nr);
767         if(get_nodes_block(curr) != bl)
768                 return 0;
769
770         if(curr == tgt)
771                 return 1;
772
773         for(i = 0, n = get_irn_arity(curr); i < n; ++i) {
774                 if(check_dependence(get_irn_n(curr, i), tgt, bl, visited_nr))
775                         return 1;
776         }
777
778         return 0;
779 }
780
781 /**
782  * Check if a node is somehow data dependent on another one.
783  * both nodes must be in the same basic block.
784  * @param n1 The first node.
785  * @param n2 The second node.
786  * @return 1, if n1 is data dependent (transitively) on n2, 0 if not.
787  */
788 static int dependent_on(ir_node *n1, ir_node *n2)
789 {
790         ir_node *bl   = get_nodes_block(n1);
791         ir_graph *irg = get_irn_irg(bl);
792         long vis_nr   = get_irg_visited(irg) + 1;
793
794         assert(bl == get_nodes_block(n2));
795         set_irg_visited(irg, vis_nr);
796         return check_dependence(n1, n2, bl, vis_nr);
797 }
798
799 static int cmp_call_dependecy(const void *c1, const void *c2)
800 {
801         ir_node *n1 = *(ir_node **) c1;
802         ir_node *n2 = *(ir_node **) c2;
803
804         /*
805                 Classical qsort() comparison function behavior:
806                 0  if both elements are equal
807                 1  if second is "smaller" that first
808                 -1 if first is "smaller" that second
809         */
810         return n1 == n2 ? 0 : (dependent_on(n1, n2) ? -1 : 1);
811 }
812
813 static void link_calls_in_block_walker(ir_node *irn, void *data)
814 {
815         if(is_Call(irn)) {
816                 be_abi_irg_t *env = data;
817                 ir_node *bl       = get_nodes_block(irn);
818                 void *save        = get_irn_link(bl);
819
820                 env->call->flags.bits.irg_is_leaf = 0;
821
822                 set_irn_link(irn, save);
823                 set_irn_link(bl, irn);
824         }
825 }
826
827 /**
828  * Process all call nodes inside a basic block.
829  * Note that the link field of the block must contain a linked list of all
830  * Call nodes inside the block. We first order this list according to data dependency
831  * and that connect the calls together.
832  */
833 static void process_calls_in_block(ir_node *bl, void *data)
834 {
835         be_abi_irg_t *env = data;
836         ir_node *curr_sp  = env->init_sp;
837         ir_node *irn;
838         int n;
839
840         for(irn = get_irn_link(bl), n = 0; irn; irn = get_irn_link(irn), ++n)
841                 obstack_ptr_grow(&env->obst, irn);
842
843         /* If there were call nodes in the block. */
844         if(n > 0) {
845                 ir_node **nodes;
846                 int i;
847
848                 nodes = obstack_finish(&env->obst);
849
850                 /* order the call nodes according to data dependency */
851                 qsort(nodes, n, sizeof(nodes[0]), cmp_call_dependecy);
852
853                 for(i = n - 1; i >= 0; --i) {
854                         ir_node *irn = nodes[i];
855
856                         switch(get_irn_opcode(irn)) {
857                         case iro_Call:
858                                 curr_sp = adjust_call(env, irn, curr_sp);
859                                 break;
860                         case iro_Alloc:
861                                 curr_sp = adjust_alloc(env, irn, curr_sp);
862                                 break;
863                         default:
864                                 break;
865                         }
866                 }
867
868                 obstack_free(&env->obst, nodes);
869
870                 /* Keep the last stack state in the block by tying it to Keep node */
871                 nodes[0] = curr_sp;
872                 be_new_Keep(env->isa->sp->reg_class, get_irn_irg(bl), bl, 1, nodes);
873         }
874
875         set_irn_link(bl, curr_sp);
876 }
877
878 /**
879  * Adjust all call nodes in the graph to the ABI conventions.
880  */
881 static void process_calls(be_abi_irg_t *env)
882 {
883         ir_graph *irg = env->birg->irg;
884
885         env->call->flags.bits.irg_is_leaf = 1;
886         irg_walk_graph(irg, firm_clear_link, link_calls_in_block_walker, env);
887         irg_block_walk_graph(irg, NULL, process_calls_in_block, env);
888 }
889
890 static void collect_return_walker(ir_node *irn, void *data)
891 {
892         if(get_irn_opcode(irn) == iro_Return) {
893                 struct obstack *obst = data;
894                 obstack_ptr_grow(obst, irn);
895         }
896 }
897
898 static ir_node *setup_frame(be_abi_irg_t *env)
899 {
900         const arch_isa_t *isa = env->birg->main_env->arch_env->isa;
901         const arch_register_t *sp = isa->sp;
902         const arch_register_t *bp = isa->bp;
903         be_abi_call_flags_bits_t flags = env->call->flags.bits;
904         ir_graph *irg      = env->birg->irg;
905         ir_node *bl        = get_irg_start_block(irg);
906         ir_node *no_mem    = get_irg_no_mem(irg);
907         ir_node *old_frame = get_irg_frame(irg);
908         ir_node *stack     = pmap_get(env->regs, (void *) sp);
909         ir_node *frame     = pmap_get(env->regs, (void *) bp);
910
911         int stack_nr       = get_Proj_proj(stack);
912
913         if(flags.try_omit_fp) {
914                 stack = be_new_IncSP(sp, irg, bl, stack, no_mem, BE_STACK_FRAME_SIZE, be_stack_dir_expand);
915                 frame = stack;
916         }
917
918         else {
919                 frame = be_new_Copy(bp->reg_class, irg, bl, stack);
920
921                 be_node_set_flags(frame, -1, arch_irn_flags_dont_spill);
922                 if(!flags.fp_free) {
923                         be_set_constr_single_reg(frame, -1, bp);
924                         be_node_set_flags(frame, -1, arch_irn_flags_ignore);
925                         arch_set_irn_register(env->birg->main_env->arch_env, frame, bp);
926                 }
927
928                 stack = be_new_IncSP(sp, irg, bl, stack, frame, BE_STACK_FRAME_SIZE, be_stack_dir_expand);
929         }
930
931         be_node_set_flags(env->reg_params, -(stack_nr + 1), arch_irn_flags_ignore);
932         env->init_sp = stack;
933         set_irg_frame(irg, frame);
934         edges_reroute(old_frame, frame, irg);
935
936         return frame;
937 }
938
939 static void clearup_frame(be_abi_irg_t *env, ir_node *ret, pmap *reg_map, struct obstack *obst)
940 {
941         const arch_isa_t *isa = env->birg->main_env->arch_env->isa;
942         const arch_register_t *sp = isa->sp;
943         const arch_register_t *bp = isa->bp;
944         ir_graph *irg      = env->birg->irg;
945         ir_node *ret_mem   = get_Return_mem(ret);
946         ir_node *frame     = get_irg_frame(irg);
947         ir_node *bl        = get_nodes_block(ret);
948         ir_node *stack     = get_irn_link(bl);
949
950         pmap_entry *ent;
951
952         if(env->call->flags.bits.try_omit_fp) {
953                 stack = be_new_IncSP(sp, irg, bl, stack, ret_mem, BE_STACK_FRAME_SIZE, be_stack_dir_shrink);
954         }
955
956         else {
957                 stack = be_new_SetSP(sp, irg, bl, stack, frame, ret_mem);
958                 be_set_constr_single_reg(stack, -1, sp);
959                 be_node_set_flags(stack, -1, arch_irn_flags_ignore);
960         }
961
962         pmap_foreach(env->regs, ent) {
963                 const arch_register_t *reg = ent->key;
964                 ir_node *irn               = ent->value;
965
966                 if(reg == sp)
967                         obstack_ptr_grow(&env->obst, stack);
968                 else if(reg == bp)
969                         obstack_ptr_grow(&env->obst, frame);
970                 else if(arch_register_type_is(reg, callee_save) || arch_register_type_is(reg, ignore))
971                         obstack_ptr_grow(obst, irn);
972         }
973 }
974
975 static ir_type *compute_arg_type(be_abi_irg_t *env, be_abi_call_t *call, ir_type *method_type)
976 {
977         int dir  = env->call->flags.bits.left_to_right ? 1 : -1;
978         int inc  = env->birg->main_env->arch_env->isa->stack_dir * dir;
979         int n    = get_method_n_params(method_type);
980         int curr = inc > 0 ? 0 : n - 1;
981         int ofs  = 0;
982
983         char buf[128];
984         ir_type *res;
985         int i;
986
987         snprintf(buf, sizeof(buf), "%s_arg_type", get_entity_name(get_irg_entity(env->birg->irg)));
988         res = new_type_class(new_id_from_str(buf));
989
990         for(i = 0; i < n; ++i, curr += inc) {
991                 type *param_type       = get_method_param_type(method_type, curr);
992                 be_abi_call_arg_t *arg = get_call_arg(call, 0, curr);
993
994                 if(arg->on_stack) {
995                         snprintf(buf, sizeof(buf), "param_%d", i);
996                         arg->stack_ent = new_entity(res, new_id_from_str(buf), param_type);
997                         ofs += arg->space_before;
998                         ofs = round_up2(ofs, arg->alignment);
999                         set_entity_offset_bytes(arg->stack_ent, ofs);
1000                         ofs += arg->space_after;
1001                         ofs += get_type_size_bytes(param_type);
1002                 }
1003         }
1004
1005         set_type_size_bytes(res, ofs);
1006         return res;
1007 }
1008
1009 static void create_register_perms(const arch_isa_t *isa, ir_graph *irg, ir_node *bl, pmap *regs)
1010 {
1011         int i, j, n;
1012         struct obstack obst;
1013
1014         obstack_init(&obst);
1015
1016         /* Create a Perm after the RegParams node to delimit it. */
1017         for(i = 0, n = arch_isa_get_n_reg_class(isa); i < n; ++i) {
1018                 const arch_register_class_t *cls = arch_isa_get_reg_class(isa, i);
1019                 ir_node *perm;
1020                 ir_node **in;
1021                 int n_regs;
1022
1023                 for(n_regs = 0, j = 0; j < cls->n_regs; ++j) {
1024                         const arch_register_t *reg = &cls->regs[j];
1025                         ir_node *irn = pmap_get(regs, (void *) reg);
1026
1027                         if(irn && !arch_register_type_is(reg, ignore)) {
1028                                 n_regs++;
1029                                 obstack_ptr_grow(&obst, irn);
1030                                 set_irn_link(irn, (void *) reg);
1031                         }
1032                 }
1033
1034                 obstack_ptr_grow(&obst, NULL);
1035                 in = obstack_finish(&obst);
1036                 if(n_regs > 0) {
1037                         perm = be_new_Perm(cls, irg, bl, n_regs, in);
1038                         for(j = 0; j < n_regs; ++j) {
1039                                 ir_node *arg = in[j];
1040                                 arch_register_t *reg = get_irn_link(arg);
1041                                 pmap_insert(regs, reg, arg);
1042                                 be_set_constr_single_reg(perm, BE_OUT_POS(j), reg);
1043                         }
1044                 }
1045                 obstack_free(&obst, in);
1046         }
1047
1048         obstack_free(&obst, NULL);
1049 }
1050
1051 typedef struct {
1052         const arch_register_t *reg;
1053         ir_node *irn;
1054 } reg_node_map_t;
1055
1056 static int cmp_regs(const void *a, const void *b)
1057 {
1058         const reg_node_map_t *p = a;
1059         const reg_node_map_t *q = b;
1060
1061         if(p->reg->reg_class == q->reg->reg_class)
1062                 return p->reg->index - q->reg->index;
1063         else
1064                 return p->reg->reg_class - q->reg->reg_class;
1065 }
1066
1067 static reg_node_map_t *reg_map_to_arr(struct obstack *obst, pmap *reg_map)
1068 {
1069         pmap_entry *ent;
1070         int n = pmap_count(reg_map);
1071         int i = 0;
1072         reg_node_map_t *res = obstack_alloc(obst, n * sizeof(res[0]));
1073
1074         pmap_foreach(reg_map, ent) {
1075                 res[i].reg = ent->key;
1076                 res[i].irn = ent->value;
1077                 i++;
1078         }
1079
1080         qsort(res, n, sizeof(res[0]), cmp_regs);
1081         return res;
1082 }
1083
1084 static void create_barrier(be_abi_irg_t *env, ir_node *bl, ir_node **mem, pmap *regs, int in_req)
1085 {
1086         ir_graph *irg = env->birg->irg;
1087         int n;
1088         int n_regs = pmap_count(regs);
1089         ir_node *irn;
1090         ir_node **in;
1091         reg_node_map_t *rm;
1092
1093         rm = reg_map_to_arr(&env->obst, regs);
1094
1095         for(n = 0; n < n_regs; ++n)
1096                 obstack_ptr_grow(&env->obst, rm[n].irn);
1097
1098         if(mem) {
1099                 obstack_ptr_grow(&env->obst, *mem);
1100                 n++;
1101         }
1102
1103         in = (ir_node **) obstack_finish(&env->obst);
1104         irn = be_new_Barrier(irg, bl, n, in);
1105         obstack_free(&env->obst, in);
1106
1107         for(n = 0; n < n_regs; ++n) {
1108                 int pos = BE_OUT_POS(n);
1109                 ir_node *proj;
1110                 const arch_register_t *reg = rm[n].reg;
1111
1112                 proj = new_r_Proj(irg, bl, irn, get_irn_mode(rm[n].irn), n);
1113                 be_node_set_reg_class(irn, n, reg->reg_class);
1114                 if(in_req)
1115                         be_set_constr_single_reg(irn, n, reg);
1116                 be_set_constr_single_reg(irn, pos, reg);
1117                 be_node_set_reg_class(irn, pos, reg->reg_class);
1118                 arch_set_irn_register(env->birg->main_env->arch_env, proj, reg);
1119                 if(arch_register_type_is(reg, ignore))
1120                         be_node_set_flags(irn, pos, arch_irn_flags_ignore);
1121
1122                 pmap_insert(regs, (void *) reg, proj);
1123         }
1124
1125         if(mem) {
1126                 *mem = new_r_Proj(irg, bl, irn, mode_M, n);
1127         }
1128
1129         obstack_free(&env->obst, rm);
1130 }
1131
1132 /**
1133  * Modify the irg itself and the frame type.
1134  */
1135 static void modify_irg(be_abi_irg_t *env)
1136 {
1137         be_abi_call_t *call       = env->call;
1138         const arch_isa_t *isa     = env->birg->main_env->arch_env->isa;
1139         const arch_register_t *sp = arch_isa_sp(isa);
1140         ir_graph *irg             = env->birg->irg;
1141         ir_node *bl               = get_irg_start_block(irg);
1142         ir_node *end              = get_irg_end_block(irg);
1143         ir_node *arg_tuple        = get_irg_args(irg);
1144         ir_node *no_mem           = get_irg_no_mem(irg);
1145         ir_node *mem              = get_irg_initial_mem(irg);
1146         type *method_type         = get_entity_type(get_irg_entity(irg));
1147         pset *dont_save           = pset_new_ptr(8);
1148         int n_params              = get_method_n_params(method_type);
1149         int max_arg               = 0;
1150         DEBUG_ONLY(firm_dbg_module_t *dbg    = env->dbg;)
1151
1152         int i, j, n;
1153
1154         reg_node_map_t *rm;
1155         const arch_register_t *fp_reg;
1156         ir_node *frame_pointer;
1157         ir_node *reg_params_bl;
1158         ir_node **args;
1159         const ir_edge_t *edge;
1160         ir_type *arg_type, *bet_type;
1161
1162         pmap_entry *ent;
1163         bitset_t *used_proj_nr;
1164
1165         DBG((dbg, LEVEL_1, "introducing abi on %+F\n", irg));
1166
1167         /* Convert the Sel nodes in the irg to frame load/store/addr nodes. */
1168         irg_walk_graph(irg, lower_frame_sels_walker, NULL, env);
1169
1170         env->frame = obstack_alloc(&env->obst, sizeof(env->frame[0]));
1171         env->regs  = pmap_create();
1172
1173         /* Find the maximum proj number of the argument tuple proj */
1174         foreach_out_edge(arg_tuple, edge)  {
1175                 ir_node *irn = get_edge_src_irn(edge);
1176                 int nr       = get_Proj_proj(irn);
1177                 max_arg      = MAX(max_arg, nr);
1178         }
1179
1180         used_proj_nr = bitset_alloca(1024);
1181         max_arg      = MAX(max_arg + 1, n_params);
1182         args         = obstack_alloc(&env->obst, max_arg * sizeof(args[0]));
1183         memset(args, 0, max_arg * sizeof(args[0]));
1184
1185         /* Fill the argument vector */
1186         foreach_out_edge(arg_tuple, edge) {
1187                 ir_node *irn = get_edge_src_irn(edge);
1188                 int nr       = get_Proj_proj(irn);
1189                 args[nr]     = irn;
1190                 DBG((dbg, LEVEL_2, "\treading arg: %d -> %+F\n", nr, irn));
1191         }
1192
1193         arg_type = compute_arg_type(env, call, method_type);
1194         bet_type = call->cb->get_between_type(env->cb);
1195         stack_frame_init(env->frame, arg_type, bet_type, get_irg_frame_type(irg), isa->stack_dir);
1196
1197         /* Count the register params and add them to the number of Projs for the RegParams node */
1198         for(i = 0; i < n_params; ++i) {
1199                 be_abi_call_arg_t *arg = get_call_arg(call, 0, i);
1200                 if(arg->in_reg && args[i]) {
1201                         assert(arg->reg != sp && "cannot use stack pointer as parameter register");
1202                         assert(i == get_Proj_proj(args[i]));
1203
1204                         /* For now, associate the register with the old Proj from Start representing that argument. */
1205                         pmap_insert(env->regs, (void *) arg->reg, args[i]);
1206                         bitset_set(used_proj_nr, i);
1207                         DBG((dbg, LEVEL_2, "\targ #%d -> reg %s\n", i, arg->reg->name));
1208                 }
1209         }
1210
1211         /* Collect all callee-save registers */
1212         for(i = 0, n = arch_isa_get_n_reg_class(isa); i < n; ++i) {
1213                 const arch_register_class_t *cls = arch_isa_get_reg_class(isa, i);
1214                 for(j = 0; j < cls->n_regs; ++j) {
1215                         const arch_register_t *reg = &cls->regs[j];
1216                         if(arch_register_type_is(reg, callee_save) || arch_register_type_is(reg, ignore))
1217                                 pmap_insert(env->regs, (void *) reg, NULL);
1218                 }
1219         }
1220
1221         pmap_insert(env->regs, (void *) sp, NULL);
1222         pmap_insert(env->regs, (void *) isa->bp, NULL);
1223         reg_params_bl   = get_irg_start_block(irg);
1224         env->reg_params = be_new_RegParams(irg, reg_params_bl, pmap_count(env->regs));
1225
1226         /*
1227          * make proj nodes for the callee save registers.
1228          * memorize them, since Return nodes get those as inputs.
1229          *
1230          * Note, that if a register corresponds to an argument, the regs map contains
1231          * the old Proj from start for that argument.
1232          */
1233
1234         rm = reg_map_to_arr(&env->obst, env->regs);
1235         for(i = 0, n = pmap_count(env->regs); i < n; ++i) {
1236                 arch_register_t *reg = (void *) rm[i].reg;
1237                 ir_node *arg_proj    = rm[i].irn;
1238                 ir_node *proj;
1239                 ir_mode *mode        = arg_proj ? get_irn_mode(arg_proj) : reg->reg_class->mode;
1240                 long nr              = i;
1241                 int pos              = BE_OUT_POS((int) nr);
1242
1243                 assert(nr >= 0);
1244                 bitset_set(used_proj_nr, nr);
1245                 proj = new_r_Proj(irg, reg_params_bl, env->reg_params, mode, nr);
1246                 pmap_insert(env->regs, (void *) reg, proj);
1247                 be_set_constr_single_reg(env->reg_params, pos, reg);
1248                 arch_set_irn_register(env->birg->main_env->arch_env, proj, reg);
1249
1250                 /*
1251                  * If the register is an ignore register,
1252                  * The Proj for that register shall also be ignored during register allocation.
1253                  */
1254                 if(arch_register_type_is(reg, ignore))
1255                         be_node_set_flags(env->reg_params, pos, arch_irn_flags_ignore);
1256
1257                 DBG((dbg, LEVEL_2, "\tregister save proj #%d -> reg %s\n", nr, reg->name));
1258         }
1259         obstack_free(&env->obst, rm);
1260
1261         /* Generate the Prologue */
1262         fp_reg = call->cb->prologue(env->cb, &mem, env->regs);
1263         create_barrier(env, bl, &mem, env->regs, 0);
1264
1265         env->init_sp  = be_abi_reg_map_get(env->regs, sp);
1266         env->init_sp  = be_new_IncSP(sp, irg, bl, env->init_sp, no_mem, BE_STACK_FRAME_SIZE, be_stack_dir_expand);
1267         arch_set_irn_register(env->birg->main_env->arch_env, env->init_sp, sp);
1268         be_abi_reg_map_set(env->regs, sp, env->init_sp);
1269         frame_pointer = be_abi_reg_map_get(env->regs, fp_reg);
1270         set_irg_frame(irg, frame_pointer);
1271
1272         /* Now, introduce stack param nodes for all parameters passed on the stack */
1273         for(i = 0; i < max_arg; ++i) {
1274                 ir_node *arg_proj = args[i];
1275                 ir_node *repl     = NULL;
1276
1277                 if(arg_proj != NULL) {
1278                         be_abi_call_arg_t *arg;
1279                         ir_type *param_type;
1280                         int nr = get_Proj_proj(arg_proj);
1281
1282                         nr         = MIN(nr, n_params);
1283                         arg        = get_call_arg(call, 0, nr);
1284                         param_type = get_method_param_type(method_type, nr);
1285
1286                         if(arg->in_reg) {
1287                                 repl = pmap_get(env->regs, (void *) arg->reg);
1288                         }
1289
1290                         else if(arg->on_stack) {
1291                                 /* For atomic parameters which are actually used, we create a StackParam node. */
1292                                 if(is_atomic_type(param_type) && get_irn_n_edges(args[i]) > 0) {
1293                                         ir_mode *mode                    = get_type_mode(param_type);
1294                                         const arch_register_class_t *cls = arch_isa_get_reg_class_for_mode(isa, mode);
1295                                         repl = be_new_StackParam(cls, isa->bp->reg_class, irg, reg_params_bl, mode, frame_pointer, arg->stack_ent);
1296                                 }
1297
1298                                 /* The stack parameter is not primitive (it is a struct or array),
1299                                 we thus will create a node representing the parameter's address
1300                                 on the stack. */
1301                                 else {
1302                                         repl = be_new_FrameAddr(sp->reg_class, irg, reg_params_bl, frame_pointer, arg->stack_ent);
1303                                 }
1304                         }
1305
1306                         assert(repl != NULL);
1307                         edges_reroute(args[i], repl, irg);
1308                 }
1309         }
1310
1311         /* All Return nodes hang on the End node, so look for them there. */
1312         for(i = 0, n = get_irn_arity(end); i < n; ++i) {
1313                 ir_node *irn = get_irn_n(end, i);
1314
1315                 if(get_irn_opcode(irn) == iro_Return) {
1316                         ir_node *bl    = get_nodes_block(irn);
1317                         int n_res      = get_Return_n_ress(irn);
1318                         pmap *reg_map  = pmap_create();
1319                         ir_node *mem   = get_Return_mem(irn);
1320                         int in_max;
1321                         ir_node *ret;
1322                         int i, n;
1323                         ir_node **in;
1324                         const arch_register_t **regs;
1325
1326                         pmap_insert(reg_map, (void *) sp, pmap_get(env->regs, (void *) sp));
1327
1328                         /* Insert results for Return into the register map. */
1329                         for(i = 0; i < n_res; ++i) {
1330                                 ir_node *res           = get_Return_res(irn, i);
1331                                 be_abi_call_arg_t *arg = get_call_arg(call, 1, i);
1332                                 assert(arg->in_reg && "return value must be passed in register");
1333                                 pmap_insert(reg_map, (void *) arg->reg, res);
1334                         }
1335
1336                         /* Add uses of the callee save registers. */
1337                         pmap_foreach(env->regs, ent) {
1338                                 const arch_register_t *reg = ent->key;
1339                                 if(arch_register_type_is(reg, callee_save) || arch_register_type_is(reg, ignore))
1340                                         pmap_insert(reg_map, ent->key, ent->value);
1341                         }
1342
1343                         /* Make the Epilogue node and call the arch's epilogue maker. */
1344                         create_barrier(env, bl, &mem, reg_map, 1);
1345                         call->cb->epilogue(env->cb, bl, &mem, reg_map);
1346
1347                         /*
1348                                 Maximum size of the in array for Return nodes is
1349                                 return args + callee save/ignore registers + memory + stack pointer
1350                         */
1351                         in_max = pmap_count(reg_map) + get_Return_n_ress(irn) + 2;
1352
1353                         in   = obstack_alloc(&env->obst, in_max * sizeof(in[0]));
1354                         regs = obstack_alloc(&env->obst, in_max * sizeof(regs[0]));
1355
1356                         in[0]   = mem;
1357                         in[1]   = be_abi_reg_map_get(reg_map, sp);
1358                         regs[0] = NULL;
1359                         regs[1] = sp;
1360                         n       = 2;
1361
1362                         /* clear SP entry, since it has already been grown. */
1363                         pmap_insert(reg_map, (void *) sp, NULL);
1364                         for(i = 0; i < n_res; ++i) {
1365                                 ir_node *res           = get_Return_res(irn, i);
1366                                 be_abi_call_arg_t *arg = get_call_arg(call, 1, i);
1367
1368                                 in[n]     = be_abi_reg_map_get(reg_map, arg->reg);
1369                                 regs[n++] = arg->reg;
1370
1371                                 /* Clear the map entry to mark the register as processed. */
1372                                 be_abi_reg_map_set(reg_map, arg->reg, NULL);
1373                         }
1374
1375                         /* grow the rest of the stuff. */
1376                         pmap_foreach(reg_map, ent) {
1377                                 if(ent->value) {
1378                                         in[n]     = ent->value;
1379                                         regs[n++] = ent->key;
1380                                 }
1381                         }
1382
1383                         /* The in array for the new back end return is now ready. */
1384                         ret = be_new_Return(get_irn_dbg_info(irn), irg, bl, n, in);
1385
1386                         /* Set the register classes of the return's parameter accordingly. */
1387                         for(i = 0; i < n; ++i)
1388                                 if(regs[i])
1389                                         be_node_set_reg_class(ret, i, regs[i]->reg_class);
1390
1391                         /* Free the space of the Epilog's in array and the register <-> proj map. */
1392                         obstack_free(&env->obst, in);
1393                         exchange(irn, ret);
1394                         pmap_destroy(reg_map);
1395                 }
1396         }
1397
1398         del_pset(dont_save);
1399         obstack_free(&env->obst, args);
1400 }
1401
1402 /**
1403  * Walker: puts all Alloc(stack_alloc) on a obstack
1404  */
1405 static void collect_alloca_walker(ir_node *irn, void *data)
1406 {
1407         be_abi_irg_t *env = data;
1408         if(get_irn_opcode(irn) == iro_Alloc && get_Alloc_where(irn) == stack_alloc)
1409                 obstack_ptr_grow(&env->obst, irn);
1410 }
1411
1412 be_abi_irg_t *be_abi_introduce(be_irg_t *birg)
1413 {
1414         be_abi_irg_t *env  = xmalloc(sizeof(env[0]));
1415         ir_node *old_frame = get_irg_frame(birg->irg);
1416         ir_graph *irg      = birg->irg;
1417
1418         pmap_entry *ent;
1419         ir_node *dummy;
1420
1421         env->isa           = birg->main_env->arch_env->isa;
1422         env->method_type   = get_entity_type(get_irg_entity(irg));
1423         env->call          = be_abi_call_new();
1424         arch_isa_get_call_abi(env->isa, env->method_type, env->call);
1425
1426         env->dce_survivor     = new_survive_dce();
1427         env->birg             = birg;
1428         env->stack_phis       = pset_new_ptr(16);
1429         env->init_sp = dummy  = new_r_Unknown(irg, env->isa->sp->reg_class->mode);
1430         FIRM_DBG_REGISTER(env->dbg, "firm.be.abi");
1431
1432         env->cb = env->call->cb->init(env->call, birg->main_env->arch_env, irg);
1433
1434         obstack_init(&env->obst);
1435
1436         memcpy(&env->irn_handler, &abi_irn_handler, sizeof(abi_irn_handler));
1437         env->irn_ops.impl = &abi_irn_ops;
1438
1439         /* Lower all call nodes in the IRG. */
1440         process_calls(env);
1441
1442         /* Process the IRG */
1443         modify_irg(env);
1444
1445         /* reroute the stack origin of the calls to the true stack origin. */
1446         edges_reroute(dummy, env->init_sp, irg);
1447         edges_reroute(old_frame, get_irg_frame(irg), irg);
1448
1449         /* Make some important node pointers survive the dead node elimination. */
1450         survive_dce_register_irn(env->dce_survivor, &env->init_sp);
1451         pmap_foreach(env->regs, ent)
1452                 survive_dce_register_irn(env->dce_survivor, (ir_node **) &ent->value);
1453
1454         arch_env_push_irn_handler(env->birg->main_env->arch_env, &env->irn_handler);
1455
1456         env->call->cb->done(env->cb);
1457         be_liveness(irg);
1458         return env;
1459 }
1460
1461 void be_abi_free(be_abi_irg_t *env)
1462 {
1463         free_survive_dce(env->dce_survivor);
1464         del_pset(env->stack_phis);
1465         pmap_destroy(env->regs);
1466         obstack_free(&env->obst, NULL);
1467         arch_env_pop_irn_handler(env->birg->main_env->arch_env);
1468         free(env);
1469 }
1470
1471
1472 /*
1473
1474   _____ _        ____  _             _
1475  |  ___(_)_  __ / ___|| |_ __ _  ___| | __
1476  | |_  | \ \/ / \___ \| __/ _` |/ __| |/ /
1477  |  _| | |>  <   ___) | || (_| | (__|   <
1478  |_|   |_/_/\_\ |____/ \__\__,_|\___|_|\_\
1479
1480 */
1481
1482 static void collect_stack_nodes_walker(ir_node *irn, void *data)
1483 {
1484         pset *s = data;
1485
1486         if(be_is_AddSP(irn)     || be_is_IncSP(irn)     || be_is_SetSP(irn))
1487                 pset_insert_ptr(s, irn);
1488 }
1489
1490 void be_abi_fix_stack_nodes(be_abi_irg_t *env)
1491 {
1492         dom_front_info_t *df;
1493         pset *stack_nodes;
1494
1495         /* We need dominance frontiers for fix up */
1496         df = be_compute_dominance_frontiers(env->birg->irg);
1497         stack_nodes = pset_new_ptr(16);
1498         pset_insert_ptr(stack_nodes, env->init_sp);
1499         irg_walk_graph(env->birg->irg, collect_stack_nodes_walker, NULL, stack_nodes);
1500         be_ssa_constr_set_phis(df, stack_nodes, env->stack_phis);
1501         del_pset(stack_nodes);
1502
1503         /* Liveness could have changed due to Phi nodes. */
1504         be_liveness(env->birg->irg);
1505
1506         /* free these dominance frontiers */
1507         be_free_dominance_frontiers(df);
1508 }
1509
1510 /**
1511  * Translates a direction of an IncSP node (either be_stack_dir_shrink, or ...expand)
1512  * into -1 or 1, respectively.
1513  * @param irn The node.
1514  * @return 1, if the direction of the IncSP was along, -1 if against.
1515  */
1516 static int get_dir(ir_node *irn)
1517 {
1518         return 1 - 2 * (be_get_IncSP_direction(irn) == be_stack_dir_shrink);
1519 }
1520
1521 static int process_stack_bias(be_abi_irg_t *env, ir_node *bl, int bias)
1522 {
1523         const arch_env_t *aenv = env->birg->main_env->arch_env;
1524         int omit_fp            = env->call->flags.bits.try_omit_fp;
1525         ir_node *irn;
1526
1527         sched_foreach(bl, irn) {
1528
1529                 /*
1530                         If the node modifies the stack pointer by a constant offset,
1531                         record that in the bias.
1532                 */
1533                 if(be_is_IncSP(irn)) {
1534                         int ofs = be_get_IncSP_offset(irn);
1535                         int dir = get_dir(irn);
1536
1537                         if(ofs == BE_STACK_FRAME_SIZE) {
1538                                 ofs = get_type_size_bytes(get_irg_frame_type(env->birg->irg));
1539                                 be_set_IncSP_offset(irn, ofs);
1540                         }
1541
1542                         if(omit_fp)
1543                                 bias += dir * ofs;
1544                 }
1545
1546                 /*
1547                         Else check, if the node relates to an entity on the stack frame.
1548                         If so, set the true offset (including the bias) for that
1549                         node.
1550                 */
1551                 else {
1552                         entity *ent = arch_get_frame_entity(aenv, irn);
1553                         if(ent) {
1554                                 int offset = get_stack_entity_offset(env->frame, ent, bias);
1555                                 arch_set_frame_offset(aenv, irn, offset);
1556                                 DBG((env->dbg, LEVEL_2, "%F has offset %d\n", ent, offset));
1557                         }
1558                 }
1559         }
1560
1561         return bias;
1562 }
1563
1564 /**
1565  * A helper struct for the bias walker.
1566  */
1567 struct bias_walk {
1568         be_abi_irg_t *env;     /**< The ABI irg environment. */
1569         int start_block_bias;  /**< The bias at the end of the start block. */
1570 };
1571
1572 static void stack_bias_walker(ir_node *bl, void *data)
1573 {
1574         if(bl != get_irg_start_block(get_irn_irg(bl))) {
1575                 struct bias_walk *bw = data;
1576                 process_stack_bias(bw->env, bl, bw->start_block_bias);
1577         }
1578 }
1579
1580 void be_abi_fix_stack_bias(be_abi_irg_t *env)
1581 {
1582         ir_graph *irg  = env->birg->irg;
1583         struct bias_walk bw;
1584
1585         stack_frame_compute_initial_offset(env->frame);
1586         // stack_frame_dump(stdout, env->frame);
1587
1588         /* Determine the stack bias at the and of the start block. */
1589         bw.start_block_bias = process_stack_bias(env, get_irg_start_block(irg), 0);
1590
1591         /* fix the bias is all other blocks */
1592         bw.env = env;
1593         irg_block_walk_graph(irg, stack_bias_walker, NULL, &bw);
1594 }
1595
1596 ir_node *be_abi_get_callee_save_irn(be_abi_irg_t *abi, const arch_register_t *reg)
1597 {
1598         assert(arch_register_type_is(reg, callee_save));
1599         assert(pmap_contains(abi->regs, (void *) reg));
1600         return pmap_get(abi->regs, (void *) reg);
1601 }
1602
1603 /*
1604   _____ _____  _   _   _    _                 _ _
1605  |_   _|  __ \| \ | | | |  | |               | | |
1606    | | | |__) |  \| | | |__| | __ _ _ __   __| | | ___ _ __
1607    | | |  _  /| . ` | |  __  |/ _` | '_ \ / _` | |/ _ \ '__|
1608   _| |_| | \ \| |\  | | |  | | (_| | | | | (_| | |  __/ |
1609  |_____|_|  \_\_| \_| |_|  |_|\__,_|_| |_|\__,_|_|\___|_|
1610
1611   for Phi nodes which are created due to stack modifying nodes
1612   such as IncSP, AddSP and SetSP.
1613
1614   These Phis are always to be ignored by the reg alloc and are
1615   fixed on the SP register of the ISA.
1616 */
1617
1618 static const void *abi_get_irn_ops(const arch_irn_handler_t *handler, const ir_node *irn)
1619 {
1620         const be_abi_irg_t *abi = get_abi_from_handler(handler);
1621         const void *res = NULL;
1622
1623         if(is_Phi(irn) && pset_find_ptr(abi->stack_phis, (void *) irn))
1624                 res = &abi->irn_ops;
1625
1626         return res;
1627 }
1628
1629 static void be_abi_limited(void *data, bitset_t *bs)
1630 {
1631         be_abi_irg_t *abi = data;
1632         bitset_clear_all(bs);
1633         bitset_set(bs, abi->isa->sp->index);
1634 }
1635
1636 static const arch_register_req_t *abi_get_irn_reg_req(const void *self, arch_register_req_t *req, const ir_node *irn, int pos)
1637 {
1638         be_abi_irg_t *abi          = get_abi_from_ops(self);
1639         const arch_register_t *reg = abi->isa->sp;
1640
1641         memset(req, 0, sizeof(req[0]));
1642
1643         if(pos == BE_OUT_POS(0)) {
1644                 req->cls         = reg->reg_class;
1645                 req->type        = arch_register_req_type_limited;
1646                 req->limited     = be_abi_limited;
1647                 req->limited_env = abi;
1648         }
1649
1650         else if(pos >= 0 && pos < get_irn_arity(irn)) {
1651                 req->cls  = reg->reg_class;
1652                 req->type = arch_register_req_type_normal;
1653         }
1654
1655         return req;
1656 }
1657
1658 static void abi_set_irn_reg(const void *self, ir_node *irn, const arch_register_t *reg)
1659 {
1660 }
1661
1662 static const arch_register_t *abi_get_irn_reg(const void *self, const ir_node *irn)
1663 {
1664         const be_abi_irg_t *abi = get_abi_from_ops(self);
1665         return abi->isa->sp;
1666 }
1667
1668 static arch_irn_class_t abi_classify(const void *_self, const ir_node *irn)
1669 {
1670         return arch_irn_class_normal;
1671 }
1672
1673 static arch_irn_flags_t abi_get_flags(const void *_self, const ir_node *irn)
1674 {
1675         return arch_irn_flags_ignore;
1676 }
1677
1678 static entity *abi_get_frame_entity(const void *_self, const ir_node *irn)
1679 {
1680         return NULL;
1681 }
1682
1683 static void abi_set_stack_bias(const void *_self, ir_node *irn, int bias)
1684 {
1685 }
1686
1687 static const arch_irn_ops_if_t abi_irn_ops = {
1688         abi_get_irn_reg_req,
1689         abi_set_irn_reg,
1690         abi_get_irn_reg,
1691         abi_classify,
1692         abi_get_flags,
1693         abi_get_frame_entity,
1694         abi_set_stack_bias
1695 };
1696
1697 static const arch_irn_handler_t abi_irn_handler = {
1698         abi_get_irn_ops
1699 };