beabi.c 72.7 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
#include "obst.h"
29
#include "offset.h"
Sebastian Hack's avatar
Sebastian Hack committed
30

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

#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
39
#include "irprintf_t.h"
40
#include "irgopt.h"
41
#include "irbitset.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"
Sebastian Hack's avatar
Sebastian Hack committed
47
48
49

#include "be.h"
#include "beabi.h"
50
#include "bearch_t.h"
Sebastian Hack's avatar
Sebastian Hack committed
51
#include "benode_t.h"
Sebastian Hack's avatar
Sebastian Hack committed
52
#include "belive_t.h"
Sebastian Hack's avatar
Sebastian Hack committed
53
#include "besched_t.h"
54
#include "beirg_t.h"
55
#include "bessaconstr.h"
Sebastian Hack's avatar
Sebastian Hack committed
56
57

typedef struct _be_abi_call_arg_t {
58
59
60
	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. */
Sebastian Hack's avatar
Sebastian Hack committed
61

62
	int                    pos;
Sebastian Hack's avatar
Sebastian Hack committed
63
	const arch_register_t *reg;
64
65
66
67
68
	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
69
70
71
} be_abi_call_arg_t;

struct _be_abi_call_t {
Michael Beck's avatar
Michael Beck committed
72
73
	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. */
74
75
76
	const be_abi_callbacks_t    *cb;
	ir_type                     *between_type;
	set                         *params;
Michael Beck's avatar
Michael Beck committed
77
	const arch_register_class_t *cls_addr; /**< register class of the call address */
Sebastian Hack's avatar
Sebastian Hack committed
78
79
};

Michael Beck's avatar
Michael Beck committed
80
81
82
/**
 * The ABI information for the current birg.
 */
Sebastian Hack's avatar
Sebastian Hack committed
83
struct _be_abi_irg_t {
Sebastian Hack's avatar
Sebastian Hack committed
84
	struct obstack       obst;
85
	be_irg_t             *birg;         /**< The back end IRG. */
86
	const arch_env_t     *arch_env;
Sebastian Hack's avatar
Sebastian Hack committed
87
88
	survive_dce_t        *dce_survivor;

Sebastian Hack's avatar
Sebastian Hack committed
89
	be_abi_call_t        *call;         /**< The ABI call information. */
90
	ir_type              *method_type;  /**< The type of the method of the IRG. */
Sebastian Hack's avatar
Sebastian Hack committed
91

Sebastian Hack's avatar
Sebastian Hack committed
92
	ir_node              *init_sp;      /**< The node representing the stack pointer
93
	                                         at the start of the function. */
Sebastian Hack's avatar
Sebastian Hack committed
94

Sebastian Hack's avatar
Sebastian Hack committed
95
96
	ir_node              *reg_params;   /**< The reg params node. */
	pmap                 *regs;         /**< A map of all callee-save and ignore regs to
97
	                                         their Projs to the RegParams node. */
Sebastian Hack's avatar
Sebastian Hack committed
98

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

101
102
	void                 *cb;           /**< ABI Callback self pointer. */

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

106
	ir_node              **calls;       /**< flexible array containing all be_Call nodes */
107

108
109
110
111
	arch_register_req_t  sp_req;
	arch_register_req_t  sp_cls_req;

	be_stack_layout_t    frame;         /**< The stack frame model. */
Matthias Braun's avatar
Matthias Braun committed
112

113
	DEBUG_ONLY(firm_dbg_module_t    *dbg;)  /**< The debugging module. */
Sebastian Hack's avatar
Sebastian Hack committed
114
};
Sebastian Hack's avatar
Sebastian Hack committed
115

116
static heights_t *ir_heights;
117

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

121
122
123
/** 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
124
125
126
127
128
129
/*
     _    ____ ___    ____      _ _ _                _
    / \  | __ )_ _|  / ___|__ _| | | |__   __ _  ___| | _____
   / _ \ |  _ \| |  | |   / _` | | | '_ \ / _` |/ __| |/ / __|
  / ___ \| |_) | |  | |__| (_| | | | |_) | (_| | (__|   <\__ \
 /_/   \_\____/___|  \____\__,_|_|_|_.__/ \__,_|\___|_|\_\___/
130

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

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

Michael Beck's avatar
Michael Beck committed
145
/**
Michael Beck's avatar
Michael Beck committed
146
 * Get  an ABI call object argument.
Michael Beck's avatar
Michael Beck committed
147
148
149
150
151
 *
 * @param call      the abi call
 * @param is_res    true for call results, false for call arguments
 * @param pos       position of the argument
 */
