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