get_Call_n_params: use int for consistency
[libfirm] / ir / be / beabi.c
1 /*
2  * Copyright (C) 1995-2011 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  */
25 #include "config.h"
26
27 #include "obst.h"
28
29 #include "irgopt.h"
30
31 #include "irgraph_t.h"
32 #include "irnode_t.h"
33 #include "ircons_t.h"
34 #include "iredges_t.h"
35 #include "irgmod.h"
36 #include "irgwalk.h"
37 #include "irprintf_t.h"
38 #include "irgopt.h"
39 #include "iropt_t.h"
40 #include "irtools.h"
41 #include "heights.h"
42 #include "pdeq.h"
43 #include "util.h"
44 #include "raw_bitset.h"
45 #include "error.h"
46 #include "pset_new.h"
47
48 #include "be.h"
49 #include "beabi.h"
50 #include "bearch.h"
51 #include "benode.h"
52 #include "belive_t.h"
53 #include "besched.h"
54 #include "beirg.h"
55 #include "bessaconstr.h"
56 #include "bemodule.h"
57 #include "betranshlp.h"
58
59 DEBUG_ONLY(static firm_dbg_module_t *dbg;)
60
61 typedef struct be_abi_call_arg_t {
62         unsigned is_res   : 1;  /**< 1: the call argument is a return value. 0: it's a call parameter. */
63         unsigned in_reg   : 1;  /**< 1: this argument is transmitted in registers. */
64         unsigned on_stack : 1;  /**< 1: this argument is transmitted on the stack. */
65         unsigned callee   : 1;  /**< 1: someone called us. 0: We call another function */
66
67         int                    pos;
68         const arch_register_t *reg;
69         ir_entity             *stack_ent;
70         ir_mode               *load_mode;
71         unsigned               alignment;    /**< stack alignment */
72         unsigned               space_before; /**< allocate space before */
73         unsigned               space_after;  /**< allocate space after */
74 } be_abi_call_arg_t;
75
76 struct be_abi_call_t {
77         be_abi_call_flags_t          flags;  /**< Flags describing the ABI behavior on calls */
78         int                          pop;    /**< number of bytes the stack frame is shrinked by the callee on return. */
79         const be_abi_callbacks_t    *cb;
80         ir_type                     *between_type;
81         set                         *params;
82         const arch_register_class_t *cls_addr; /**< register class of the call address */
83 };
84
85 /**
86  * The ABI information for the current graph.
87  */
88 struct be_abi_irg_t {
89         be_abi_call_t        *call;         /**< The ABI call information. */
90
91         ir_node              *init_sp;      /**< The node representing the stack pointer
92                                                  at the start of the function. */
93
94         ir_node              *start;        /**< The be_Start params node. */
95         pmap                 *regs;         /**< A map of all callee-save and ignore regs to
96                                                  their Projs to the RegParams node. */
97         int                  start_block_bias; /**< The stack bias at the end of the start block. */
98
99         pmap                 *keep_map;     /**< mapping blocks to keep nodes. */
100
101         ir_node              **calls;       /**< flexible array containing all be_Call nodes */
102 };
103
104 static ir_heights_t *ir_heights;
105
106 /** Flag: if set, try to omit the frame pointer in all routines. */
107 static int be_omit_fp = 1;
108
109 static ir_node *be_abi_reg_map_get(pmap *map, const arch_register_t *reg)
110 {
111         return pmap_get(ir_node, map, reg);
112 }
113
114 static void be_abi_reg_map_set(pmap *map, const arch_register_t* reg,
115                                ir_node *node)
116 {
117         pmap_insert(map, reg, node);
118 }
119
120 /**
121  * Check if the given register is callee save, ie. will be saved by the callee.
122  */
123 static bool arch_register_is_callee_save(
124         const arch_env_t      *arch_env,
125         const arch_register_t *reg)
126 {
127         if (arch_env->impl->register_saved_by)
128                 return arch_env->impl->register_saved_by(reg, /*callee=*/1);
129         return false;
130 }
131
132 /**
133  * Check if the given register is caller save, ie. must be saved by the caller.
134  */
135 static bool arch_register_is_caller_save(
136         const arch_env_t      *arch_env,
137         const arch_register_t *reg)
138 {
139         if (arch_env->impl->register_saved_by)
140                 return arch_env->impl->register_saved_by(reg, /*callee=*/0);
141         return false;
142 }
143
144
145
146 /*
147      _    ____ ___    ____      _ _ _                _
148     / \  | __ )_ _|  / ___|__ _| | | |__   __ _  ___| | _____
149    / _ \ |  _ \| |  | |   / _` | | | '_ \ / _` |/ __| |/ / __|
150   / ___ \| |_) | |  | |__| (_| | | | |_) | (_| | (__|   <\__ \
151  /_/   \_\____/___|  \____\__,_|_|_|_.__/ \__,_|\___|_|\_\___/
152
153   These callbacks are used by the backend to set the parameters
154   for a specific call type.
155 */
156
157 /**
158  * Set compare function: compares two ABI call object arguments.
159  */
160 static int cmp_call_arg(const void *a, const void *b, size_t n)
161 {
162         const be_abi_call_arg_t *p = (const be_abi_call_arg_t*)a;
163         const be_abi_call_arg_t *q = (const be_abi_call_arg_t*)b;
164         (void) n;
165         return !(p->is_res == q->is_res && p->pos == q->pos && p->callee == q->callee);
166 }
167
168 /**
169  * Get  an ABI call object argument.
170  *
171  * @param call      the abi call
172  * @param is_res    true for call results, false for call arguments
173  * @param pos       position of the argument
174  * @param callee    context type - if we are callee or caller
175  */
176 static be_abi_call_arg_t *get_call_arg(be_abi_call_t *call, int is_res, int pos, int callee)
177 {
178         be_abi_call_arg_t arg;
179         unsigned hash;
180
181         memset(&arg, 0, sizeof(arg));
182         arg.is_res = is_res;
183         arg.pos    = pos;
184         arg.callee = callee;
185
186         hash = is_res * 128 + pos;
187
188         return set_find(be_abi_call_arg_t, call->params, &arg, sizeof(arg), hash);
189 }
190
191 /**
192  * Set an ABI call object argument.
193  */
194 static void remember_call_arg(be_abi_call_arg_t *arg, be_abi_call_t *call, be_abi_context_t context)
195 {
196         unsigned hash = arg->is_res * 128 + arg->pos;
197         if (context & ABI_CONTEXT_CALLEE) {
198                 arg->callee = 1;
199                 (void)set_insert(be_abi_call_arg_t, call->params, arg, sizeof(*arg), hash);
200         }
201         if (context & ABI_CONTEXT_CALLER) {
202                 arg->callee = 0;
203                 (void)set_insert(be_abi_call_arg_t, call->params, arg, sizeof(*arg), hash);
204         }
205 }
206
207 /* Set the flags for a call. */
208 void be_abi_call_set_flags(be_abi_call_t *call, be_abi_call_flags_t flags, const be_abi_callbacks_t *cb)
209 {
210         call->flags = flags;
211         call->cb    = cb;
212 }
213
214 /* Sets the number of bytes the stackframe is shrinked by the callee on return */
215 void be_abi_call_set_pop(be_abi_call_t *call, int pop)
216 {
217         assert(pop >= 0);
218         call->pop = pop;
219 }
220
221 /* Set register class for call address */
222 void be_abi_call_set_call_address_reg_class(be_abi_call_t *call, const arch_register_class_t *cls)
223 {
224         call->cls_addr = cls;
225 }
226
227
228 void be_abi_call_param_stack(be_abi_call_t *call, int arg_pos,
229                              ir_mode *load_mode, unsigned alignment,
230                              unsigned space_before, unsigned space_after,
231                              be_abi_context_t context)
232 {
233         be_abi_call_arg_t arg;
234         memset(&arg, 0, sizeof(arg));
235         assert(alignment > 0 && "Alignment must be greater than 0");
236         arg.on_stack     = 1;
237         arg.load_mode    = load_mode;
238         arg.alignment    = alignment;
239         arg.space_before = space_before;
240         arg.space_after  = space_after;
241         arg.is_res       = 0;
242         arg.pos          = arg_pos;
243
244         remember_call_arg(&arg, call, context);
245 }
246
247 void be_abi_call_param_reg(be_abi_call_t *call, int arg_pos, const arch_register_t *reg, be_abi_context_t context)
248 {
249         be_abi_call_arg_t arg;
250         memset(&arg, 0, sizeof(arg));
251
252         arg.in_reg = 1;
253         arg.reg    = reg;
254         arg.is_res = 0;
255         arg.pos    = arg_pos;
256
257         remember_call_arg(&arg, call, context);
258 }
259
260 void be_abi_call_res_reg(be_abi_call_t *call, int arg_pos, const arch_register_t *reg, be_abi_context_t context)
261 {
262         be_abi_call_arg_t arg;
263         memset(&arg, 0, sizeof(arg));
264
265         arg.in_reg = 1;
266         arg.reg    = reg;
267         arg.is_res = 1;
268         arg.pos    = arg_pos;
269
270         remember_call_arg(&arg, call, context);
271 }
272
273 /* Get the flags of a ABI call object. */
274 be_abi_call_flags_t be_abi_call_get_flags(const be_abi_call_t *call)
275 {
276         return call->flags;
277 }
278
279 /**
280  * Constructor for a new ABI call object.
281  *
282  * @param cls_addr  register class of the call address
283  *
284  * @return the new ABI call object
285  */
286 static be_abi_call_t *be_abi_call_new(const arch_register_class_t *cls_addr)
287 {
288         be_abi_call_t *call = XMALLOCZ(be_abi_call_t);
289
290         call->flags.val  = 0;
291         call->params     = new_set(cmp_call_arg, 16);
292         call->cb         = NULL;
293         call->cls_addr   = cls_addr;
294
295         call->flags.bits.try_omit_fp = be_omit_fp;
296
297         return call;
298 }
299
300 /**
301  * Destructor for an ABI call object.
302  */
303 static void be_abi_call_free(be_abi_call_t *call)
304 {
305         del_set(call->params);
306         free(call);
307 }
308
309 /**
310  * Initializes the frame layout from parts
311  *
312  * @param frame     the stack layout that will be initialized
313  * @param args      the stack argument layout type
314  * @param between   the between layout type
315  * @param locals    the method frame type
316  *
317  * @return the initialized stack layout
318  */
319 static be_stack_layout_t *stack_frame_init(be_stack_layout_t *frame, ir_type *args,
320                                            ir_type *between, ir_type *locals)
321 {
322         frame->arg_type       = args;
323         frame->between_type   = between;
324         frame->frame_type     = locals;
325         frame->initial_offset = 0;
326         frame->initial_bias   = 0;
327         frame->order[1]       = between;
328
329         /* typical decreasing stack: locals have the
330          * lowest addresses, arguments the highest */
331         frame->order[0] = locals;
332         frame->order[2] = args;
333         return frame;
334 }
335
336 /*
337    ____      _ _
338   / ___|__ _| | |___
339  | |   / _` | | / __|
340  | |__| (_| | | \__ \
341   \____\__,_|_|_|___/
342
343   Adjustment of the calls inside a graph.
344
345 */
346
347 /**
348  * Transform a call node into a be_Call node.
349  *
350  * @param env The ABI environment for the current irg.
351  * @param irn The call node.
352  * @param curr_sp The stack pointer node to use.
353  * @return The stack pointer after the call.
354  */
355 static ir_node *adjust_call(be_abi_irg_t *env, ir_node *irn, ir_node *curr_sp)
356 {
357         ir_graph *irg              = get_irn_irg(irn);
358         const arch_env_t *arch_env = be_get_irg_arch_env(irg);
359         ir_type *call_tp           = get_Call_type(irn);
360         ir_node *call_ptr          = get_Call_ptr(irn);
361         size_t   n_params          = get_method_n_params(call_tp);
362         ir_node *curr_mem          = get_Call_mem(irn);
363         ir_node *bl                = get_nodes_block(irn);
364         int stack_size             = 0;
365         const arch_register_t *sp  = arch_env->sp;
366         be_abi_call_t *call        = be_abi_call_new(sp->reg_class);
367         ir_mode *mach_mode         = sp->reg_class->mode;
368         int n_res                  = get_method_n_ress(call_tp);
369
370         ir_node *res_proj  = NULL;
371         int n_reg_params   = 0;
372         int n_stack_params = 0;
373         int n_ins;
374
375         const arch_register_t **states = NEW_ARR_F(const arch_register_t*, 0);
376         const arch_register_t **destroyed_regs = NEW_ARR_F(const arch_register_t*, 0);
377         ir_node                *low_call;
378         ir_node               **in;
379         ir_node               **res_projs;
380         int                     n_reg_results = 0;
381         int                    *reg_param_idxs;
382         int                    *stack_param_idx;
383         int                     i, n;
384         int                     throws_exception;
385         size_t                  s;
386         size_t                  p;
387         dbg_info               *dbgi;
388
389         /* Let the isa fill out the abi description for that call node. */
390         arch_env_get_call_abi(arch_env, call_tp, call);
391
392         /* Insert code to put the stack arguments on the stack. */
393         assert((size_t)get_Call_n_params(irn) == n_params);
394         stack_param_idx = ALLOCAN(int, n_params);
395         for (p = 0; p < n_params; ++p) {
396                 be_abi_call_arg_t *arg = get_call_arg(call, 0, p, 0);
397                 assert(arg);
398                 if (arg->on_stack) {
399                         int arg_size = get_type_size_bytes(get_method_param_type(call_tp, p));
400
401                         stack_size += round_up2(arg->space_before, arg->alignment);
402                         stack_size += round_up2(arg_size, arg->alignment);
403                         stack_size += round_up2(arg->space_after, arg->alignment);
404
405                         stack_param_idx[n_stack_params++] = p;
406                 }
407         }
408
409         /* Collect all arguments which are passed in registers. */
410         reg_param_idxs = ALLOCAN(int, n_params);
411         for (p = 0; p < n_params; ++p) {
412                 be_abi_call_arg_t *arg = get_call_arg(call, 0, p, 0);
413                 if (arg && arg->in_reg) {
414                         reg_param_idxs[n_reg_params++] = p;
415                 }
416         }
417
418         /*
419          * If the stack is decreasing and we do not want to store sequentially,
420          * or someone else allocated the call frame
421          * we allocate as much space on the stack all parameters need, by
422          * moving the stack pointer along the stack's direction.
423          *
424          * Note: we also have to do this for stack_size == 0, because we may have
425          * to adjust stack alignment for the call.
426          */
427         curr_sp = be_new_IncSP(sp, bl, curr_sp, stack_size, 1);
428
429         dbgi = get_irn_dbg_info(irn);
430         /* If there are some parameters which shall be passed on the stack. */
431         if (n_stack_params > 0) {
432                 int       curr_ofs = 0;
433                 ir_node **in       = ALLOCAN(ir_node*, n_stack_params+1);
434                 unsigned  n_in     = 0;
435
436                 curr_mem = get_Call_mem(irn);
437                 in[n_in++] = curr_mem;
438
439                 for (i = 0; i < n_stack_params; ++i) {
440                         int p                  = stack_param_idx[i];
441                         be_abi_call_arg_t *arg = get_call_arg(call, 0, p, 0);
442                         ir_node *param         = get_Call_param(irn, p);
443                         ir_node *addr          = curr_sp;
444                         ir_node *mem           = NULL;
445                         ir_type *param_type    = get_method_param_type(call_tp, p);
446                         int param_size         = get_type_size_bytes(param_type) + arg->space_after;
447
448                         /*
449                          * If we wanted to build the arguments sequentially,
450                          * the stack pointer for the next must be incremented,
451                          * and the memory value propagated.
452                          */
453                         curr_ofs += arg->space_before;
454                         curr_ofs =  round_up2(curr_ofs, arg->alignment);
455
456                         /* Make the expression to compute the argument's offset. */
457                         if (curr_ofs > 0) {
458                                 ir_mode *constmode = mach_mode;
459                                 if (mode_is_reference(mach_mode)) {
460                                         constmode = mode_Is;
461                                 }
462                                 addr = new_r_Const_long(irg, constmode, curr_ofs);
463                                 addr = new_r_Add(bl, curr_sp, addr, mach_mode);
464                         }
465
466                         /* Insert a store for primitive arguments. */
467                         if (is_atomic_type(param_type)) {
468                                 ir_node *nomem     = get_irg_no_mem(irg);
469                                 ir_node *mem_input = nomem;
470                                 ir_node *store     = new_rd_Store(dbgi, bl, mem_input, addr, param, cons_none);
471                                 mem   = new_r_Proj(store, mode_M, pn_Store_M);
472                         } else {
473                                 /* Make a mem copy for compound arguments. */
474                                 ir_node *copy;
475
476                                 assert(mode_is_reference(get_irn_mode(param)));
477                                 copy = new_rd_CopyB(dbgi, bl, curr_mem, addr, param, param_type);
478                                 mem = new_r_Proj(copy, mode_M, pn_CopyB_M);
479                         }
480
481                         curr_ofs += param_size;
482
483                         in[n_in++] = mem;
484                 }
485
486                 /* We need the sync only, if we didn't build the stores sequentially. */
487                 if (n_stack_params >= 1) {
488                         curr_mem = new_r_Sync(bl, n_in, in);
489                 } else {
490                         curr_mem = get_Call_mem(irn);
491                 }
492         }
493
494         /* Put caller save into the destroyed set and state registers in the states
495          * set */
496         for (i = 0, n = arch_env->n_register_classes; i < n; ++i) {
497                 unsigned j;
498                 const arch_register_class_t *cls = &arch_env->register_classes[i];
499                 for (j = 0; j < cls->n_regs; ++j) {
500                         const arch_register_t *reg = arch_register_for_index(cls, j);
501
502                         /* even if destroyed all is specified, neither SP nor FP are
503                          * destroyed (else bad things will happen) */
504                         if (reg == arch_env->sp || reg == arch_env->bp)
505                                 continue;
506
507                         if (reg->type & arch_register_type_state) {
508                                 ARR_APP1(const arch_register_t*, destroyed_regs, reg);
509                                 ARR_APP1(const arch_register_t*, states, reg);
510                                 /* we're already in the destroyed set so no need for further
511                                  * checking */
512                                 continue;
513                         }
514                         if (arch_register_is_caller_save(arch_env, reg)) {
515                                 if (!(reg->type & arch_register_type_ignore)) {
516                                         ARR_APP1(const arch_register_t*, destroyed_regs, reg);
517                                 }
518                         }
519                 }
520         }
521
522         /* search the largest result proj number */
523         res_projs = ALLOCANZ(ir_node*, n_res);
524
525         foreach_out_edge(irn, edge) {
526                 ir_node *irn = get_edge_src_irn(edge);
527
528                 if (!is_Proj(irn) || get_Proj_proj(irn) != pn_Call_T_result)
529                         continue;
530
531                 foreach_out_edge(irn, res_edge) {
532                         int proj;
533                         ir_node *res = get_edge_src_irn(res_edge);
534
535                         assert(is_Proj(res));
536
537                         proj = get_Proj_proj(res);
538                         assert(proj < n_res);
539                         assert(res_projs[proj] == NULL);
540                         res_projs[proj] = res;
541                 }
542                 res_proj = irn;
543                 break;
544         }
545
546         /** TODO: this is not correct for cases where return values are passed
547          * on the stack, but no known ABI does this currently...
548          */
549         n_reg_results = n_res;
550
551         n_ins = 0;
552         in    = ALLOCAN(ir_node*, n_reg_params + ARR_LEN(states));
553
554         /* make the back end call node and set its register requirements. */
555         for (i = 0; i < n_reg_params; ++i) {
556                 in[n_ins++] = get_Call_param(irn, reg_param_idxs[i]);
557         }
558
559         /* add state registers ins */
560         for (s = 0; s < ARR_LEN(states); ++s) {
561                 const arch_register_t       *reg = states[s];
562                 const arch_register_class_t *cls = reg->reg_class;
563                 ir_node *regnode = new_r_Unknown(irg, cls->mode);
564                 in[n_ins++]      = regnode;
565         }
566         assert(n_ins == (int) (n_reg_params + ARR_LEN(states)));
567
568         /* ins collected, build the call */
569         throws_exception = ir_throws_exception(irn);
570         if (env->call->flags.bits.call_has_imm && is_SymConst(call_ptr)) {
571                 /* direct call */
572                 low_call = be_new_Call(dbgi, irg, bl, curr_mem, curr_sp, curr_sp,
573                                        n_reg_results + pn_be_Call_first_res + ARR_LEN(destroyed_regs),
574                                        n_ins, in, get_Call_type(irn));
575                 be_Call_set_entity(low_call, get_SymConst_entity(call_ptr));
576         } else {
577                 /* indirect call */
578                 low_call = be_new_Call(dbgi, irg, bl, curr_mem, curr_sp, call_ptr,
579                                        n_reg_results + pn_be_Call_first_res + ARR_LEN(destroyed_regs),
580                                        n_ins, in, get_Call_type(irn));
581         }
582         ir_set_throws_exception(low_call, throws_exception);
583         be_Call_set_pop(low_call, call->pop);
584
585         /* put the call into the list of all calls for later processing */
586         ARR_APP1(ir_node *, env->calls, low_call);
587
588         /* create new stack pointer */
589         curr_sp = new_r_Proj(low_call, get_irn_mode(curr_sp), pn_be_Call_sp);
590         be_set_constr_single_reg_out(low_call, pn_be_Call_sp, sp,
591                         arch_register_req_type_ignore | arch_register_req_type_produces_sp);
592         arch_set_irn_register(curr_sp, sp);
593
594         /* now handle results */
595         for (i = 0; i < n_res; ++i) {
596                 ir_node           *proj = res_projs[i];
597                 be_abi_call_arg_t *arg  = get_call_arg(call, 1, i, 0);
598                 long               pn   = i + pn_be_Call_first_res;
599
600                 /* returns values on stack not supported yet */
601                 assert(arg->in_reg);
602
603                 /*
604                         shift the proj number to the right, since we will drop the
605                         unspeakable Proj_T from the Call. Therefore, all real argument
606                         Proj numbers must be increased by pn_be_Call_first_res
607                 */
608                 pn = i + pn_be_Call_first_res;
609
610                 if (proj == NULL) {
611                         ir_type *res_type = get_method_res_type(call_tp, i);
612                         ir_mode *mode     = get_type_mode(res_type);
613                         proj              = new_r_Proj(low_call, mode, pn);
614                         res_projs[i]      = proj;
615                 } else {
616                         set_Proj_pred(proj, low_call);
617                         set_Proj_proj(proj, pn);
618                 }
619
620                 if (arg->in_reg) {
621                         /* remove register from destroyed regs */
622                         size_t j;
623                         size_t n = ARR_LEN(destroyed_regs);
624                         for (j = 0; j < n; ++j) {
625                                 if (destroyed_regs[j] == arg->reg) {
626                                         destroyed_regs[j] = destroyed_regs[n-1];
627                                         ARR_SHRINKLEN(destroyed_regs,n-1);
628                                         break;
629                                 }
630                         }
631                 }
632         }
633
634         /*
635                 Set the register class of the call address to
636                 the backend provided class (default: stack pointer class)
637         */
638         be_node_set_reg_class_in(low_call, n_be_Call_ptr, call->cls_addr);
639
640         DBG((dbg, LEVEL_3, "\tcreated backend call %+F\n", low_call));
641
642         /* Set the register classes and constraints of the Call parameters. */
643         for (i = 0; i < n_reg_params; ++i) {
644                 int index = reg_param_idxs[i];
645                 be_abi_call_arg_t *arg = get_call_arg(call, 0, index, 0);
646                 assert(arg->reg != NULL);
647
648                 be_set_constr_single_reg_in(low_call, n_be_Call_first_arg + i,
649                                             arg->reg, arch_register_req_type_none);
650         }
651
652         /* Set the register constraints of the results. */
653         for (i = 0; i < n_res; ++i) {
654                 ir_node                 *proj = res_projs[i];
655                 const be_abi_call_arg_t *arg  = get_call_arg(call, 1, i, 0);
656                 int                      pn   = get_Proj_proj(proj);
657
658                 assert(arg->in_reg);
659                 be_set_constr_single_reg_out(low_call, pn, arg->reg,
660                                              arch_register_req_type_none);
661                 arch_set_irn_register(proj, arg->reg);
662         }
663         exchange(irn, low_call);
664
665         /* kill the ProjT node */
666         if (res_proj != NULL) {
667                 kill_node(res_proj);
668         }
669
670         /* Make additional projs for the caller save registers
671            and the Keep node which keeps them alive. */
672         {
673                 ir_node               **in, *keep;
674                 int                   i;
675                 size_t                d;
676                 int                   n = 0;
677                 int                   curr_res_proj = pn_be_Call_first_res + n_reg_results;
678                 int                   n_ins;
679
680                 n_ins = ARR_LEN(destroyed_regs) + n_reg_results + 1;
681                 in    = ALLOCAN(ir_node *, n_ins);
682
683                 /* also keep the stack pointer */
684                 set_irn_link(curr_sp, (void*) sp);
685                 in[n++] = curr_sp;
686
687                 for (d = 0; d < ARR_LEN(destroyed_regs); ++d) {
688                         const arch_register_t *reg = destroyed_regs[d];
689                         ir_node *proj = new_r_Proj(low_call, reg->reg_class->mode, curr_res_proj);
690
691                         /* memorize the register in the link field. we need afterwards to set the register class of the keep correctly. */
692                         be_set_constr_single_reg_out(low_call, curr_res_proj, reg,
693                                                      arch_register_req_type_none);
694                         arch_set_irn_register(proj, reg);
695
696                         set_irn_link(proj, (void*) reg);
697                         in[n++] = proj;
698                         ++curr_res_proj;
699                 }
700
701                 for (i = 0; i < n_reg_results; ++i) {
702                         ir_node *proj = res_projs[i];
703                         const arch_register_t *reg = arch_get_irn_register(proj);
704                         set_irn_link(proj, (void*) reg);
705                         in[n++] = proj;
706                 }
707                 assert(n <= n_ins);
708
709                 /* create the Keep for the caller save registers */
710                 keep = be_new_Keep(bl, n, in);
711                 for (i = 0; i < n; ++i) {
712                         const arch_register_t *reg = (const arch_register_t*)get_irn_link(in[i]);
713                         be_node_set_reg_class_in(keep, i, arch_register_get_class(reg));
714                 }
715         }
716
717         /* Clean up the stack. */
718         assert(stack_size >= call->pop);
719         stack_size -= call->pop;
720
721         if (stack_size > 0) {
722                 ir_node *mem_proj = NULL;
723
724                 foreach_out_edge(low_call, edge) {
725                         ir_node *irn = get_edge_src_irn(edge);
726                         if (is_Proj(irn) && get_Proj_proj(irn) == pn_Call_M) {
727                                 mem_proj = irn;
728                                 break;
729                         }
730                 }
731
732                 if (! mem_proj) {
733                         mem_proj = new_r_Proj(low_call, mode_M, pn_be_Call_M);
734                         keep_alive(mem_proj);
735                 }
736         }
737         /* Clean up the stack frame or revert alignment fixes if we allocated it */
738         curr_sp = be_new_IncSP(sp, bl, curr_sp, -stack_size, 0);
739
740         be_abi_call_free(call);
741
742         DEL_ARR_F(states);
743         DEL_ARR_F(destroyed_regs);
744
745         return curr_sp;
746 }
747
748 /**
749  * Adjust the size of a node representing a stack alloc or free for the minimum stack alignment.
750  *
751  * @param alignment  the minimum stack alignment
752  * @param size       the node containing the non-aligned size
753  * @param block      the block where new nodes are allocated on
754  * @param dbg        debug info for new nodes
755  *
756  * @return a node representing the aligned size
757  */
758 static ir_node *adjust_alloc_size(unsigned stack_alignment, ir_node *size,
759                                   ir_node *block, dbg_info *dbg)
760 {
761         if (stack_alignment > 1) {
762                 ir_mode   *mode;
763                 ir_tarval *tv;
764                 ir_node   *mask;
765                 ir_graph  *irg;
766
767                 assert(is_po2(stack_alignment));
768
769                 mode = get_irn_mode(size);
770                 tv   = new_tarval_from_long(stack_alignment-1, mode);
771                 irg  = get_Block_irg(block);
772                 mask = new_r_Const(irg, tv);
773                 size = new_rd_Add(dbg, block, size, mask, mode);
774
775                 tv   = new_tarval_from_long(-(long)stack_alignment, mode);
776                 mask = new_r_Const(irg, tv);
777                 size = new_rd_And(dbg, block, size, mask, mode);
778         }
779         return size;
780 }
781 /**
782  * Adjust an alloca.
783  * The alloca is transformed into a back end alloca node and connected to the stack nodes.
784  */
785 static ir_node *adjust_alloc(be_abi_irg_t *env, ir_node *alloc, ir_node *curr_sp)
786 {
787         ir_node          *block     = get_nodes_block(alloc);
788         ir_graph         *irg       = get_Block_irg(block);
789         const arch_env_t *arch_env  = be_get_irg_arch_env(irg);
790         ir_node          *alloc_mem = NULL;
791         ir_node          *alloc_res = NULL;
792         ir_type          *type      = get_Alloc_type(alloc);
793         dbg_info         *dbg;
794
795         ir_node *new_alloc;
796         ir_node *count;
797         ir_node *size;
798         ir_node *ins[2];
799         unsigned stack_alignment;
800
801         /* all non-stack Alloc nodes should already be lowered before the backend */
802         assert(get_Alloc_where(alloc) == stack_alloc);
803
804         foreach_out_edge(alloc, edge) {
805                 ir_node *irn = get_edge_src_irn(edge);
806
807                 assert(is_Proj(irn));
808                 switch (get_Proj_proj(irn)) {
809                 case pn_Alloc_M:
810                         alloc_mem = irn;
811                         break;
812                 case pn_Alloc_res:
813                         alloc_res = irn;
814                         break;
815                 default:
816                         break;
817                 }
818         }
819
820         /* Beware: currently Alloc nodes without a result might happen,
821            only escape analysis kills them and this phase runs only for object
822            oriented source. We kill the Alloc here. */
823         if (alloc_res == NULL && alloc_mem) {
824                 exchange(alloc_mem, get_Alloc_mem(alloc));
825                 return curr_sp;
826         }
827
828         dbg   = get_irn_dbg_info(alloc);
829         count = get_Alloc_count(alloc);
830
831         /* we might need to multiply the count with the element size */
832         if (!is_unknown_type(type) && get_type_size_bytes(type) != 1) {
833                 ir_mode   *mode  = get_irn_mode(count);
834                 ir_tarval *tv    = new_tarval_from_long(get_type_size_bytes(type),
835                                                         mode);
836                 ir_node   *cnst = new_rd_Const(dbg, irg, tv);
837                 size            = new_rd_Mul(dbg, block, count, cnst, mode);
838         } else {
839                 size = count;
840         }
841
842         /* The stack pointer will be modified in an unknown manner.
843            We cannot omit it. */
844         env->call->flags.bits.try_omit_fp = 0;
845
846         stack_alignment = 1 << arch_env->stack_alignment;
847         size            = adjust_alloc_size(stack_alignment, size, block, dbg);
848         new_alloc       = be_new_AddSP(arch_env->sp, block, curr_sp, size);
849         set_irn_dbg_info(new_alloc, dbg);
850
851         if (alloc_mem != NULL) {
852                 ir_node *addsp_mem;
853                 ir_node *sync;
854
855                 addsp_mem = new_r_Proj(new_alloc, mode_M, pn_be_AddSP_M);
856
857                 /* We need to sync the output mem of the AddSP with the input mem
858                    edge into the alloc node. */
859                 ins[0] = get_Alloc_mem(alloc);
860                 ins[1] = addsp_mem;
861                 sync = new_r_Sync(block, 2, ins);
862
863                 exchange(alloc_mem, sync);
864         }
865
866         exchange(alloc, new_alloc);
867
868         /* fix projnum of alloca res */
869         set_Proj_proj(alloc_res, pn_be_AddSP_res);
870
871         curr_sp = new_r_Proj(new_alloc,  get_irn_mode(curr_sp), pn_be_AddSP_sp);
872
873         return curr_sp;
874 }
875
876 /**
877  * Adjust a Free.
878  * The Free is transformed into a back end free node and connected to the stack nodes.
879  */
880 static ir_node *adjust_free(be_abi_irg_t *env, ir_node *free, ir_node *curr_sp)
881 {
882         ir_node          *block    = get_nodes_block(free);
883         ir_graph         *irg      = get_irn_irg(free);
884         ir_type          *type     = get_Free_type(free);
885         const arch_env_t *arch_env = be_get_irg_arch_env(irg);
886         ir_mode          *sp_mode  = arch_env->sp->reg_class->mode;
887         dbg_info         *dbg      = get_irn_dbg_info(free);
888         ir_node  *subsp, *mem, *res, *size, *sync;
889         ir_node *in[2];
890         unsigned stack_alignment;
891
892         /* all non-stack-alloc Free nodes should already be lowered before the
893          * backend phase */
894         assert(get_Free_where(free) == stack_alloc);
895
896         /* we might need to multiply the size with the element size */
897         if (!is_unknown_type(type) && get_type_size_bytes(type) != 1) {
898                 ir_tarval *tv   = new_tarval_from_long(get_type_size_bytes(type), mode_Iu);
899                 ir_node   *cnst = new_rd_Const(dbg, irg, tv);
900                 ir_node   *mul  = new_rd_Mul(dbg, block, get_Free_count(free),
901                                              cnst, mode_Iu);
902                 size = mul;
903         } else {
904                 size = get_Free_count(free);
905         }
906
907         stack_alignment = 1 << arch_env->stack_alignment;
908         size            = adjust_alloc_size(stack_alignment, size, block, dbg);
909
910         /* The stack pointer will be modified in an unknown manner.
911            We cannot omit it. */
912         env->call->flags.bits.try_omit_fp = 0;
913         subsp = be_new_SubSP(arch_env->sp, block, curr_sp, size);
914         set_irn_dbg_info(subsp, dbg);
915
916         mem = new_r_Proj(subsp, mode_M, pn_be_SubSP_M);
917         res = new_r_Proj(subsp, sp_mode, pn_be_SubSP_sp);
918
919         /* we need to sync the memory */
920         in[0] = get_Free_mem(free);
921         in[1] = mem;
922         sync = new_r_Sync(block, 2, in);
923
924         /* and make the AddSP dependent on the former memory */
925         add_irn_dep(subsp, get_Free_mem(free));
926
927         /* kill the free */
928         exchange(free, sync);
929         curr_sp = res;
930
931         return curr_sp;
932 }
933
934 /**
935  * Check if a node is somehow data dependent on another one.
936  * both nodes must be in the same basic block.
937  * @param n1 The first node.
938  * @param n2 The second node.
939  * @return 1, if n1 is data dependent (transitively) on n2, 0 if not.
940  */
941 static int dependent_on(ir_node *n1, ir_node *n2)
942 {
943         assert(get_nodes_block(n1) == get_nodes_block(n2));
944
945         return heights_reachable_in_block(ir_heights, n1, n2);
946 }
947
948 static int cmp_call_dependency(const void *c1, const void *c2)
949 {
950         ir_node *n1 = *(ir_node **) c1;
951         ir_node *n2 = *(ir_node **) c2;
952         unsigned h1, h2;
953
954         /*
955                 Classical qsort() comparison function behavior:
956                 0  if both elements are equal
957                 1  if second is "smaller" that first
958                 -1 if first is "smaller" that second
959         */
960         if (dependent_on(n1, n2))
961                 return -1;
962
963         if (dependent_on(n2, n1))
964                 return 1;
965
966         /* The nodes have no depth order, but we need a total order because qsort()
967          * is not stable.
968          *
969          * Additionally, we need to respect transitive dependencies. Consider a
970          * Call a depending on Call b and an independent Call c.
971          * We MUST NOT order c > a and b > c. */
972         h1 = get_irn_height(ir_heights, n1);
973         h2 = get_irn_height(ir_heights, n2);
974         if (h1 < h2) return -1;
975         if (h1 > h2) return  1;
976         /* Same height, so use a random (but stable) order */
977         return get_irn_idx(n1) - get_irn_idx(n2);
978 }
979
980 /**
981  * Walker: links all Call/Alloc/Free nodes to the Block they are contained.
982  */
983 static void link_ops_in_block_walker(ir_node *irn, void *data)
984 {
985         be_abi_irg_t *env  = (be_abi_irg_t*)data;
986         unsigned      code = get_irn_opcode(irn);
987
988         if (code == iro_Call ||
989            (code == iro_Alloc && get_Alloc_where(irn) == stack_alloc) ||
990            (code == iro_Free && get_Free_where(irn) == stack_alloc)) {
991                 ir_node *bl       = get_nodes_block(irn);
992                 void *save        = get_irn_link(bl);
993
994                 set_irn_link(irn, save);
995                 set_irn_link(bl, irn);
996         }
997
998         if (code == iro_Builtin && get_Builtin_kind(irn) == ir_bk_return_address) {
999                 ir_node       *param = get_Builtin_param(irn, 0);
1000                 ir_tarval     *tv    = get_Const_tarval(param);
1001                 unsigned long  value = get_tarval_long(tv);
1002                 /* use ebp, so the climbframe algo works... */
1003                 if (value > 0) {
1004                         env->call->flags.bits.try_omit_fp = 0;
1005                 }
1006         }
1007 }
1008
1009 /**
1010  * Block-walker:
1011  * Process all Call/Alloc/Free nodes inside a basic block.
1012  * Note that the link field of the block must contain a linked list of all
1013  * nodes inside the Block. We first order this list according to data dependency
1014  * and that connect the nodes together.
1015  */
1016 static void process_ops_in_block(ir_node *bl, void *data)
1017 {
1018         be_abi_irg_t   *env     = (be_abi_irg_t*)data;
1019         ir_node        *curr_sp = env->init_sp;
1020         ir_node        *irn;
1021         ir_node       **nodes;
1022         int             n;
1023         int             n_nodes;
1024
1025         n_nodes = 0;
1026         for (irn = (ir_node*)get_irn_link(bl); irn != NULL;
1027              irn = (ir_node*)get_irn_link(irn)) {
1028                 ++n_nodes;
1029         }
1030
1031         nodes = ALLOCAN(ir_node*, n_nodes);
1032         for (irn = (ir_node*)get_irn_link(bl), n = 0; irn != NULL;
1033              irn = (ir_node*)get_irn_link(irn), ++n) {
1034                 nodes[n] = irn;
1035         }
1036
1037         /* If there were call nodes in the block. */
1038         if (n > 0) {
1039                 ir_node *keep;
1040                 int i;
1041
1042                 /* order the call nodes according to data dependency */
1043                 qsort(nodes, n_nodes, sizeof(nodes[0]), cmp_call_dependency);
1044
1045                 for (i = n_nodes - 1; i >= 0; --i) {
1046                         ir_node *irn = nodes[i];
1047
1048                         DBG((dbg, LEVEL_3, "\tprocessing call %+F\n", irn));
1049                         switch (get_irn_opcode(irn)) {
1050                         case iro_Call:
1051                                 if (! be_omit_fp) {
1052                                         /* The stack pointer will be modified due to a call. */
1053                                         env->call->flags.bits.try_omit_fp = 0;
1054                                 }
1055                                 curr_sp = adjust_call(env, irn, curr_sp);
1056                                 break;
1057                         case iro_Alloc:
1058                                 if (get_Alloc_where(irn) == stack_alloc)
1059                                         curr_sp = adjust_alloc(env, irn, curr_sp);
1060                                 break;
1061                         case iro_Free:
1062                                 if (get_Free_where(irn) == stack_alloc)
1063                                         curr_sp = adjust_free(env, irn, curr_sp);
1064                                 break;
1065                         default:
1066                                 panic("invalid call");
1067                         }
1068                 }
1069
1070                 /* Keep the last stack state in the block by tying it to Keep node,
1071                  * the proj from calls is already kept */
1072                 if (curr_sp != env->init_sp &&
1073                     !(is_Proj(curr_sp) && be_is_Call(get_Proj_pred(curr_sp)))) {
1074                         nodes[0] = curr_sp;
1075                         keep     = be_new_Keep(bl, 1, nodes);
1076                         pmap_insert(env->keep_map, bl, keep);
1077                 }
1078         }
1079
1080         set_irn_link(bl, curr_sp);
1081 }
1082
1083 /**
1084  * Adjust all call nodes in the graph to the ABI conventions.
1085  */
1086 static void process_calls(ir_graph *irg)
1087 {
1088         be_abi_irg_t *abi = be_get_irg_abi(irg);
1089
1090         irg_walk_graph(irg, firm_clear_link, link_ops_in_block_walker, abi);
1091
1092         ir_heights = heights_new(irg);
1093         irg_block_walk_graph(irg, NULL, process_ops_in_block, abi);
1094         heights_free(ir_heights);
1095 }
1096
1097 /**
1098  * Computes the stack argument layout type.
1099  * Changes a possibly allocated value param type by moving
1100  * entities to the stack layout type.
1101  *
1102  * @param call          the current call ABI
1103  * @param method_type   the method type
1104  *
1105  * @return the stack argument layout type
1106  */
1107 static ir_type *compute_arg_type(ir_graph *irg, be_abi_call_t *call,
1108                                                                  ir_type *method_type)
1109 {
1110         struct obstack *obst = be_get_be_obst(irg);
1111         ir_type   *frame_type      = get_irg_frame_type(irg);
1112         size_t     n_params        = get_method_n_params(method_type);
1113         size_t     n_frame_members = get_compound_n_members(frame_type);
1114         ir_entity *va_start_entity = NULL;
1115         size_t   f;
1116         int      ofs  = 0;
1117
1118         ir_type *res;
1119         size_t i;
1120         ir_entity **map = OALLOCNZ(obst, ir_entity*, n_params);
1121         res = new_type_struct(new_id_from_chars("arg_type", 8));
1122
1123         /* collect existing entities for value_param_types */
1124         for (f = n_frame_members; f > 0; ) {
1125                 ir_entity *entity = get_compound_member(frame_type, --f);
1126                 size_t     num;
1127
1128                 set_entity_link(entity, NULL);
1129                 if (!is_parameter_entity(entity))
1130                         continue;
1131                 num = get_entity_parameter_number(entity);
1132                 if (num == IR_VA_START_PARAMETER_NUMBER) {
1133                         /* move entity to new arg_type */
1134                         set_entity_owner(entity, res);
1135                         va_start_entity = entity;
1136                         continue;
1137                 }
1138                 assert(num < n_params);
1139                 if (map[num] != NULL)
1140                         panic("multiple entities for parameter %u in %+F found", f, irg);
1141
1142                 if (num != n_params && !get_call_arg(call, 0, num, 1)->on_stack) {
1143                         /* don't move this entity */
1144                         continue;
1145                 }
1146
1147                 map[num] = entity;
1148                 /* move entity to new arg_type */
1149                 set_entity_owner(entity, res);
1150         }
1151
1152         for (i = 0; i < n_params; ++i) {
1153                 be_abi_call_arg_t *arg        = get_call_arg(call, 0, i, 1);
1154                 ir_type           *param_type = get_method_param_type(method_type, i);
1155                 ir_entity         *entity;
1156
1157                 if (!arg->on_stack) {
1158                         continue;
1159                 }
1160                 entity = map[i];
1161                 if (entity == NULL) {
1162                         /* create a new entity */
1163                         entity = new_parameter_entity(res, i, param_type);
1164                 }
1165                 ofs += arg->space_before;
1166                 ofs = round_up2(ofs, arg->alignment);
1167                 set_entity_offset(entity, ofs);
1168                 ofs += arg->space_after;
1169                 ofs += get_type_size_bytes(param_type);
1170                 arg->stack_ent = entity;
1171         }
1172         if (va_start_entity != NULL) {
1173                 set_entity_offset(va_start_entity, ofs);
1174         }
1175         set_type_size_bytes(res, ofs);
1176         set_type_state(res, layout_fixed);
1177
1178         return res;
1179 }
1180
1181 typedef struct {
1182         const arch_register_t *reg;
1183         ir_node *irn;
1184 } reg_node_map_t;
1185
1186 static int cmp_regs(const void *a, const void *b)
1187 {
1188         const reg_node_map_t *p = (const reg_node_map_t*)a;
1189         const reg_node_map_t *q = (const reg_node_map_t*)b;
1190
1191         if (p->reg->reg_class == q->reg->reg_class)
1192                 return p->reg->index - q->reg->index;
1193         else
1194                 return p->reg->reg_class < q->reg->reg_class ? -1 : +1;
1195 }
1196
1197 static void reg_map_to_arr(reg_node_map_t *res, pmap *reg_map)
1198 {
1199         pmap_entry *ent;
1200         size_t n = pmap_count(reg_map);
1201         size_t i = 0;
1202
1203         foreach_pmap(reg_map, ent) {
1204                 res[i].reg = (const arch_register_t*)ent->key;
1205                 res[i].irn = (ir_node*)ent->value;
1206                 i++;
1207         }
1208
1209         qsort(res, n, sizeof(res[0]), cmp_regs);
1210 }
1211
1212 /**
1213  * Creates a be_Return for a Return node.
1214  *
1215  * @param @env  the abi environment
1216  * @param irn   the Return node or NULL if there was none
1217  * @param bl    the block where the be_Retun should be placed
1218  * @param mem   the current memory
1219  * @param n_res number of return results
1220  */
1221 static ir_node *create_be_return(be_abi_irg_t *env, ir_node *irn, ir_node *bl,
1222                 ir_node *mem, int n_res)
1223 {
1224         be_abi_call_t    *call     = env->call;
1225         ir_graph         *irg      = get_Block_irg(bl);
1226         const arch_env_t *arch_env = be_get_irg_arch_env(irg);
1227         dbg_info *dbgi;
1228         pmap *reg_map  = pmap_create();
1229         ir_node *keep  = pmap_get(ir_node, env->keep_map, bl);
1230         size_t in_max;
1231         ir_node *ret;
1232         int i, n;
1233         unsigned pop;
1234         ir_node **in;
1235         ir_node *stack;
1236         const arch_register_t **regs;
1237         pmap_entry *ent;
1238
1239         /*
1240                 get the valid stack node in this block.
1241                 If we had a call in that block there is a Keep constructed by process_calls()
1242                 which points to the last stack modification in that block. we'll use
1243                 it then. Else we use the stack from the start block and let
1244                 the ssa construction fix the usage.
1245         */
1246         stack = be_abi_reg_map_get(env->regs, arch_env->sp);
1247         if (keep) {
1248                 stack = get_irn_n(keep, 0);
1249                 kill_node(keep);
1250                 remove_End_keepalive(get_irg_end(irg), keep);
1251         }
1252
1253         /* Insert results for Return into the register map. */
1254         for (i = 0; i < n_res; ++i) {
1255                 ir_node *res           = get_Return_res(irn, i);
1256                 be_abi_call_arg_t *arg = get_call_arg(call, 1, i, 1);
1257                 assert(arg->in_reg && "return value must be passed in register");
1258                 pmap_insert(reg_map, (void *) arg->reg, res);
1259         }
1260
1261         /* Add uses of the callee save registers. */
1262         foreach_pmap(env->regs, ent) {
1263                 const arch_register_t *reg = (const arch_register_t*)ent->key;
1264                 if ((reg->type & arch_register_type_ignore) || arch_register_is_callee_save(arch_env, reg))
1265                         pmap_insert(reg_map, ent->key, ent->value);
1266         }
1267
1268         be_abi_reg_map_set(reg_map, arch_env->sp, stack);
1269
1270         /*
1271                 Maximum size of the in array for Return nodes is
1272                 return args + callee save/ignore registers + memory + stack pointer
1273         */
1274         in_max = pmap_count(reg_map) + n_res + 2;
1275
1276         in   = ALLOCAN(ir_node*,               in_max);
1277         regs = ALLOCAN(arch_register_t const*, in_max);
1278
1279         in[0]   = mem;
1280         in[1]   = be_abi_reg_map_get(reg_map, arch_env->sp);
1281         regs[0] = NULL;
1282         regs[1] = arch_env->sp;
1283         n       = 2;
1284
1285         /* clear SP entry, since it has already been grown. */
1286         pmap_insert(reg_map, (void *) arch_env->sp, NULL);
1287         for (i = 0; i < n_res; ++i) {
1288                 be_abi_call_arg_t *arg = get_call_arg(call, 1, i, 1);
1289
1290                 in[n]     = be_abi_reg_map_get(reg_map, arg->reg);
1291                 regs[n++] = arg->reg;
1292
1293                 /* Clear the map entry to mark the register as processed. */
1294                 be_abi_reg_map_set(reg_map, arg->reg, NULL);
1295         }
1296
1297         /* grow the rest of the stuff. */
1298         foreach_pmap(reg_map, ent) {
1299                 if (ent->value) {
1300                         in[n]     = (ir_node*)ent->value;
1301                         regs[n++] = (const arch_register_t*)ent->key;
1302                 }
1303         }
1304
1305         /* The in array for the new back end return is now ready. */
1306         if (irn != NULL) {
1307                 dbgi = get_irn_dbg_info(irn);
1308         } else {
1309                 dbgi = NULL;
1310         }
1311         /* we have to pop the shadow parameter in in case of struct returns */
1312         pop = call->pop;
1313         ret = be_new_Return(dbgi, irg, bl, n_res, pop, n, in);
1314
1315         /* Set the register classes of the return's parameter accordingly. */
1316         for (i = 0; i < n; ++i) {
1317                 if (regs[i] == NULL)
1318                         continue;
1319
1320                 be_set_constr_single_reg_in(ret, i, regs[i], arch_register_req_type_none);
1321         }
1322
1323         /* Free the space of the Epilog's in array and the register <-> proj map. */
1324         pmap_destroy(reg_map);
1325
1326         return ret;
1327 }
1328
1329 typedef struct lower_frame_sels_env_t {
1330         ir_node      *frame;                     /**< the current frame */
1331         const arch_register_class_t *sp_class;   /**< register class of the stack pointer */
1332         const arch_register_class_t *link_class; /**< register class of the link pointer */
1333         ir_type      *frame_tp;                  /**< the frame type */
1334         int          static_link_pos;            /**< argument number of the hidden static link */
1335 } lower_frame_sels_env_t;
1336
1337 /**
1338  * Walker: Replaces Sels of frame type and
1339  * value param type entities by FrameAddress.
1340  * Links all used entities.
1341  */
1342 static void lower_frame_sels_walker(ir_node *irn, void *data)
1343 {
1344         lower_frame_sels_env_t *ctx = (lower_frame_sels_env_t*)data;
1345
1346         if (is_Sel(irn)) {
1347                 ir_node *ptr = get_Sel_ptr(irn);
1348
1349                 if (ptr == ctx->frame) {
1350                         ir_entity    *ent = get_Sel_entity(irn);
1351                         ir_node      *bl  = get_nodes_block(irn);
1352                         ir_node      *nw;
1353
1354                         nw = be_new_FrameAddr(ctx->sp_class, bl, ctx->frame, ent);
1355                         exchange(irn, nw);
1356                 }
1357         }
1358 }
1359
1360 /**
1361  * The start block has no jump, instead it has an initial exec Proj.
1362  * The backend wants to handle all blocks the same way, so we replace
1363  * the out cfg edge with a real jump.
1364  */
1365 static void fix_start_block(ir_graph *irg)
1366 {
1367         ir_node *initial_X   = get_irg_initial_exec(irg);
1368         ir_node *start_block = get_irg_start_block(irg);
1369         ir_node *jmp         = new_r_Jmp(start_block);
1370
1371         assert(is_Proj(initial_X));
1372         exchange(initial_X, jmp);
1373         set_irg_initial_exec(irg, new_r_Bad(irg, mode_X));
1374
1375         /* merge start block with successor if possible */
1376         {
1377                 foreach_out_edge(jmp, edge) {
1378                         ir_node *succ = get_edge_src_irn(edge);
1379                         if (!is_Block(succ))
1380                                 continue;
1381
1382                         if (get_irn_arity(succ) == 1) {
1383                                 exchange(succ, start_block);
1384                         }
1385                         break;
1386                 }
1387         }
1388 }
1389
1390 /**
1391  * Modify the irg itself and the frame type.
1392  */
1393 static void modify_irg(ir_graph *irg)
1394 {
1395         be_abi_irg_t          *env          = be_get_irg_abi(irg);
1396         be_abi_call_t         *call         = env->call;
1397         const arch_env_t      *arch_env     = be_get_irg_arch_env(irg);
1398         const arch_register_t *sp           = arch_env->sp;
1399         ir_type               *method_type  = get_entity_type(get_irg_entity(irg));
1400         be_irg_t              *birg         = be_birg_from_irg(irg);
1401         struct obstack        *obst         = be_get_be_obst(irg);
1402         be_stack_layout_t     *stack_layout = be_get_irg_stack_layout(irg);
1403         ir_node *end;
1404         ir_node *old_mem;
1405         ir_node *new_mem_proj;
1406         ir_node *mem;
1407
1408         int n_params;
1409         int i, n;
1410         unsigned j;
1411         unsigned frame_size;
1412
1413         reg_node_map_t *rm;
1414         const arch_register_t *fp_reg;
1415         ir_node *frame_pointer;
1416         ir_node *start_bl;
1417         ir_node **args;
1418         ir_node *arg_tuple;
1419         ir_type *arg_type, *bet_type;
1420         lower_frame_sels_env_t ctx;
1421
1422         DBG((dbg, LEVEL_1, "introducing abi on %+F\n", irg));
1423
1424         old_mem = get_irg_initial_mem(irg);
1425
1426         irp_reserve_resources(irp, IRP_RESOURCE_ENTITY_LINK);
1427
1428         arg_type = compute_arg_type(irg, call, method_type);
1429
1430         /* Convert the Sel nodes in the irg to frame addr nodes: */
1431         ctx.frame            = get_irg_frame(irg);
1432         ctx.sp_class         = arch_env->sp->reg_class;
1433         ctx.link_class       = arch_env->link_class;
1434         ctx.frame_tp         = get_irg_frame_type(irg);
1435
1436         /* layout the stackframe now */
1437         if (get_type_state(ctx.frame_tp) == layout_undefined) {
1438                 default_layout_compound_type(ctx.frame_tp);
1439         }
1440
1441         /* align stackframe to 4 byte */
1442         frame_size = get_type_size_bytes(ctx.frame_tp);
1443         if (frame_size % 4 != 0) {
1444                 set_type_size_bytes(ctx.frame_tp, frame_size + 4 - (frame_size % 4));
1445         }
1446
1447         env->regs  = pmap_create();
1448
1449         n_params = get_method_n_params(method_type);
1450         args     = OALLOCNZ(obst, ir_node*, n_params);
1451
1452         be_add_parameter_entity_stores(irg);
1453
1454         irg_walk_graph(irg, lower_frame_sels_walker, NULL, &ctx);
1455
1456         irp_free_resources(irp, IRP_RESOURCE_ENTITY_LINK);
1457
1458         /* Fill the argument vector */
1459         arg_tuple = get_irg_args(irg);
1460         foreach_out_edge(arg_tuple, edge) {
1461                 ir_node *irn = get_edge_src_irn(edge);
1462                 if (! is_Anchor(irn)) {
1463                         int nr       = get_Proj_proj(irn);
1464                         args[nr]     = irn;
1465                         DBG((dbg, LEVEL_2, "\treading arg: %d -> %+F\n", nr, irn));
1466                 }
1467         }
1468
1469         stack_layout->sp_relative = call->flags.bits.try_omit_fp;
1470         bet_type = call->cb->get_between_type(irg);
1471         stack_frame_init(stack_layout, arg_type, bet_type,
1472                          get_irg_frame_type(irg));
1473
1474         /* Count the register params and add them to the number of Projs for the RegParams node */
1475         for (i = 0; i < n_params; ++i) {
1476                 be_abi_call_arg_t *arg = get_call_arg(call, 0, i, 1);
1477                 if (arg->in_reg && args[i]) {
1478                         assert(arg->reg != sp && "cannot use stack pointer as parameter register");
1479                         assert(i == get_Proj_proj(args[i]));
1480
1481                         /* For now, associate the register with the old Proj from Start representing that argument. */
1482                         pmap_insert(env->regs, (void *) arg->reg, args[i]);
1483                         DBG((dbg, LEVEL_2, "\targ #%d -> reg %s\n", i, arg->reg->name));
1484                 }
1485         }
1486
1487         /* Collect all callee-save registers */
1488         for (i = 0, n = arch_env->n_register_classes; i < n; ++i) {
1489                 const arch_register_class_t *cls = &arch_env->register_classes[i];
1490                 for (j = 0; j < cls->n_regs; ++j) {
1491                         const arch_register_t *reg = &cls->regs[j];
1492                         if ((reg->type & arch_register_type_state) || arch_register_is_callee_save(arch_env, reg)) {
1493                                 pmap_insert(env->regs, (void *) reg, NULL);
1494                         }
1495                 }
1496         }
1497
1498         fp_reg = call->flags.bits.try_omit_fp ? arch_env->sp : arch_env->bp;
1499         rbitset_clear(birg->allocatable_regs, fp_reg->global_index);
1500
1501         /* handle start block here (place a jump in the block) */
1502         fix_start_block(irg);
1503
1504         pmap_insert(env->regs, (void *) sp, NULL);
1505         pmap_insert(env->regs, (void *) arch_env->bp, NULL);
1506         start_bl   = get_irg_start_block(irg);
1507         env->start = be_new_Start(NULL, start_bl, pmap_count(env->regs) + 1);
1508         set_irg_start(irg, env->start);
1509
1510         /*
1511          * make proj nodes for the callee save registers.
1512          * memorize them, since Return nodes get those as inputs.
1513          *
1514          * Note, that if a register corresponds to an argument, the regs map
1515          * contains the old Proj from start for that argument.
1516          */
1517         rm = ALLOCAN(reg_node_map_t, pmap_count(env->regs));
1518         reg_map_to_arr(rm, env->regs);
1519         for (i = 0, n = pmap_count(env->regs); i < n; ++i) {
1520                 const arch_register_t    *reg      = rm[i].reg;
1521                 ir_mode                  *mode     = reg->reg_class->mode;
1522                 long                      nr       = i;
1523                 arch_register_req_type_t  add_type = arch_register_req_type_none;
1524                 ir_node                  *proj;
1525
1526                 if (reg == sp)
1527                         add_type |= arch_register_req_type_produces_sp;
1528                 if (!rbitset_is_set(birg->allocatable_regs, reg->global_index)) {
1529                         add_type |= arch_register_req_type_ignore;
1530                 }
1531
1532                 assert(nr >= 0);
1533                 proj = new_r_Proj(env->start, mode, nr + 1);
1534                 pmap_insert(env->regs, (void *) reg, proj);
1535                 be_set_constr_single_reg_out(env->start, nr + 1, reg, add_type);
1536                 arch_set_irn_register(proj, reg);
1537
1538                 DBG((dbg, LEVEL_2, "\tregister save proj #%d -> reg %s\n", nr, reg->name));
1539         }
1540
1541         /* create a new initial memory proj */
1542         assert(is_Proj(old_mem));
1543         arch_set_irn_register_req_out(env->start, 0, arch_no_register_req);
1544         new_mem_proj = new_r_Proj(env->start, mode_M, 0);
1545         mem = new_mem_proj;
1546         set_irg_initial_mem(irg, mem);
1547
1548         env->init_sp = be_abi_reg_map_get(env->regs, sp);
1549
1550         /* set new frame_pointer */
1551         frame_pointer = be_abi_reg_map_get(env->regs, fp_reg);
1552         set_irg_frame(irg, frame_pointer);
1553
1554         /* rewire old mem users to new mem */
1555         exchange(old_mem, mem);
1556
1557         /* keep the mem (for functions with an endless loop = no return) */
1558         keep_alive(mem);
1559
1560         set_irg_initial_mem(irg, mem);
1561
1562         /* Now, introduce stack param nodes for all parameters passed on the stack */
1563         for (i = 0; i < n_params; ++i) {
1564                 ir_node *arg_proj = args[i];
1565                 ir_node *repl     = NULL;
1566
1567                 if (arg_proj != NULL) {
1568                         be_abi_call_arg_t *arg;
1569                         ir_type *param_type;
1570                         int     nr = get_Proj_proj(arg_proj);
1571                         ir_mode *mode;
1572
1573                         nr         = MIN(nr, n_params);
1574                         arg        = get_call_arg(call, 0, nr, 1);
1575                         param_type = get_method_param_type(method_type, nr);
1576
1577                         if (arg->in_reg) {
1578                                 repl = pmap_get(ir_node, env->regs, arg->reg);
1579                         } else if (arg->on_stack) {
1580                                 ir_node *addr = be_new_FrameAddr(sp->reg_class, start_bl, frame_pointer, arg->stack_ent);
1581
1582                                 /* For atomic parameters which are actually used, we create a Load node. */
1583                                 if (is_atomic_type(param_type) && get_irn_n_edges(args[i]) > 0) {
1584                                         ir_mode *mode      = get_type_mode(param_type);
1585                                         ir_mode *load_mode = arg->load_mode;
1586                                         ir_node *nomem     = get_irg_no_mem(irg);
1587
1588                                         ir_node *load = new_r_Load(start_bl, nomem, addr, load_mode, cons_floats);
1589                                         repl = new_r_Proj(load, load_mode, pn_Load_res);
1590
1591                                         if (mode != load_mode) {
1592                                                 repl = new_r_Conv(start_bl, repl, mode);
1593                                         }
1594                                 } else {
1595                                         /* The stack parameter is not primitive (it is a struct or array),
1596                                          * we thus will create a node representing the parameter's address
1597                                          * on the stack. */
1598                                         repl = addr;
1599                                 }
1600                         }
1601
1602                         assert(repl != NULL);
1603
1604                         /* Beware: the mode of the register parameters is always the mode of the register class
1605                            which may be wrong. Add Conv's then. */
1606                         mode = get_irn_mode(args[i]);
1607                         if (mode != get_irn_mode(repl)) {
1608                                 repl = new_r_Conv(get_nodes_block(repl), repl, mode);
1609                         }
1610                         exchange(args[i], repl);
1611                 }
1612         }
1613
1614         /* the arg proj is not needed anymore now and should be only used by the anchor */
1615         assert(get_irn_n_edges(arg_tuple) == 1);
1616         kill_node(arg_tuple);
1617         set_irg_args(irg, new_r_Bad(irg, mode_T));
1618
1619         /* All Return nodes hang on the End node, so look for them there. */
1620         end = get_irg_end_block(irg);
1621         for (i = 0, n = get_Block_n_cfgpreds(end); i < n; ++i) {
1622                 ir_node *irn = get_Block_cfgpred(end, i);
1623
1624                 if (is_Return(irn)) {
1625                         ir_node *blk = get_nodes_block(irn);
1626                         ir_node *mem = get_Return_mem(irn);
1627                         ir_node *ret = create_be_return(env, irn, blk, mem, get_Return_n_ress(irn));
1628                         exchange(irn, ret);
1629                 }
1630         }
1631
1632         /* if we have endless loops here, n might be <= 0. Do NOT create a be_Return then,
1633            the code is dead and will never be executed. */
1634 }
1635
1636 /** Fix the state inputs of calls that still hang on unknowns */
1637 static void fix_call_state_inputs(ir_graph *irg)
1638 {
1639         be_abi_irg_t     *env      = be_get_irg_abi(irg);
1640         const arch_env_t *arch_env = be_get_irg_arch_env(irg);
1641         int i, n, n_states;
1642         arch_register_t **stateregs = NEW_ARR_F(arch_register_t*, 0);
1643
1644         /* Collect caller save registers */
1645         n = arch_env->n_register_classes;
1646         for (i = 0; i < n; ++i) {
1647                 unsigned j;
1648                 const arch_register_class_t *cls = &arch_env->register_classes[i];
1649                 for (j = 0; j < cls->n_regs; ++j) {
1650                         const arch_register_t *reg = arch_register_for_index(cls, j);
1651                         if (reg->type & arch_register_type_state) {
1652                                 ARR_APP1(arch_register_t*, stateregs, (arch_register_t *)reg);
1653                         }
1654                 }
1655         }
1656
1657         n = ARR_LEN(env->calls);
1658         n_states = ARR_LEN(stateregs);
1659         for (i = 0; i < n; ++i) {
1660                 int s, arity;
1661                 ir_node *call = env->calls[i];
1662
1663                 arity = get_irn_arity(call);
1664
1665                 /* the state reg inputs are the last n inputs of the calls */
1666                 for (s = 0; s < n_states; ++s) {
1667                         int inp = arity - n_states + s;
1668                         const arch_register_t *reg = stateregs[s];
1669                         ir_node *regnode = be_abi_reg_map_get(env->regs, reg);
1670
1671                         set_irn_n(call, inp, regnode);
1672                 }
1673         }
1674
1675         DEL_ARR_F(stateregs);
1676 }
1677
1678 /**
1679  * Create a trampoline entity for the given method.
1680  */
1681 static ir_entity *create_trampoline(be_main_env_t *be, ir_entity *method)
1682 {
1683         ir_type   *type   = get_entity_type(method);
1684         ident     *old_id = get_entity_ld_ident(method);
1685         ident     *id     = id_mangle3("", old_id, "$stub");
1686         ir_type   *parent = be->pic_trampolines_type;
1687         ir_entity *ent    = new_entity(parent, old_id, type);
1688         set_entity_ld_ident(ent, id);
1689         set_entity_visibility(ent, ir_visibility_private);
1690
1691         return ent;
1692 }
1693
1694 /**
1695  * Returns the trampoline entity for the given method.
1696  */
1697 static ir_entity *get_trampoline(be_main_env_t *env, ir_entity *method)
1698 {
1699         ir_entity *result = pmap_get(ir_entity, env->ent_trampoline_map, method);
1700         if (result == NULL) {
1701                 result = create_trampoline(env, method);
1702                 pmap_insert(env->ent_trampoline_map, method, result);
1703         }
1704
1705         return result;
1706 }
1707
1708 static ir_entity *create_pic_symbol(be_main_env_t *be, ir_entity *entity)
1709 {
1710         ident     *old_id = get_entity_ld_ident(entity);
1711         ident     *id     = id_mangle3("", old_id, "$non_lazy_ptr");
1712         ir_type   *e_type = get_entity_type(entity);
1713         ir_type   *type   = new_type_pointer(e_type);
1714         ir_type   *parent = be->pic_symbols_type;
1715         ir_entity *ent    = new_entity(parent, old_id, type);
1716         set_entity_ld_ident(ent, id);
1717         set_entity_visibility(ent, ir_visibility_private);
1718
1719         return ent;
1720 }
1721
1722 static ir_entity *get_pic_symbol(be_main_env_t *env, ir_entity *entity)
1723 {
1724         ir_entity *result = pmap_get(ir_entity, env->ent_pic_symbol_map, entity);
1725         if (result == NULL) {
1726                 result = create_pic_symbol(env, entity);
1727                 pmap_insert(env->ent_pic_symbol_map, entity, result);
1728         }
1729
1730         return result;
1731 }
1732
1733
1734
1735 /**
1736  * Returns non-zero if a given entity can be accessed using a relative address.
1737  */
1738 static int can_address_relative(ir_entity *entity)
1739 {
1740         return entity_has_definition(entity) && !(get_entity_linkage(entity) & IR_LINKAGE_MERGE);
1741 }
1742
1743 static ir_node *get_pic_base(ir_graph *irg)
1744 {
1745         const arch_env_t *arch_env = be_get_irg_arch_env(irg);
1746         if (arch_env->impl->get_pic_base == NULL)
1747                 return NULL;
1748         return arch_env->impl->get_pic_base(irg);
1749 }
1750
1751 /** patches SymConsts to work in position independent code */
1752 static void fix_pic_symconsts(ir_node *node, void *data)
1753 {
1754         ir_graph         *irg = get_irn_irg(node);
1755         be_main_env_t    *be  = be_get_irg_main_env(irg);
1756         ir_node          *pic_base;
1757         ir_node          *add;
1758         ir_node          *block;
1759         ir_mode          *mode;
1760         ir_node          *load;
1761         ir_node          *load_res;
1762         int               arity, i;
1763         (void) data;
1764
1765         arity = get_irn_arity(node);
1766         for (i = 0; i < arity; ++i) {
1767                 dbg_info  *dbgi;
1768                 ir_node   *pred = get_irn_n(node, i);
1769                 ir_entity *entity;
1770                 ir_entity *pic_symbol;
1771                 ir_node   *pic_symconst;
1772
1773                 if (!is_SymConst(pred))
1774                         continue;
1775
1776                 entity = get_SymConst_entity(pred);
1777                 block  = get_nodes_block(pred);
1778
1779                 /* calls can jump to relative addresses, so we can directly jump to
1780                    the (relatively) known call address or the trampoline */
1781                 if (i == 1 && is_Call(node)) {
1782                         ir_entity *trampoline;
1783                         ir_node   *trampoline_const;
1784
1785                         if (can_address_relative(entity))
1786                                 continue;
1787
1788                         dbgi             = get_irn_dbg_info(pred);
1789                         trampoline       = get_trampoline(be, entity);
1790                         trampoline_const = new_rd_SymConst_addr_ent(dbgi, irg, mode_P_code,
1791                                                                     trampoline);
1792                         set_irn_n(node, i, trampoline_const);
1793                         continue;
1794                 }
1795
1796                 /* everything else is accessed relative to EIP */
1797                 mode     = get_irn_mode(pred);
1798                 pic_base = get_pic_base(irg);
1799
1800                 /* all ok now for locally constructed stuff */
1801                 if (can_address_relative(entity)) {
1802                         ir_node *add = new_r_Add(block, pic_base, pred, mode);
1803
1804                         /* make sure the walker doesn't visit this add again */
1805                         mark_irn_visited(add);
1806                         set_irn_n(node, i, add);
1807                         continue;
1808                 }
1809
1810                 /* get entry from pic symbol segment */
1811                 dbgi         = get_irn_dbg_info(pred);
1812                 pic_symbol   = get_pic_symbol(be, entity);
1813                 pic_symconst = new_rd_SymConst_addr_ent(dbgi, irg, mode_P_code,
1814                                                         pic_symbol);
1815                 add = new_r_Add(block, pic_base, pic_symconst, mode);
1816                 mark_irn_visited(add);
1817
1818                 /* we need an extra indirection for global data outside our current
1819                    module. The loads are always safe and can therefore float
1820                    and need no memory input */
1821                 load     = new_r_Load(block, get_irg_no_mem(irg), add, mode, cons_floats);
1822                 load_res = new_r_Proj(load, mode, pn_Load_res);
1823
1824                 set_irn_n(node, i, load_res);
1825         }
1826 }
1827
1828 void be_abi_introduce(ir_graph *irg)
1829 {
1830         be_abi_irg_t     *env         = XMALLOCZ(be_abi_irg_t);
1831         ir_node          *old_frame   = get_irg_frame(irg);
1832         const arch_env_t *arch_env    = be_get_irg_arch_env(irg);
1833         ir_entity        *entity      = get_irg_entity(irg);
1834         ir_type          *method_type = get_entity_type(entity);
1835         be_irg_t         *birg        = be_birg_from_irg(irg);
1836         struct obstack   *obst        = &birg->obst;
1837         ir_node          *dummy       = new_r_Dummy(irg,
1838                                                     arch_env->sp->reg_class->mode);
1839         unsigned          r;
1840
1841         /* determine allocatable registers */
1842         assert(birg->allocatable_regs == NULL);
1843         birg->allocatable_regs = rbitset_obstack_alloc(obst, arch_env->n_registers);
1844         for (r = 0; r < arch_env->n_registers; ++r) {
1845                 const arch_register_t *reg = &arch_env->registers[r];
1846                 if ( !(reg->type & arch_register_type_ignore)) {
1847                         rbitset_set(birg->allocatable_regs, r);
1848                 }
1849         }
1850
1851         /* break here if backend provides a custom API.
1852          * Note: we shouldn't have to setup any be_abi_irg_t* stuff at all,
1853          * but need more cleanup to make this work
1854          */
1855         be_set_irg_abi(irg, env);
1856
1857         be_omit_fp        = be_options.omit_fp;
1858
1859         env->keep_map     = pmap_create();
1860         env->call         = be_abi_call_new(arch_env->sp->reg_class);
1861         arch_env_get_call_abi(arch_env, method_type, env->call);
1862
1863         env->init_sp = dummy;
1864         env->calls   = NEW_ARR_F(ir_node*, 0);
1865
1866         assure_edges(irg);
1867
1868         if (be_options.pic) {
1869                 irg_walk_graph(irg, fix_pic_symconsts, NULL, env);
1870         }
1871
1872         /* Lower all call nodes in the IRG. */
1873         process_calls(irg);
1874
1875         /* Process the IRG */
1876         modify_irg(irg);
1877
1878         /* fix call inputs for state registers */
1879         fix_call_state_inputs(irg);
1880
1881         /* We don't need the keep map anymore. */
1882         pmap_destroy(env->keep_map);
1883         env->keep_map = NULL;
1884
1885         /* calls array is not needed anymore */
1886         DEL_ARR_F(env->calls);
1887         env->calls = NULL;
1888
1889         /* reroute the stack origin of the calls to the true stack origin. */
1890         exchange(dummy, env->init_sp);
1891         exchange(old_frame, get_irg_frame(irg));
1892
1893         pmap_destroy(env->regs);
1894         env->regs = NULL;
1895 }
1896
1897 void be_abi_free(ir_graph *irg)
1898 {
1899         be_abi_irg_t *env = be_get_irg_abi(irg);
1900
1901         if (env->call != NULL)
1902                 be_abi_call_free(env->call);
1903         assert(env->regs == NULL);
1904         free(env);
1905
1906         be_set_irg_abi(irg, NULL);
1907 }
1908
1909 void be_put_allocatable_regs(const ir_graph *irg,
1910                              const arch_register_class_t *cls, bitset_t *bs)
1911 {
1912         be_irg_t *birg             = be_birg_from_irg(irg);
1913         unsigned *allocatable_regs = birg->allocatable_regs;
1914         unsigned  i;
1915
1916         assert(bitset_size(bs) == cls->n_regs);
1917         bitset_clear_all(bs);
1918         for (i = 0; i < cls->n_regs; ++i) {
1919                 const arch_register_t *reg = &cls->regs[i];
1920                 if (rbitset_is_set(allocatable_regs, reg->global_index))
1921                         bitset_set(bs, i);
1922         }
1923 }
1924
1925 unsigned be_get_n_allocatable_regs(const ir_graph *irg,
1926                                    const arch_register_class_t *cls)
1927 {
1928         bitset_t *bs = bitset_alloca(cls->n_regs);
1929         be_put_allocatable_regs(irg, cls, bs);
1930         return bitset_popcount(bs);
1931 }
1932
1933 void be_set_allocatable_regs(const ir_graph *irg,
1934                              const arch_register_class_t *cls,
1935                              unsigned *raw_bitset)
1936 {
1937         be_irg_t *birg             = be_birg_from_irg(irg);
1938         unsigned *allocatable_regs = birg->allocatable_regs;
1939         unsigned  i;
1940
1941         rbitset_clear_all(raw_bitset, cls->n_regs);
1942         for (i = 0; i < cls->n_regs; ++i) {
1943                 const arch_register_t *reg = &cls->regs[i];
1944                 if (rbitset_is_set(allocatable_regs, reg->global_index))
1945                         rbitset_set(raw_bitset, i);
1946         }
1947 }
1948
1949 BE_REGISTER_MODULE_CONSTRUCTOR(be_init_abi)
1950 void be_init_abi(void)
1951 {
1952         FIRM_DBG_REGISTER(dbg, "firm.be.abi");
1953 }