Michael Beck's avatar
Michael Beck committed
152
static be_abi_call_arg_t *get_call_arg(be_abi_call_t *call, int is_res, int pos)
Sebastian Hack's avatar
Sebastian Hack committed
153
154
155
156
{
	be_abi_call_arg_t arg;
	unsigned hash;

157
	memset(&arg, 0, sizeof(arg));
Sebastian Hack's avatar
Sebastian Hack committed
158
159
160
	arg.is_res = is_res;
	arg.pos    = pos;

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

Michael Beck's avatar
Michael Beck committed
163
	return set_find(call->params, &arg, sizeof(arg), hash);
Sebastian Hack's avatar
Sebastian Hack committed
164
165
}

Michael Beck's avatar
Michael Beck committed
166
/**
Michael Beck's avatar
Michael Beck committed
167
 * Set an ABI call object argument.
Michael Beck's avatar
Michael Beck committed
168
 *
Michael Beck's avatar
Michael Beck committed
169
 * @param call      the abi call
Michael Beck's avatar
Michael Beck committed
170
171
172
 * @param is_res    true for call results, false for call arguments
 * @param pos       position of the argument
 */
Michael Beck's avatar
Michael Beck committed
173
static be_abi_call_arg_t *create_call_arg(be_abi_call_t *call, int is_res, int pos)
Sebastian Hack's avatar
Sebastian Hack committed
174
{
Michael Beck's avatar
Michael Beck committed
175
176
177
178
179
180
181
182
183
184
	be_abi_call_arg_t arg;
	unsigned hash;

	memset(&arg, 0, sizeof(arg));
	arg.is_res = is_res;
	arg.pos    = pos;

	hash = is_res * 128 + pos;

	return set_insert(call->params, &arg, sizeof(arg), hash);
Sebastian Hack's avatar
Sebastian Hack committed
185
186
}

Michael Beck's avatar
Michael Beck committed
187
/* Set the flags for a call. */
188
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
189
{
190
191
	call->flags = flags;
	call->cb    = cb;
Sebastian Hack's avatar
Sebastian Hack committed
192
193
}

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

/* 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;
}


208
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)
Sebastian Hack's avatar
Sebastian Hack committed
209
{
Michael Beck's avatar
Michael Beck committed
210
	be_abi_call_arg_t *arg = create_call_arg(call, 0, arg_pos);
211
	arg->on_stack     = 1;
212
	arg->load_mode    = load_mode;
213
214
215
	arg->alignment    = alignment;
	arg->space_before = space_before;
	arg->space_after  = space_after;
216
	assert(alignment > 0 && "Alignment must be greater than 0");
Sebastian Hack's avatar
Sebastian Hack committed
217
218
219
220
}

void be_abi_call_param_reg(be_abi_call_t *call, int arg_pos, const arch_register_t *reg)
{
Michael Beck's avatar
Michael Beck committed
221
	be_abi_call_arg_t *arg = create_call_arg(call, 0, arg_pos);
222
	arg->in_reg = 1;
Sebastian Hack's avatar
Sebastian Hack committed
223
224
225
226
227
	arg->reg = reg;
}

void be_abi_call_res_reg(be_abi_call_t *call, int arg_pos, const arch_register_t *reg)
{
Michael Beck's avatar
Michael Beck committed
228
	be_abi_call_arg_t *arg = create_call_arg(call, 1, arg_pos);
229
	arg->in_reg = 1;
Sebastian Hack's avatar
Sebastian Hack committed
230
231
232
	arg->reg = reg;
}

Michael Beck's avatar
Michael Beck committed
233
/* Get the flags of a ABI call object. */
234
235
236
237
238
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
239
240
241
/**
 * Constructor for a new ABI call object.
 *
Michael Beck's avatar
Michael Beck committed
242
243
 * @param cls_addr  register class of the call address
 *
Michael Beck's avatar
Michael Beck committed
244
245
 * @return the new ABI call object
 */
246
static be_abi_call_t *be_abi_call_new(const arch_register_class_t *cls_addr)
Sebastian Hack's avatar
Sebastian Hack committed
247
{
248
	be_abi_call_t *call = XMALLOCZ(be_abi_call_t);
249

Sebastian Hack's avatar
Sebastian Hack committed
250
251
252
	call->flags.val  = 0;
	call->params     = new_set(cmp_call_arg, 16);
	call->cb         = NULL;
253
	call->cls_addr   = cls_addr;
254

255
	call->flags.bits.try_omit_fp = be_omit_fp | be_omit_leaf_fp;
256

Sebastian Hack's avatar
Sebastian Hack committed
257
258
259
	return call;
}

