beabi.c 77.3 KB
Newer Older
Christian Würdig's avatar
Christian Würdig committed
1
/*
Michael Beck's avatar
Michael Beck committed
2
 * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
Christian Würdig's avatar
Christian Würdig committed
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 *
 * This file is part of libFirm.
 *
 * This file may be distributed and/or modified under the terms of the
 * GNU General Public License version 2 as published by the Free Software
 * Foundation and appearing in the file LICENSE.GPL included in the
 * packaging of this file.
 *
 * Licensees holding valid libFirm Professional Edition licenses may use
 * this file in accordance with the libFirm Commercial License.
 * Agreement provided with the Software.
 *
 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE.
Christian Würdig's avatar
Christian Würdig committed
18
19
20
21
22
 */

/**
 * @file
 * @brief       Backend ABI implementation.
23
 * @author      Sebastian Hack, Michael Beck
Christian Würdig's avatar
Christian Würdig committed
24
 * @version     $Id$
Sebastian Hack's avatar
Sebastian Hack committed
25
 */
Matthias Braun's avatar
Matthias Braun committed
26
#include "config.h"
27

Sebastian Hack's avatar
Sebastian Hack committed
28
29
#include "obst.h"

30
#include "irgopt.h"
Sebastian Hack's avatar
Sebastian Hack committed
31
32
33
34
35
36
37

#include "irgraph_t.h"
#include "irnode_t.h"
#include "ircons_t.h"
#include "iredges_t.h"
#include "irgmod.h"
#include "irgwalk.h"
Sebastian Hack's avatar
Sebastian Hack committed
38
#include "irprintf_t.h"
39
#include "irgopt.h"
40
#include "irbitset.h"
41
#include "iropt_t.h"
42
43
44
#include "height.h"
#include "pdeq.h"
#include "irtools.h"
Matthias Braun's avatar
Matthias Braun committed
45
#include "raw_bitset.h"
46
#include "error.h"
47
#include "pset_new.h"
Sebastian Hack's avatar
Sebastian Hack committed
48
49
50

#include "be.h"
#include "beabi.h"
51
#include "bearch.h"
52
#include "benode.h"
Sebastian Hack's avatar
Sebastian Hack committed
53
#include "belive_t.h"
54
55
#include "besched.h"
#include "beirg.h"
56
#include "bessaconstr.h"
57
58
59
#include "bemodule.h"

DEBUG_ONLY(static firm_dbg_module_t *dbg;)
Sebastian Hack's avatar
Sebastian Hack committed
60
61

typedef struct _be_abi_call_arg_t {
62
63
64
	unsigned is_res   : 1;  /**< 1: the call argument is a return value. 0: it's a call parameter. */
	unsigned in_reg   : 1;  /**< 1: this argument is transmitted in registers. */
	unsigned on_stack : 1;	/**< 1: this argument is transmitted on the stack. */
65
	unsigned callee   : 1;  /**< 1: someone called us. 0: We call another function */
Sebastian Hack's avatar
Sebastian Hack committed
66

67
	int                    pos;
Sebastian Hack's avatar
Sebastian Hack committed
68
	const arch_register_t *reg;
69
70
71
72
73
	ir_entity             *stack_ent;
	ir_mode               *load_mode;
	unsigned               alignment;    /**< stack alignment */
	unsigned               space_before; /**< allocate space before */
	unsigned               space_after;  /**< allocate space after */
Sebastian Hack's avatar
Sebastian Hack committed
74
75
76
} be_abi_call_arg_t;

struct _be_abi_call_t {
Michael Beck's avatar
Michael Beck committed
77
78
	be_abi_call_flags_t          flags;  /**< Flags describing the ABI behavior on calls */
	int                          pop;    /**< number of bytes the stack frame is shrinked by the callee on return. */
79
80
81
	const be_abi_callbacks_t    *cb;
	ir_type                     *between_type;
	set                         *params;
Michael Beck's avatar
Michael Beck committed
82
	const arch_register_class_t *cls_addr; /**< register class of the call address */
Sebastian Hack's avatar
Sebastian Hack committed
83
84
};

Michael Beck's avatar
Michael Beck committed
85
86
87
/**
 * The ABI information for the current birg.
 */
Sebastian Hack's avatar
Sebastian Hack committed
88
struct _be_abi_irg_t {
89
	be_irg_t             *birg;         /**< The back end IRG. */
90
	ir_graph             *irg;
91
	const arch_env_t     *arch_env;
Sebastian Hack's avatar
Sebastian Hack committed
92
93
	survive_dce_t        *dce_survivor;

Sebastian Hack's avatar
Sebastian Hack committed
94
	be_abi_call_t        *call;         /**< The ABI call information. */
95
	ir_type              *method_type;  /**< The type of the method of the IRG. */
Sebastian Hack's avatar
Sebastian Hack committed
96

Sebastian Hack's avatar
Sebastian Hack committed
97
	ir_node              *init_sp;      /**< The node representing the stack pointer
98
	                                         at the start of the function. */
Sebastian Hack's avatar
Sebastian Hack committed
99

100
	ir_node              *start;        /**< The be_Start params node. */
Sebastian Hack's avatar
Sebastian Hack committed
101
	pmap                 *regs;         /**< A map of all callee-save and ignore regs to
102
	                                         their Projs to the RegParams node. */
Sebastian Hack's avatar
Sebastian Hack committed
103

104
	int                  start_block_bias; /**< The stack bias at the end of the start block. */
Sebastian Hack's avatar
Sebastian Hack committed
105

106
107
	void                 *cb;           /**< ABI Callback self pointer. */

Sebastian Hack's avatar
Sebastian Hack committed
108
109
110
	pmap                 *keep_map;     /**< mapping blocks to keep nodes. */
	pset                 *ignore_regs;  /**< Additional registers which shall be ignored. */

111
	ir_node              **calls;       /**< flexible array containing all be_Call nodes */
112

113
	arch_register_req_t  *sp_req;
114
115