Michael Beck's avatar
Michael Beck committed
260
261
262
263
/**
 * Destructor for an ABI call object.
 */
static void be_abi_call_free(be_abi_call_t *call)
Sebastian Hack's avatar
Sebastian Hack committed
264
265
266
267
268
{
	del_set(call->params);
	free(call);
}

Sebastian Hack's avatar
Sebastian Hack committed
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
/*
  _____                           _   _                 _ _ _
 |  ___| __ __ _ _ __ ___   ___  | | | | __ _ _ __   __| | (_)_ __   __ _
 | |_ | '__/ _` | '_ ` _ \ / _ \ | |_| |/ _` | '_ \ / _` | | | '_ \ / _` |
 |  _|| | | (_| | | | | | |  __/ |  _  | (_| | | | | (_| | | | | | | (_| |
 |_|  |_|  \__,_|_| |_| |_|\___| |_| |_|\__,_|_| |_|\__,_|_|_|_| |_|\__, |
                                                                    |___/

  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.
*/

286
287
static int get_stack_entity_offset(be_stack_layout_t *frame, ir_entity *ent,
                                   int bias)
288
{
289
	ir_type *t = get_entity_owner(ent);
290
	int ofs    = get_entity_offset(ent);
291

292
	int index;
293
294

	/* Find the type the entity is contained in. */
295
296
	for (index = 0; index < N_FRAME_TYPES; ++index) {
		if (frame->order[index] == t)
297
			break;
298
299
		/* 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]);
300
301
302
303
304
305
306
307
308
309
310
	}

	/* 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
311
312
313
/**
 * Retrieve the entity with given offset from a frame type.
 */
314
static ir_entity *search_ent_with_offset(ir_type *t, int offset)
Sebastian Hack's avatar
Sebastian Hack committed
315
316
317
{
	int i, n;

318
	for(i = 0, n = get_compound_n_members(t); i < n; ++i) {
319
		ir_entity *ent = get_compound_member(t, i);
320
		if (get_entity_offset(ent) == offset)
Sebastian Hack's avatar
Sebastian Hack committed
321
322
323
324
325
326
			return ent;
	}

	return NULL;
}

327
static int stack_frame_compute_initial_offset(be_stack_layout_t *frame)
328
{
329
330
	ir_type  *base = frame->stack_dir < 0 ? frame->between_type : frame->frame_type;
	ir_entity *ent = search_ent_with_offset(base, 0);
331
332
333

	frame->initial_offset = ent ? get_stack_entity_offset(frame, ent, 0) : 0;

334
335
336
	return frame->initial_offset;
}

337
338
339
340
341
342
343
344
/**
 * 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
 * @param stack_dir the stack direction
345
 * @param param_map an array mapping method argument positions to the stack argument type
346
347
348
349
 *
 * @return the initialized stack layout
 */
static be_stack_layout_t *stack_frame_init(be_stack_layout_t *frame, ir_type *args,
350
                                           ir_type *between, ir_type *locals, int stack_dir,
351
                                           ir_entity *param_map[])
352
353
354
355
356
{
	frame->arg_type       = args;
	frame->between_type   = between;
	frame->frame_type     = locals;
	frame->initial_offset = 0;
Matthias Braun's avatar
Matthias Braun committed
357
	frame->initial_bias   = 0;
358
359
	frame->stack_dir      = stack_dir;
	frame->order[1]       = between;
360
	frame->param_map      = param_map;
361
362
363
364
365
366
367
368
369
370
371
372

	if(stack_dir > 0) {
		frame->order[0] = args;
		frame->order[2] = locals;
	}
	else {
		frame->order[0] = locals;
		frame->order[2] = args;
	}
	return frame;
}

373
#if 0
374
375
/** Dumps the stack layout to file. */
static void stack_layout_dump(FILE *file, be_stack_layout_t *frame)
Sebastian Hack's avatar
Sebastian Hack committed
376
377
378
379
{
	int i, j, n;

	ir_fprintf(file, "initial offset: %d\n", frame->initial_offset);
380
381
	for (j = 0; j < N_FRAME_TYPES; ++j) {
		ir_type *t = frame->order[j];
Sebastian Hack's avatar
Sebastian Hack committed
382

383
384
		ir_fprintf(file, "type %d: %F size: %d\n", j, t, get_type_size_bytes(t));
		for (i = 0, n = get_compound_n_members(t); i < n; ++i) {
385
			ir_entity *ent = get_compound_member(t, i);
Sebastian Hack's avatar
Sebastian Hack committed
386
387
388
389
			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));
		}
	}
}
390
#endif
Sebastian Hack's avatar
Sebastian Hack committed
391

Michael Beck's avatar
Michael Beck committed
392
393
394
395
/**
 * Returns non-zero if the call argument at given position
 * is transfered on the stack.
 */
396
static inline int is_on_stack(be_abi_call_t *call, int pos)
Sebastian Hack's avatar
Sebastian Hack committed
397
398
399
400
401
{
	be_abi_call_arg_t *arg = get_call_arg(call, 0, pos);
	return arg && !arg->in_reg;
}

402
403
404
405
406
407
408
409
410
411
412
/*
   ____      _ _
  / ___|__ _| | |___
 | |   / _` | | / __|
 | |__| (_| | | \__ \
  \____\__,_|_|_|___/

  Adjustment of the calls inside a graph.

*/

Sebastian Hack's avatar
Sebastian Hack committed
413
/**
414
415
 * Transform a call node into a be_Call node.
 *
Sebastian Hack's avatar
Sebastian Hack committed
416
 * @param env The ABI environment for the current irg.
417
418
419
 * @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
420
 */
Matthias Braun's avatar
Matthias Braun committed
421
static ir_node *adjust_call(be_abi_irg_t *env, ir_node *irn, ir_node *curr_sp)
Sebastian Hack's avatar
Sebastian Hack committed
422
{
423
	ir_graph *irg              = env->birg->irg;
424
	const arch_env_t *arch_env = env->birg->main_env->arch_env;
425
	ir_type *call_tp           = get_Call_type(irn);
426
	ir_node *call_ptr          = get_Call_ptr(irn);
427
	int n_params               = get_method_n_params(call_tp);
428
429
430
431
432
433
	ir_node *curr_mem          = get_Call_mem(irn);
	ir_node *bl                = get_nodes_block(irn);
	pset *results              = pset_new_ptr(8);
	pset *caller_save          = pset_new_ptr(8);
	pset *states               = pset_new_ptr(2);
	int stack_size             = 0;
434
435
	int stack_dir              = arch_env_stack_dir(arch_env);
	const arch_register_t *sp  = arch_env_sp(arch_env);
436
437
438
439
	be_abi_call_t *call        = be_abi_call_new(sp->reg_class);
	ir_mode *mach_mode         = sp->reg_class->mode;
	struct obstack *obst       = &env->obst;
	int no_alloc               = call->flags.bits.frame_is_setup_on_call;
440
	int n_res                  = get_method_n_ress(call_tp);
441
	int do_seq                 = call->flags.bits.store_args_sequential && !no_alloc;
442
443
444
445
446

	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
447

448
449
450
451
452
453
454
455
456
457
458
	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;
	int                     i;
	int                     n;
	dbg_info               *dbgi;
Sebastian Hack's avatar
Sebastian Hack committed
459
460

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

	/* Insert code to put the stack arguments on the stack. */
464
	assert(get_Call_n_params(irn) == n_params);
465
	for (i = 0; i < n_params; ++i) {
Sebastian Hack's avatar
Sebastian Hack committed
466
		be_abi_call_arg_t *arg = get_call_arg(call, 0, i);
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);
Sebastian Hack's avatar
Sebastian Hack committed
474
			obstack_int_grow(obst, i);
475
			++n_stack_params;
Sebastian Hack's avatar
Sebastian Hack committed
476
477
		}
	}
478
	stack_param_idx = obstack_finish(obst);
Sebastian Hack's avatar
Sebastian Hack committed
479
480

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

490
491
492
493
494
495
496
497
498
499
500
501
502
	/*
	 * 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) {
		curr_sp = be_new_IncSP(sp, irg, bl, curr_sp, stack_size, 1);
	}

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

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
			obstack_ptr_grow(obst, curr_mem);
525
526
		}

527
528
		for (i = 0; i < n_stack_params; ++i) {
			int p                  = stack_param_idx[i];
529
530
531
532
			be_abi_call_arg_t *arg = get_call_arg(call, 0, p);
			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
				addr = curr_sp = be_new_IncSP(sp, irg, bl, curr_sp, param_size + arg->space_before, 0);
Sebastian Hack's avatar
Sebastian Hack committed
544
				add_irn_dep(curr_sp, curr_mem);
545
546
547
548
549
550
			}
			else {
				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
553
554
555
556
					ir_mode *constmode = mach_mode;
					if(mode_is_reference(mach_mode)) {
						constmode = mode_Is;
					}
					addr = new_r_Const_long(irg, bl, constmode, curr_ofs);
557
558
					addr = new_r_Add(irg, bl, curr_sp, addr, mach_mode);
				}
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, irg, bl, mem_input, addr, param);
566
				mem = new_r_Proj(irg, bl, store, mode_M, pn_Store_M);
Sebastian Hack's avatar
Sebastian Hack committed
567
568
			}

569
			/* Make a mem copy for compound arguments. */