	be_stack_layout_t    frame;         /**< The stack frame model. */
Sebastian Hack's avatar
Sebastian Hack committed
116
};
Sebastian Hack's avatar
Sebastian Hack committed
117

118
static heights_t *ir_heights;
119

120
/** Flag: if set, try to omit the frame pointer in all routines. */
121
static int be_omit_fp = 1;
122

123
124
125
/** Flag: if set, try to omit the frame pointer in leaf routines only. */
static int be_omit_leaf_fp = 1;

Sebastian Hack's avatar
Sebastian Hack committed
126
127
128
129
130
131
/*
     _    ____ ___    ____      _ _ _                _
    / \  | __ )_ _|  / ___|__ _| | | |__   __ _  ___| | _____
   / _ \ |  _ \| |  | |   / _` | | | '_ \ / _` |/ __| |/ / __|
  / ___ \| |_) | |  | |__| (_| | | | |_) | (_| | (__|   <\__ \
 /_/   \_\____/___|  \____\__,_|_|_|_.__/ \__,_|\___|_|\_\___/
132

Sebastian Hack's avatar
Sebastian Hack committed
133
134
135
  These callbacks are used by the backend to set the parameters
  for a specific call type.
*/
Sebastian Hack's avatar
Sebastian Hack committed
136

Michael Beck's avatar
Michael Beck committed
137
138
139
/**
 * Set compare function: compares two ABI call object arguments.
 */
Sebastian Hack's avatar
Sebastian Hack committed
140
141
142
static int cmp_call_arg(const void *a, const void *b, size_t n)
{
	const be_abi_call_arg_t *p = a, *q = b;
143
	(void) n;
144
	return !(p->is_res == q->is_res && p->pos == q->pos && p->callee == q->callee);
Sebastian Hack's avatar
Sebastian Hack committed
145
146
}

Michael Beck's avatar
Michael Beck committed
147
/**
Michael Beck's avatar
Michael Beck committed
148
 * Get  an ABI call object argument.
Michael Beck's avatar
Michael Beck committed
149
150
151
152
 *
 * @param call      the abi call
 * @param is_res    true for call results, false for call arguments
 * @param pos       position of the argument
153
 * @param callee	context type - if we are callee or caller
Michael Beck's avatar
Michael Beck committed
154
 */
155
static be_abi_call_arg_t *get_call_arg(be_abi_call_t *call, int is_res, int pos, int callee)
Sebastian Hack's avatar
Sebastian Hack committed
156
157
158
159
{
	be_abi_call_arg_t arg;
	unsigned hash;

160
	memset(&arg, 0, sizeof(arg));
Sebastian Hack's avatar
Sebastian Hack committed
161
162
	arg.is_res = is_res;
	arg.pos    = pos;
163
	arg.callee = callee;
Sebastian Hack's avatar
Sebastian Hack committed
164

Michael Beck's avatar
Michael Beck committed
165
	hash = is_res * 128 + pos;
Sebastian Hack's avatar
Sebastian Hack committed
166

Michael Beck's avatar
Michael Beck committed
167
	return set_find(call->params, &arg, sizeof(arg), hash);
Sebastian Hack's avatar
Sebastian Hack committed
168
169
}

Michael Beck's avatar
Michael Beck committed
170
/**
Michael Beck's avatar
Michael Beck committed
171
 * Set an ABI call object argument.
Michael Beck's avatar
Michael Beck committed
172
 */
173
static void remember_call_arg(be_abi_call_arg_t *arg, be_abi_call_t *call, be_abi_context_t context)
Sebastian Hack's avatar
Sebastian Hack committed
174
{
175
176
177
178
179
180
181
182
183
	unsigned hash = arg->is_res * 128 + arg->pos;
	if (context & ABI_CONTEXT_CALLEE) {
		arg->callee = 1;
		set_insert(call->params, arg, sizeof(*arg), hash);
	}
	if (context & ABI_CONTEXT_CALLER) {
		arg->callee = 0;
		set_insert(call->params, arg, sizeof(*arg), hash);
	}
Sebastian Hack's avatar
Sebastian Hack committed
184
185
}

Michael Beck's avatar
Michael Beck committed
186
/* Set the flags for a call. */
187
void be_abi_call_set_flags(be_abi_call_t *call, be_abi_call_flags_t flags, const be_abi_callbacks_t *cb)
Sebastian Hack's avatar
Sebastian Hack committed
188
{
189
190
	call->flags = flags;
	call->cb    = cb;
Sebastian Hack's avatar
Sebastian Hack committed
191
192
}

Michael Beck's avatar
Michael Beck committed
193
/* Sets the number of bytes the stackframe is shrinked by the callee on return */
194
195
196
197
198
void be_abi_call_set_pop(be_abi_call_t *call, int pop)
{
	assert(pop >= 0);
	call->pop = pop;
}
199
200
201
202
203
204
205
206

/* Set register class for call address */
void be_abi_call_set_call_address_reg_class(be_abi_call_t *call, const arch_register_class_t *cls)
{
	call->cls_addr = cls;
}


207
208
209
210
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,
                             be_abi_context_t context)