Sebastian Hack's avatar
Sebastian Hack committed
570
			else {
571
572
				ir_node *copy;

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

			curr_ofs += param_size;

580
			if (do_seq)
Sebastian Hack's avatar
Sebastian Hack committed
581
				curr_mem = mem;
582
583
			else
				obstack_ptr_grow(obst, mem);
Sebastian Hack's avatar
Sebastian Hack committed
584
585
586
587
588
		}

		in = (ir_node **) obstack_finish(obst);

		/* We need the sync only, if we didn't build the stores sequentially. */
589
590
591
		if (! do_seq) {
			if (n_stack_params >= 1) {
				curr_mem = new_r_Sync(irg, bl, n_stack_params + 1, in);
592
593
594
595
			} else {
				curr_mem = get_Call_mem(irn);
			}
		}
Sebastian Hack's avatar
Sebastian Hack committed
596
597
598
599
		obstack_free(obst, in);
	}

	/* Collect caller save registers */
600
	for (i = 0, n = arch_env_get_n_reg_class(arch_env); i < n; ++i) {
601
		unsigned j;
602
		const arch_register_class_t *cls = arch_env_get_reg_class(arch_env, i);
603
		for (j = 0; j < cls->n_regs; ++j) {
Sebastian Hack's avatar
Sebastian Hack committed
604
			const arch_register_t *reg = arch_register_for_index(cls, j);
605
			if (arch_register_type_is(reg, caller_save)) {
Sebastian Hack's avatar
Sebastian Hack committed
606
				pset_insert_ptr(caller_save, (void *) reg);
607
			}
608
			if (arch_register_type_is(reg, state)) {
609
610
611
				pset_insert_ptr(caller_save, (void*) reg);
				pset_insert_ptr(states, (void*) reg);
			}
Sebastian Hack's avatar
Sebastian Hack committed
612
613
		}
	}
Sebastian Hack's avatar
Sebastian Hack committed
614
615

	/* search the greatest result proj number */
Michael Beck's avatar
Michael Beck committed
616

617
	res_projs = ALLOCANZ(ir_node*, n_res);
Matthias Braun's avatar
Matthias Braun committed
618

Sebastian Hack's avatar
Sebastian Hack committed
619
620
	foreach_out_edge(irn, edge) {
		const ir_edge_t *res_edge;
Matthias Braun's avatar
Matthias Braun committed
621
		ir_node         *irn = get_edge_src_irn(edge);
Sebastian Hack's avatar
Sebastian Hack committed
622

Matthias Braun's avatar
Matthias Braun committed
623
624
625
626
627
628
629
630
631
632
633
		if(!is_Proj(irn) || get_Proj_proj(irn) != pn_Call_T_result)
			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
634
			assert(res_projs[proj] == NULL);
Matthias Braun's avatar
Matthias Braun committed
635
			res_projs[proj] = res;
Sebastian Hack's avatar
Sebastian Hack committed
636
		}
Matthias Braun's avatar
Matthias Braun committed
637
638
		res_proj = irn;
		break;
Sebastian Hack's avatar
Sebastian Hack committed
639
	}
640

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

646
	/* make the back end call node and set its register requirements. */
647
648
	for (i = 0; i < n_reg_params; ++i) {
		obstack_ptr_grow(obst, get_Call_param(irn, reg_param_idxs[i]));
649
650
651
652
653
654
655
656
657
658
	}
	foreach_pset(states, reg) {
		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
		ir_node *regnode = new_rd_Unknown(irg, arch_register_class_mode(cls));
		obstack_ptr_grow(obst, regnode);
	}
659
	n_ins = n_reg_params + pset_count(states);
660
661

	in = obstack_finish(obst);
662

663
664
	if (env->call->flags.bits.call_has_imm && is_SymConst(call_ptr)) {
		/* direct call */
665
		low_call = be_new_Call(dbgi, irg, bl, curr_mem, curr_sp, curr_sp,
Matthias Braun's avatar
Matthias Braun committed
666
667
		                       n_reg_results + pn_be_Call_first_res + pset_count(caller_save),
		                       n_ins, in, get_Call_type(irn));
Sebastian Hack's avatar
Sebastian Hack committed
668
		be_Call_set_entity(low_call, get_SymConst_entity(call_ptr));
669
	} else {
670
		/* indirect call */
671
		low_call = be_new_Call(dbgi, irg, bl, curr_mem, curr_sp, call_ptr,
Matthias Braun's avatar
Matthias Braun committed
672
		                       n_reg_results + pn_be_Call_first_res + pset_count(caller_save),
673
		                       n_ins, in, get_Call_type(irn));
Sebastian Hack's avatar
Sebastian Hack committed
674
	}
675
	be_Call_set_pop(low_call, call->pop);
676
	ARR_APP1(ir_node *, env->calls, low_call);
677

Matthias Braun's avatar
Matthias Braun committed
678
679
680
	/* create new stack pointer */
	curr_sp = new_r_Proj(irg, bl, low_call, get_irn_mode(curr_sp),
	                     pn_be_Call_sp);
681
682
	be_set_constr_single_reg_out(low_call, pn_be_Call_sp, sp,
			arch_register_req_type_ignore | arch_register_req_type_produces_sp);
683
	arch_set_irn_register(curr_sp, sp);
Matthias Braun's avatar
Matthias Braun committed
684

Matthias Braun's avatar
Matthias Braun committed
685
686
687
688
689
	for(i = 0; i < n_res; ++i) {
		int pn;
		ir_node           *proj = res_projs[i];
		be_abi_call_arg_t *arg  = get_call_arg(call, 1, i);

Matthias Braun's avatar
Matthias Braun committed
690
691
692
		/* returns values on stack not supported yet */
		assert(arg->in_reg);

Matthias Braun's avatar
Matthias Braun committed
693
694
695
696
697
698
699
700
		/*
			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;

		if(proj == NULL) {
701
			ir_type *res_type = get_method_res_type(call_tp, i);
Matthias Braun's avatar
Matthias Braun committed
702
703
704
705
706
707
708
709
710
711
712
713
714
			ir_mode *mode     = get_type_mode(res_type);
			proj              = new_r_Proj(irg, bl, low_call, mode, pn);
			res_projs[i]      = proj;
		} else {
			set_Proj_pred(proj, low_call);
			set_Proj_proj(proj, pn);
		}

		if (arg->in_reg) {
			pset_remove_ptr(caller_save, arg->reg);
		}
	}

715
	/*
716
717
		Set the register class of the call address to
		the backend provided class (default: stack pointer class)
718
	*/
719
	be_node_set_reg_class_in(low_call, be_pos_Call_ptr, call->cls_addr);
720

721
722
	DBG((env->dbg, LEVEL_3, "\tcreated backend call %+F\n", low_call));

Sebastian Hack's avatar
Sebastian Hack committed
723
	/* Set the register classes and constraints of the Call parameters. */
724
725
	for (i = 0; i < n_reg_params; ++i) {
		int index = reg_param_idxs[i];
Sebastian Hack's avatar
Sebastian Hack committed
726
727
		be_abi_call_arg_t *arg = get_call_arg(call, 0, index);
		assert(arg->reg != NULL);
728

729
730
		be_set_constr_single_reg_in(low_call, be_pos_Call_first_arg + i,
		                            arg->reg, 0);
Sebastian Hack's avatar
Sebastian Hack committed
731
732
733
	}

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

Sebastian Hack's avatar
Sebastian Hack committed
739
		assert(arg->in_reg);
740
		be_set_constr_single_reg_out(low_call, pn, arg->reg, 0);
741
		arch_set_irn_register(proj, arg->reg);
Sebastian Hack's avatar
Sebastian Hack committed
742
	}
743
744
745
	obstack_free(obst, in);
	exchange(irn, low_call);

Matthias Braun's avatar
Matthias Braun committed
746
	/* kill the ProjT node */
747
	if (res_proj != NULL) {
748
		kill_node(res_proj);
749
750
	}

Sebastian Hack's avatar
Sebastian Hack committed
751
752
	/* Make additional projs for the caller save registers
	   and the Keep node which keeps them alive. */