Sebastian Hack's avatar
Sebastian Hack committed
211
{
212
213
	be_abi_call_arg_t arg;
	memset(&arg, 0, sizeof(arg));
214
	assert(alignment > 0 && "Alignment must be greater than 0");
215
216
217
218
219
220
221
222
223
	arg.on_stack     = 1;
	arg.load_mode    = load_mode;
	arg.alignment    = alignment;
	arg.space_before = space_before;
	arg.space_after  = space_after;
	arg.is_res       = 0;
	arg.pos          = arg_pos;

	remember_call_arg(&arg, call, context);
Sebastian Hack's avatar
Sebastian Hack committed
224
225
}

226
void be_abi_call_param_reg(be_abi_call_t *call, int arg_pos, const arch_register_t *reg, be_abi_context_t context)
Sebastian Hack's avatar
Sebastian Hack committed
227
{
228
229
230
231
232
233
234
235
236
	be_abi_call_arg_t arg;
	memset(&arg, 0, sizeof(arg));

	arg.in_reg = 1;
	arg.reg    = reg;
	arg.is_res = 0;
	arg.pos    = arg_pos;

	remember_call_arg(&arg, call, context);
Sebastian Hack's avatar
Sebastian Hack committed
237
238
}

239
void be_abi_call_res_reg(be_abi_call_t *call, int arg_pos, const arch_register_t *reg, be_abi_context_t context)
Sebastian Hack's avatar
Sebastian Hack committed
240
{
241
242
243
244
245
246
247
248
249
	be_abi_call_arg_t arg;
	memset(&arg, 0, sizeof(arg));

	arg.in_reg = 1;
	arg.reg    = reg;
	arg.is_res = 1;
	arg.pos    = arg_pos;

	remember_call_arg(&arg, call, context);
Sebastian Hack's avatar
Sebastian Hack committed
250
251
}

Michael Beck's avatar
Michael Beck committed
252
/* Get the flags of a ABI call object. */
253
254
255
256
257
be_abi_call_flags_t be_abi_call_get_flags(const be_abi_call_t *call)
{
	return call->flags;
}

Michael Beck's avatar
Michael Beck committed
258
259
260
/**
 * Constructor for a new ABI call object.
 *
Michael Beck's avatar
Michael Beck committed
261
262
 * @param cls_addr  register class of the call address
 *
Michael Beck's avatar
Michael Beck committed
263
264
 * @return the new ABI call object
 */
265
static be_abi_call_t *be_abi_call_new(const arch_register_class_t *cls_addr)
Sebastian Hack's avatar
Sebastian Hack committed
266
{
267
	be_abi_call_t *call = XMALLOCZ(be_abi_call_t);
268

Sebastian Hack's avatar
Sebastian Hack committed
269
270
271
	call->flags.val  = 0;
	call->params     = new_set(cmp_call_arg, 16);
	call->cb         = NULL;
272
	call->cls_addr   = cls_addr;
273

274
	call->flags.bits.try_omit_fp = be_omit_fp | be_omit_leaf_fp;
275

Sebastian Hack's avatar
Sebastian Hack committed
276
277
278
	return call;
}

Michael Beck's avatar
Michael Beck committed
279
280
281
282
/**
 * Destructor for an ABI call object.
 */
static void be_abi_call_free(be_abi_call_t *call)
Sebastian Hack's avatar
Sebastian Hack committed
283
284
285
286
287
{
	del_set(call->params);
	free(call);
}

Sebastian Hack's avatar
Sebastian Hack committed
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
/*
  _____                           _   _                 _ _ _
 |  ___| __ __ _ _ __ ___   ___  | | | | __ _ _ __   __| | (_)_ __   __ _
 | |_ | '__/ _` | '_ ` _ \ / _ \ | |_| |/ _` | '_ \ / _` | | | '_ \ / _` |
 |  _|| | | (_| | | | | | |  __/ |  _  | (_| | | | | (_| | | | | | | (_| |
 |_|  |_|  \__,_|_| |_| |_|\___| |_| |_|\__,_|_| |_|\__,_|_|_|_| |_|\__, |
                                                                    |___/

  Handling of the stack frame. It is composed of three types:
  1) The type of the arguments which are pushed on the stack.
  2) The "between type" which consists of stuff the call of the
     function pushes on the stack (like the return address and
	 the old base pointer for ia32).
  3) The Firm frame type which consists of all local variables
     and the spills.
*/

305
306
static int get_stack_entity_offset(be_stack_layout_t *frame, ir_entity *ent,
                                   int bias)
307
{
308
	ir_type *t = get_entity_owner(ent);
309
	int ofs    = get_entity_offset(ent);
310

311
	int index;
312
313

	/* Find the type the entity is contained in. */
314
315
	for (index = 0; index < N_FRAME_TYPES; ++index) {
		if (frame->order[index] == t)
316
			break;
317
318
		/* Add the size of all the types below the one of the entity to the entity's offset */
		ofs += get_type_size_bytes(frame->order[index]);
319
320
321
322
323
324
325
326
327
328
329
	}

	/* correct the offset by the initial position of the frame pointer */
	ofs -= frame->initial_offset;

	/* correct the offset with the current bias. */
	ofs += bias;

	return ofs;
}

Michael Beck's avatar
Michael Beck committed
330
331
332
/**
 * Retrieve the entity with given offset from a frame type.
 */