753
	if (1 || pset_count(caller_save) + n_reg_results > 0) {
Sebastian Hack's avatar
Sebastian Hack committed
754
		const arch_register_t *reg;
755
		ir_node               **in, *keep;
756
757
		int                   i;
		int                   n = 0;
Matthias Braun's avatar
Matthias Braun committed
758
759
		int                   curr_res_proj
			= pn_be_Call_first_res + n_reg_results;
Sebastian Hack's avatar
Sebastian Hack committed
760

761
762
763
764
765
766
		/* also keep the stack pointer */
		++n;
		set_irn_link(curr_sp, (void*) sp);
		obstack_ptr_grow(obst, curr_sp);

		for (reg = pset_first(caller_save); reg; reg = pset_next(caller_save), ++n) {
Matthias Braun's avatar
Matthias Braun committed
767
768
			ir_node *proj = new_r_Proj(irg, bl, low_call, reg->reg_class->mode,
			                           curr_res_proj);
Sebastian Hack's avatar
Sebastian Hack committed
769

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

Matthias Braun's avatar
Matthias Braun committed
774
			set_irn_link(proj, (void*) reg);
Sebastian Hack's avatar
Sebastian Hack committed
775
			obstack_ptr_grow(obst, proj);
776
			curr_res_proj++;
Sebastian Hack's avatar
Sebastian Hack committed
777
778
		}

Matthias Braun's avatar
Matthias Braun committed
779
780
		for(i = 0; i < n_reg_results; ++i) {
			ir_node *proj = res_projs[i];
781
			const arch_register_t *reg = arch_get_irn_register(proj);
Matthias Braun's avatar
Matthias Braun committed
782
783
784
785
786
			set_irn_link(proj, (void*) reg);
			obstack_ptr_grow(obst, proj);
		}
		n += n_reg_results;

787
		/* create the Keep for the caller save registers */
Sebastian Hack's avatar
Sebastian Hack committed
788
789
		in   = (ir_node **) obstack_finish(obst);
		keep = be_new_Keep(NULL, irg, bl, n, in);
790
		for (i = 0; i < n; ++i) {
Sebastian Hack's avatar
Sebastian Hack committed
791
			const arch_register_t *reg = get_irn_link(in[i]);
792
			be_node_set_reg_class_in(keep, i, reg->reg_class);
Sebastian Hack's avatar
Sebastian Hack committed
793
		}
Sebastian Hack's avatar
Sebastian Hack committed
794
795
796
797
		obstack_free(obst, in);
	}

	/* Clean up the stack. */
798
799
800
	assert(stack_size >= call->pop);
	stack_size -= call->pop;

801
	if (stack_size > 0) {
802
803
804
805
806
807
808
809
810
		ir_node *mem_proj = NULL;

		foreach_out_edge(low_call, edge) {
			ir_node *irn = get_edge_src_irn(edge);
			if(is_Proj(irn) && get_Proj_proj(irn) == pn_Call_M) {
				mem_proj = irn;
				break;
			}
		}
Sebastian Hack's avatar
Sebastian Hack committed
811

812
		if (! mem_proj) {
813
			mem_proj = new_r_Proj(irg, bl, low_call, mode_M, pn_be_Call_M_regular);
Sebastian Hack's avatar
Sebastian Hack committed
814
815
			keep_alive(mem_proj);
		}
816
817
818
819
	}
	/* Clean up the stack frame or revert alignment fixes if we allocated it */
	if (! no_alloc) {
		curr_sp = be_new_IncSP(sp, irg, bl, curr_sp, -stack_size, 0);
Sebastian Hack's avatar
Sebastian Hack committed
820
821
822
	}

	be_abi_call_free(call);
823
	obstack_free(obst, stack_param_idx);
Sebastian Hack's avatar
Sebastian Hack committed
824
	del_pset(results);
825
	del_pset(states);
Sebastian Hack's avatar
Sebastian Hack committed
826
	del_pset(caller_save);
827
828
829
830

	return curr_sp;
}

831
832
833
834
835
836
837
838
839
840
841
/**
 * 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
 * @param irg        the irg where new nodes are allocated on
 * @param irg        the block where new nodes are allocated on
 * @param dbg        debug info for new nodes
 *
 * @return a node representing the aligned size
 */
842
843
844
static ir_node *adjust_alloc_size(unsigned stack_alignment, ir_node *size,
                                  ir_graph *irg, ir_node *block, dbg_info *dbg)
{
845
	if (stack_alignment > 1) {
Michael Beck's avatar
Michael Beck committed
846
847
848
849
		ir_mode *mode;
		tarval  *tv;
		ir_node *mask;

850
		assert(is_po2(stack_alignment));
851

Michael Beck's avatar
Michael Beck committed
852
853
854
		mode = get_irn_mode(size);
		tv   = new_tarval_from_long(stack_alignment-1, mode);
		mask = new_r_Const(irg, block, mode, tv);
855
856
857
858
859
860
861
862
		size = new_rd_Add(dbg, irg, block, size, mask, mode);

		tv   = new_tarval_from_long(-(long)stack_alignment, mode);
		mask = new_r_Const(irg, block, mode, tv);
		size = new_rd_And(dbg, irg, block, size, mask, mode);
	}
	return size;
}
863
864
865
866
/**
 * Adjust an alloca.
 * The alloca is transformed into a back end alloca node and connected to the stack nodes.
 */
Matthias Braun's avatar
Matthias Braun committed
867
static ir_node *adjust_alloc(be_abi_irg_t *env, ir_node *alloc, ir_node *curr_sp)
868
{
869
870
871
872
873
	ir_node *block;
	ir_graph *irg;
	ir_node *alloc_mem;
	ir_node *alloc_res;
	ir_type *type;
874
	dbg_info *dbg;
875

876
	const ir_edge_t *edge;
Matthias Braun's avatar
Matthias Braun committed
877
	ir_node *new_alloc, *size, *addr, *ins[2];
878
	unsigned stack_alignment;
879

880
	assert(get_Alloc_where(alloc) == stack_alloc);
881

882
883
884
885
886
	block = get_nodes_block(alloc);
	irg = get_irn_irg(block);
	alloc_mem = NULL;
	alloc_res = NULL;
	type = get_Alloc_type(alloc);
887

888
889
	foreach_out_edge(alloc, edge) {
		ir_node *irn = get_edge_src_irn(edge);
890

891
		assert(is_Proj(irn));
892
		switch (get_Proj_proj(irn)) {
893
894
895
896
897
898
899
900
		case pn_Alloc_M:
			alloc_mem = irn;
			break;
		case pn_Alloc_res:
			alloc_res = irn;
			break;
		default:
			break;
901
		}
902
	}
903

904
905
906
907
908
909
910
911
	/* Beware: currently Alloc nodes without a result might happen,
	   only escape analysis kills them and this phase runs only for object
	   oriented source. We kill the Alloc here. */
	if (alloc_res == NULL && alloc_mem) {
		exchange(alloc_mem, get_Alloc_mem(alloc));
		return curr_sp;
	}

912
913
	dbg = get_irn_dbg_info(alloc);

914
	/* we might need to multiply the size with the element size */
915
	if (type != firm_unknown_type && get_type_size_bytes(type) != 1) {
916
917
		tarval *tv    = new_tarval_from_long(get_type_size_bytes(type),
		                                     mode_Iu);
918
		ir_node *cnst = new_rd_Const(dbg, irg, block, mode_Iu, tv);
919
920
		ir_node *mul  = new_rd_Mul(dbg, irg, block, get_Alloc_size(alloc),
		                           cnst, mode_Iu);
921
922
923
924
		size = mul;
	} else {
		size = get_Alloc_size(alloc);
	}
925

926
927
928
	/* The stack pointer will be modified in an unknown manner.
	   We cannot omit it. */
	env->call->flags.bits.try_omit_fp = 0;
929

930
	stack_alignment = 1 << env->arch_env->stack_alignment;
931
	size            = adjust_alloc_size(stack_alignment, size, irg, block, dbg);
932
	new_alloc       = be_new_AddSP(env->arch_env->sp, irg, block, curr_sp, size);
933
	set_irn_dbg_info(new_alloc, dbg);
934

935
936
937
	if(alloc_mem != NULL) {
		ir_node *addsp_mem;
		ir_node *sync;
938

939
		addsp_mem = new_r_Proj(irg, block, new_alloc, mode_M, pn_be_AddSP_M);
940

941
942
		/* We need to sync the output mem of the AddSP with the input mem
		   edge into the alloc node. */
943
944
945
		ins[0] = get_Alloc_mem(alloc);
		ins[1] = addsp_mem;
		sync = new_r_Sync(irg, block, 2, ins);
946

947
948
		exchange(alloc_mem, sync);
	}
949

950
	exchange(alloc, new_alloc);
951

952
953
	/* fix projnum of alloca res */
	set_Proj_proj(alloc_res, pn_be_AddSP_res);
954

955
956
957
	addr    = alloc_res;
	curr_sp = new_r_Proj(irg, block, new_alloc,  get_irn_mode(curr_sp),
	                     pn_be_AddSP_sp);
</