333
static ir_entity *search_ent_with_offset(ir_type *t, int offset)
Sebastian Hack's avatar
Sebastian Hack committed
334
335
336
{
	int i, n;

337
	for (i = 0, n = get_compound_n_members(t); i < n; ++i) {
338
		ir_entity *ent = get_compound_member(t, i);
339
		if (get_entity_offset(ent) == offset)
Sebastian Hack's avatar
Sebastian Hack committed
340
341
342
343
344
345
			return ent;
	}

	return NULL;
}

346
static int stack_frame_compute_initial_offset(be_stack_layout_t *frame)
347
{
348
349
	ir_type  *base = frame->stack_dir < 0 ? frame->between_type : frame->frame_type;
	ir_entity *ent = search_ent_with_offset(base, 0);
350

351
352
353
354
355
356
	if (ent == NULL) {
		frame->initial_offset
			= frame->stack_dir < 0 ? get_type_size_bytes(frame->frame_type) : get_type_size_bytes(frame->between_type);
	} else {
		frame->initial_offset = get_stack_entity_offset(frame, ent, 0);
	}
357

358
359
360
	return frame->initial_offset;
}

361
362
363
364
365
366
367
/**
 * Initializes the frame layout from parts
 *
 * @param frame     the stack layout that will be initialized
 * @param args      the stack argument layout type
 * @param between   the between layout type
 * @param locals    the method frame type
368
 * @param stack_dir the stack direction: < 0 decreasing, > 0 increasing addresses
369
 * @param param_map an array mapping method argument positions to the stack argument type
370
371
372
373
 *
 * @return the initialized stack layout
 */
static be_stack_layout_t *stack_frame_init(be_stack_layout_t *frame, ir_type *args,
374
                                           ir_type *between, ir_type *locals, int stack_dir,
375
                                           ir_entity *param_map[])
376
377
378
379
380
{
	frame->arg_type       = args;
	frame->between_type   = between;
	frame->frame_type     = locals;
	frame->initial_offset = 0;
Matthias Braun's avatar
Matthias Braun committed
381
	frame->initial_bias   = 0;
382
383
	frame->stack_dir      = stack_dir;
	frame->order[1]       = between;
384
	frame->param_map      = param_map;
385

386
	if (stack_dir > 0) {
387
388
389
390
		frame->order[0] = args;
		frame->order[2] = locals;
	}
	else {
391
392
		/* typical decreasing stack: locals have the
		 * lowest addresses, arguments the highest */
393
394
395
396
397
398
		frame->order[0] = locals;
		frame->order[2] = args;
	}
	return frame;
}

399
400
401
402
403
404
405
406
407
408
409
/*
   ____      _ _
  / ___|__ _| | |___
 | |   / _` | | / __|
 | |__| (_| | | \__ \
  \____\__,_|_|_|___/

  Adjustment of the calls inside a graph.

*/

Sebastian Hack's avatar
Sebastian Hack committed
410
/**
411
412
 * Transform a call node into a be_Call node.
 *
Sebastian Hack's avatar
Sebastian Hack committed
413
 * @param env The ABI environment for the current irg.
414
415
416
 * @param irn The call node.
 * @param curr_sp The stack pointer node to use.
 * @return The stack pointer after the call.
Sebastian Hack's avatar
Sebastian Hack committed
417
 */
Matthias Braun's avatar
Matthias Braun committed
418
static ir_node *adjust_call(be_abi_irg_t *env, ir_node *irn, ir_node *curr_sp)
Sebastian Hack's avatar
Sebastian Hack committed
419
{
420
	ir_graph *irg              = env->birg->irg;
421
	const arch_env_t *arch_env = env->birg->main_env->arch_env;
422
	ir_type *call_tp           = get_Call_type(irn);
423
	ir_node *call_ptr          = get_Call_ptr(irn);
424
	int n_params               = get_method_n_params(call_tp);
425
426
427
	ir_node *curr_mem          = get_Call_mem(irn);
	ir_node *bl                = get_nodes_block(irn);
	int stack_size             = 0;
428
429
	int stack_dir              = arch_env->stack_dir;
	const arch_register_t *sp  = arch_env->sp;
430
431
	be_abi_call_t *call        = be_abi_call_new(sp->reg_class);
	ir_mode *mach_mode         = sp->reg_class->mode;
432
	struct obstack *obst       = be_get_birg_obst(irg);
433
	int no_alloc               = call->flags.bits.frame_is_setup_on_call;
434
	int n_res                  = get_method_n_ress(call_tp);
435
	int do_seq                 = call->flags.bits.store_args_sequential && !no_alloc;
436
437
438
439
440

	ir_node *res_proj  = NULL;
	int n_reg_params   = 0;
	int n_stack_params = 0;
	int n_ins;
Sebastian Hack's avatar
Sebastian Hack committed
441

442
443
	pset_new_t              destroyed_regs, states;
	pset_new_iterator_t     iter;
444
445
446
447
448
449
450
451
	ir_node                *low_call;
	ir_node               **in;
	ir_node               **res_projs;
	int                     n_reg_results = 0;
	const arch_register_t  *reg;
	const ir_edge_t        *edge;
	int                    *reg_param_idxs;
	int                    *stack_param_idx;
452
	int                     i, n, destroy_all_regs;
453
	dbg_info               *dbgi;
Sebastian Hack's avatar
Sebastian Hack committed
454

455
456
457
	pset_new_init(&destroyed_regs);
	pset_new_init(&states);

Sebastian Hack's avatar
Sebastian Hack committed
458
	/* Let the isa fill out the abi description for that call node. */
459
	arch_env_get_call_abi(arch_env, call_tp, call);
Sebastian Hack's avatar
Sebastian Hack committed
460
461

	/* Insert code to put the stack arguments on the stack. */
462
	assert(get_Call_n_params(irn) == n_params);
463
464
	assert(obstack_object_size(obst) == 0);
	stack_param_idx = ALLOCAN(int, n_params);
465
	for (i = 0; i < n_params; ++i) {
466
		be_abi_call_arg_t *arg = get_call_arg(call, 0, i, 0);
467
		assert(arg);
Michael Beck's avatar
Michael Beck committed
468
		if (arg->on_stack) {
469
			int arg_size = get_type_size_bytes(get_method_param_type(call_tp, i));
Michael Beck's avatar
Michael Beck committed
470
471
472
473

			stack_size += round_up2(arg->space_before, arg->alignment);
			stack_size += round_up2(arg_size, arg->alignment);
			stack_size += round_up2(arg->space_after, arg->alignment);
474
475

			stack_param_idx[n_stack_params++] = i;
Sebastian Hack's avatar
Sebastian Hack committed
476
477
478
479
		}
	}

	/* Collect all arguments which are passed in registers. */
480
	reg_param_idxs = ALLOCAN(int, n_params);
481
	for (i = 0; i < n_params; ++i) {
482
		be_abi_call_arg_t *arg = get_call_arg(call, 0, i, 0);
483
		if (arg && arg->in_reg) {
484
			reg_param_idxs[n_reg_params++] = i;
Sebastian Hack's avatar
Sebastian Hack committed
485
486
487
		}
	}

488
489
490
491
492
493
494
495
496
497
	/*
	 * If the stack is decreasing and we do not want to store sequentially,
	 * or someone else allocated the call frame
	 * we allocate as much space on the stack all parameters need, by
	 * moving the stack pointer along the stack's direction.
	 *
	 * Note: we also have to do this for stack_size == 0, because we may have
	 * to adjust stack alignment for the call.
	 */
	if (stack_dir < 0 && !do_seq && !no_alloc) {
498
		curr_sp = be_new_IncSP(sp, bl, curr_sp, stack_size, 1);
499
500
	}

Christoph Mallon's avatar
Christoph Mallon committed
501
	dbgi = get_irn_dbg_info(irn);
Sebastian Hack's avatar
Sebastian Hack committed
502
	/* If there are some parameters which shall be passed on the stack. */
503
	if (n_stack_params > 0) {
504
505
506
		int       curr_ofs = 0;
		ir_node **in       = ALLOCAN(ir_node*, n_stack_params+1);
		unsigned  n_in     = 0;
Sebastian Hack's avatar
Sebastian Hack committed
507

508
509
		/*
		 * Reverse list of stack parameters if call arguments are from left to right.
510
		 * We must them reverse again if they are pushed (not stored) and the stack
511
512
513
		 * direction is downwards.
		 */
		if (call->flags.bits.left_to_right ^ (do_seq && stack_dir < 0)) {
514
515
516
517
518
			for (i = 0; i < n_stack_params >> 1; ++i) {
				int other  = n_stack_params - i - 1;
				int tmp    = stack_param_idx[i];
				stack_param_idx[i]     = stack_param_idx[other];
				stack_param_idx[other] = tmp;
Sebastian Hack's avatar
Sebastian Hack committed
519
520
521
			}
		}

522
		curr_mem = get_Call_mem(irn);
523
		if (! do_seq) {
524
			in[n_in++] = curr_mem;
525
526
		}

527
528
		for (i = 0; i < n_stack_params; ++i) {
			int p                  = stack_param_idx[i];
529
			be_abi_call_arg_t *arg = get_call_arg(call, 0, p, 0);
530
531
532
			ir_node *param         = get_Call_param(irn, p);
			ir_node *addr          = curr_sp;
			ir_node *mem           = NULL;
533
			ir_type *param_type    = get_method_param_type(call_tp, p);
534
535
			int param_size         = get_type_size_bytes(param_type) + arg->space_after;

536
537
538
539
540
541
542
			/*
			 * If we wanted to build the arguments sequentially,
			 * the stack pointer for the next must be incremented,
			 * and the memory value propagated.
			 */
			if (do_seq) {
				curr_ofs = 0;
543
544
				addr = curr_sp = be_new_IncSP(sp, bl, curr_sp,
				                              param_size + arg->space_before, 0);
Sebastian Hack's avatar
Sebastian Hack committed
545
				add_irn_dep(curr_sp, curr_mem);
546
			} else {
547
548
549
550
				curr_ofs += arg->space_before;
				curr_ofs =  round_up2(curr_ofs, arg->alignment);

				/* Make the expression to compute the argument's offset. */
551
				if (curr_ofs > 0) {
552
					ir_mode *constmode = mach_mode;
553
					if (mode_is_reference(mach_mode)) {
554
555
						constmode = mode_Is;
					}
556
					addr = new_r_Const_long(irg, constmode, curr_ofs);
557
					addr = new_r_Add(bl, curr_sp, addr, mach_mode);
558
				}
Sebastian Hack's avatar
Sebastian Hack committed
559
560
561
			}

			/* Insert a store for primitive arguments. */
562
			if (is_atomic_type(param_type)) {
563
				ir_node *store;
564
				ir_node *mem_input = do_seq ? curr_mem : new_NoMem();
565
				store = new_rd_Store(dbgi, bl, mem_input, addr, param, 0);
566
				mem   = new_r_Proj(store, mode_M, pn_Store_M);
567
568
			} else {
				/* Make a mem copy for compound arguments. */
569
570
				ir_node *copy;

Sebastian Hack's avatar
Sebastian Hack committed
571
				assert(mode_is_reference(get_irn_mode(param)));
572
				copy = new_rd_CopyB(dbgi, bl, curr_mem, addr, param, param_type);
573
				mem = new_r_Proj(copy, mode_M, pn_CopyB_M_regular);
Sebastian Hack's avatar
Sebastian Hack committed
574
575
576
577
			}

			curr_ofs += param_size;

578
			if (do_seq)
Sebastian Hack's avatar
Sebastian Hack committed
579
				curr_mem = mem;
580
			else
581
				in[n_in++] = mem;
Sebastian Hack's avatar
Sebastian Hack committed
582
583
584
		}

		/* We need the sync only, if we didn't build the stores sequentially. */
585
586
		if (! do_seq) {
			if (n_stack_params >= 1) {
587
				curr_mem = new_r_Sync(bl, n_in, in);
588
589
590
591
			} else {
				curr_mem = get_Call_mem(irn);
			}
		}
Sebastian Hack's avatar
Sebastian Hack committed
592
593
	}

594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
	/* check for the return_twice property */
	destroy_all_regs = 0;
	if (is_SymConst_addr_ent(call_ptr)) {
		ir_entity *ent = get_SymConst_entity(call_ptr);

		if (get_entity_additional_properties(ent) & mtp_property_returns_twice)
			destroy_all_regs = 1;
	} else {
		ir_type *call_tp = get_Call_type(irn);

		if (get_method_additional_properties(call_tp) & mtp_property_returns_twice)
			destroy_all_regs = 1;
	}

	/* Put caller save into the destroyed set and state registers in the states set */
609
	for (i = 0, n = arch_env_get_n_reg_class(arch_env); i < n; ++i) {
610
		unsigned j;
611
		const arch_register_class_t *cls = arch_env_get_reg_class(arch_env, i);
612
		for (j = 0; j < cls->n_regs; ++j) {
Sebastian Hack's avatar
Sebastian Hack committed
613
			const arch_register_t *reg = arch_register_for_index(cls, j);
614
615
616
617

			if (destroy_all_regs || arch_register_type_is(reg, caller_save)) {
				if (! arch_register_type_is(reg, ignore))
					pset_new_insert(&destroyed_regs, (void *) reg);
618
			}
619
			if (arch_register_type_is(reg, state)) {
620
621
				pset_new_insert(&destroyed_regs, (void*) reg);
				pset_new_insert(&states, (void*) reg);
622
			}
Sebastian Hack's avatar
Sebastian Hack committed
623
624
		}
	}
Sebastian Hack's avatar
Sebastian Hack committed
625

626
	if (destroy_all_regs) {
Christoph Mallon's avatar
Christoph Mallon committed
627
		/* even if destroyed all is specified, neither SP nor FP are destroyed (else bad things will happen) */
628
629
630
		pset_new_remove(&destroyed_regs, arch_env->sp);
		pset_new_remove(&destroyed_regs, arch_env->bp);
	}
Michael Beck's avatar
Michael Beck committed
631

Christoph Mallon's avatar
Christoph Mallon committed
632
	/* search the largest result proj number */
633
	res_projs = ALLOCANZ(ir_node*, n_res);
Matthias Braun's avatar
Matthias Braun committed
634

Sebastian Hack's avatar
Sebastian Hack committed
635
636
	foreach_out_edge(irn, edge) {
		const ir_edge_t *res_edge;
Matthias Braun's avatar
Matthias Braun committed
637
		ir_node         *irn = get_edge_src_irn(edge);
Sebastian Hack's avatar
Sebastian Hack committed
638

639
		if (!is_Proj(irn) || get_Proj_proj(irn) != pn_Call_T_result)
Matthias Braun's avatar
Matthias Braun committed
640
641
642
643
644
645
646
647
648
649
			continue;

		foreach_out_edge(irn, res_edge) {
			int proj;
			ir_node *res = get_edge_src_irn(res_edge);

			assert(is_Proj(res));

			proj = get_Proj_proj(res);
			assert(proj < n_res);
Matthias Braun's avatar
Matthias Braun committed
650
			assert(res_projs[proj] == NULL);
Matthias Braun's avatar
Matthias Braun committed
651
			res_projs[proj] = res;
Sebastian Hack's avatar
Sebastian Hack committed
652
		}
Matthias Braun's avatar
Matthias Braun committed
653
654
		res_proj = irn;
		break;
Sebastian Hack's avatar
Sebastian Hack committed
655
	}
656

Matthias Braun's avatar
Matthias Braun committed
657
	/** TODO: this is not correct for cases where return values are passed
Christoph Mallon's avatar
Christoph Mallon committed
658
	 * on the stack, but no known ABI does this currently...
Matthias Braun's avatar
Matthias Braun committed
659
660
	 */
	n_reg_results = n_res;
Sebastian Hack's avatar
Sebastian Hack committed
661

662
663
664
665
	assert(obstack_object_size(obst) == 0);
	n_ins = 0;
	in    = ALLOCAN(ir_node*, n_reg_params + pset_new_size(&states));

666
	/* make the back end call node and set its register requirements. */
667
	for (i = 0; i < n_reg_params; ++i) {
668
		in[n_ins++] = get_Call_param(irn, reg_param_idxs[i]);
669
	}
670
671
672

	/* add state registers ins */
	foreach_pset_new(&states, reg, iter) {
673
674
675
676
677
		const arch_register_class_t *cls = arch_register_get_class(reg);
#if 0
		ir_node *regnode = be_abi_reg_map_get(env->regs, reg);
		ir_fprintf(stderr, "Adding %+F\n", regnode);
#endif
678
		ir_node *regnode = new_r_Unknown(irg, arch_register_class_mode(cls));
679
		in[n_ins++]      = regnode;
680
	}
681
	assert(n_ins == (int) (n_reg_params + pset_new_size(&states)));
682

683
	/* ins collected, build the call */
684
685
	if (env->call->flags.bits.call_has_imm && is_SymConst(call_ptr)) {
		/* direct call */
686
		low_call = be_new_Call(dbgi, irg, bl, curr_mem, curr_sp, curr_sp,
687
		                       n_reg_results + pn_be_Call_first_res + pset_new_size(&destroyed_regs),
Matthias Braun's avatar
Matthias Braun committed
688
		                       n_ins, in, get_Call_type(irn));
Sebastian Hack's avatar
Sebastian Hack committed
689
		be_Call_set_entity(low_call, get_SymConst_entity(call_ptr));
690
	} else {
691
		/* indirect call */
692
		low_call = be_new_Call(dbgi, irg, bl, curr_mem, curr_sp, call_ptr,
693
		                       n_reg_results + pn_be_Call_first_res + pset_new_size(&destroyed_regs),
694
		                       n_ins, in, get_Call_type(irn));
Sebastian Hack's avatar
Sebastian Hack committed
695
	}
696
	be_Call_set_pop(low_call, call->pop);
697
698

	/* put the call into the list of all calls for later processing */
699
	ARR_APP1(ir_node *, env->calls, low_call);
700

Matthias Braun's avatar
Matthias Braun committed
701
	/* create new stack pointer */
702
	curr_sp = new_r_Proj(low_call, get_irn_mode(curr_sp), pn_be_Call_sp);
703
704
	be_set_constr_single_reg_out(low_call, pn_be_Call_sp, sp,
			arch_register_req_type_ignore | arch_register_req_type_produces_sp);
705
	arch_set_irn_register(curr_sp, sp);
Matthias Braun's avatar
Matthias Braun committed
706

707
	/* now handle results */
708
	for (i = 0; i < n_res; ++i) {
Matthias Braun's avatar
Matthias Braun committed
709
710
		int pn;
		ir_node           *proj = res_projs[i];
711
		be_abi_call_arg_t *arg  = get_call_arg(call, 1, i, 0);
Matthias Braun's avatar
Matthias Braun committed
712

Matthias Braun's avatar
Matthias Braun committed
713
714
715
		/* returns values on stack not supported yet */
		assert(arg->in_reg);

Matthias Braun's avatar
Matthias Braun committed
716
717
718
719
720
721
722
		/*
			shift the proj number to the right, since we will drop the
			unspeakable Proj_T from the Call. Therefore, all real argument
			Proj numbers must be increased by pn_be_Call_first_res
		*/
		pn = i + pn_be_Call_first_res;

723
		if (proj == NULL) {
724
			ir_type *res_type = get_method_res_type(call_tp, i);
Matthias Braun's avatar
Matthias Braun committed
725
			ir_mode *mode     = get_type_mode(res_type);
726
			proj              = new_r_Proj(low_call, mode, pn);
Matthias Braun's avatar
Matthias Braun committed
727
728
729
730
731
732
733
			res_projs[i]      = proj;
		} else {
			set_Proj_pred(proj, low_call);
			set_Proj_proj(proj, pn);
		}

		if (arg->in_reg) {
734
			pset_new_remove(&destroyed_regs, arg->reg);
Matthias Braun's avatar
Matthias Braun committed
735
736
737
		}
	}

738
	/*
739
740
		Set the register class of the call address to
		the backend provided class (default: stack pointer class)
741
	*/
742
	be_node_set_reg_class_in(low_call, be_pos_Call_ptr, call->cls_addr);
743

744
	DBG((dbg, LEVEL_3, "\tcreated backend call %+F\n", low_call));
745

Sebastian Hack's avatar
Sebastian Hack committed
746
	/* Set the register classes and constraints of the Call parameters. */
747
748
	for (i = 0; i < n_reg_params; ++i) {
		int index = reg_param_idxs[i];
749
		be_abi_call_arg_t *arg = get_call_arg(call, 0, index, 0);
Sebastian Hack's avatar
Sebastian Hack committed
750
		assert(arg->reg != NULL);
751

752
753
		be_set_constr_single_reg_in(low_call, be_pos_Call_first_arg + i,
		                            arg->reg, 0);
Sebastian Hack's avatar
Sebastian Hack committed
754
755
756
	}

	/* Set the register constraints of the results. */
Matthias Braun's avatar
Matthias Braun committed
757
758
	for (i = 0; i < n_res; ++i) {
		ir_node                 *proj = res_projs[i];
759
		const be_abi_call_arg_t *arg  = get_call_arg(call, 1, i, 0);
Matthias Braun's avatar
Matthias Braun committed
760
		int                      pn   = get_Proj_proj(proj);
761

Sebastian Hack's avatar
Sebastian Hack committed
762
		assert(arg->in_reg);
763
		be_set_constr_single_reg_out(low_call, pn, arg->reg, 0);
764
		arch_set_irn_register(proj, arg->reg);
Sebastian Hack's avatar
Sebastian Hack committed
765
	}
766
767
	exchange(irn, low_call);

Matthias Braun's avatar
Matthias Braun committed
768
	/* kill the ProjT node */
769
	if (res_proj != NULL) {
770
		kill_node(res_proj);
771
772
	}

Sebastian Hack's avatar
Sebastian Hack committed
773
774
	/* Make additional projs for the caller save registers
	   and the Keep node which keeps them alive. */
775
	{
Sebastian Hack's avatar
Sebastian Hack committed
776
		const arch_register_t *reg;
777
		ir_node               **in, *keep;
778
779
		int                   i;
		int                   n = 0;
780
781
		int                   curr_res_proj = pn_be_Call_first_res + n_reg_results;
		pset_new_iterator_t   iter;
782
		int                   n_ins;
Sebastian Hack's avatar
Sebastian Hack committed
783

784
785
		n_ins = (int)pset_new_size(&destroyed_regs) + n_reg_results + 1;
		in    = ALLOCAN(ir_node *, n_ins);
786

787
788
		/* also keep the stack pointer */
		set_irn_link(curr_sp, (void*) sp);
789
		in[n++] = curr_sp;
790

791
		foreach_pset_new(&destroyed_regs, reg, iter) {
792
			ir_node *proj = new_r_Proj(low_call, reg->reg_class->mode, curr_res_proj);
Sebastian Hack's avatar
Sebastian Hack committed
793

Sebastian Hack's avatar
Sebastian Hack committed
794
			/* memorize the register in the link field. we need afterwards to set the register class of the keep correctly. */
795
			be_set_constr_single_reg_out(low_call, curr_res_proj, reg, 0);
796
			arch_set_irn_register(proj, reg);
797

Matthias Braun's avatar
Matthias Braun committed
798
			set_irn_link(proj, (void*) reg);
799
			in[n++] = proj;
800
			++curr_res_proj;
Sebastian Hack's avatar
Sebastian Hack committed
801
802
		}

803
		for (i = 0; i < n_reg_results; ++i) {
Matthias Braun's avatar
Matthias Braun committed
804
			ir_node *proj = res_projs[i];
805
			const arch_register_t *reg = arch_get_irn_register(proj);
Matthias Braun's avatar
Matthias Braun committed
806
			set_irn_link(proj, (void*) reg);
807
			in[n++] = proj;
Matthias Braun's avatar
Matthias Braun committed
808
		}
809
		assert(n <= n_ins);
Matthias Braun's avatar
Matthias Braun committed
810

811
		/* create the Keep for the caller save registers */
812
		keep = be_new_Keep(bl, n, in);
813
		for (i = 0; i < n; ++i) {
Sebastian Hack's avatar
Sebastian Hack committed
814
			const arch_register_t *reg = get_irn_link(in[i]);
815
			be_node_set_reg_class_in(keep, i, reg->reg_class);
Sebastian Hack's avatar
Sebastian Hack committed
816
		}
Sebastian Hack's avatar
Sebastian Hack committed
817
818
819
	}

	/* Clean up the stack. */
820
821
822
	assert(stack_size >= call->pop);
	stack_size -= call->pop;

823
	if (stack_size > 0) {
824
825
826
827
		ir_node *mem_proj = NULL;

		foreach_out_edge(low_call, edge) {
			ir_node *irn = get_edge_src_irn(edge);
828
			if (is_Proj(irn) && get_Proj_proj(irn) == pn_Call_M) {
829
830
831
832
				mem_proj = irn;
				break;
			}
		}
Sebastian Hack's avatar
Sebastian Hack committed
833

834
		if (! mem_proj) {
835
			mem_proj = new_r_Proj(low_call, mode_M, pn_be_Call_M_regular);
Sebastian Hack's avatar
Sebastian Hack committed
836
837
			keep_alive(mem_proj);
		}
838
839
840
	}
	/* Clean up the stack frame or revert alignment fixes if we allocated it */
	if (! no_alloc) {
841
		curr_sp = be_new_IncSP(sp, bl, curr_sp, -stack_size, 0);
Sebastian Hack's avatar
Sebastian Hack committed
842
843
844
	}

	be_abi_call_free(call);
845
846
847

	pset_new_destroy(&states);
	pset_new_destroy(&destroyed_regs);
848
849
850
851

	return curr_sp;
}

852
853
854
855
856
/**
 * Adjust the size of a node representing a stack alloc or free for the minimum stack alignment.
 *
 * @param alignment  the minimum stack alignment
 * @param size       the node containing the non-aligned size
857
 * @param block      the block where new nodes are allocated on
858
859
860
861
 * @param dbg        debug info for new nodes
 *
 * @return a node representing the aligned size
 */
862
static ir_node *adjust_alloc_size(unsigned stack_alignment, ir_node *size,
863
                                  ir_node *block, dbg_info *dbg)
864
{
865
	if (stack_alignment > 1) {
866
867
868
869
		ir_mode  *mode;
		tarval   *tv;
		ir_node  *mask;
		ir_graph *irg;
Michael Beck's avatar
Michael Beck committed
870

871
		assert(is_po2(stack_alignment));
872

Michael Beck's avatar
Michael Beck committed
873
874
		mode = get_irn_mode(size);
		tv   = new_tarval_from_long(stack_alignment-1, mode);
875
		irg  = get_Block_irg(block);
876
		mask = new_r_Const(irg, tv);
877
		size = new_rd_Add(dbg, block, size, mask, mode);
878
879

		tv   = new_tarval_from_long(-(long)stack_alignment, mode);
880
		mask = new_r_Const(irg, tv);
881
		size = new_rd_And(dbg, block, size, mask, mode);
882
883
884
	}
	return size;
}
885
886
887
888
/**