be.h 7.95 KB
Newer Older
Christian Würdig's avatar
Christian Würdig committed
1
2
/*
 * This file is part of libFirm.
3
 * Copyright (C) 2012 University of Karlsruhe.
Christian Würdig's avatar
Christian Würdig committed
4
5
 */

Christian Würdig's avatar
Christian Würdig committed
6
7
8
9
10
/**
 * @file
 * @brief       Generic backend types and interfaces.
 * @author      Sebastian Hack
 */
11
12
#ifndef FIRM_BE_H
#define FIRM_BE_H
13

14
#include <stdio.h>
15
#include "irarch.h"
16
#include "iroptimize.h"
17
#include "irmode.h"
18
#include "begin.h"
Christian Würdig's avatar
Christian Würdig committed
19

Matthias Braun's avatar
Matthias Braun committed
20
21
22
23
24
25
26
/**
 * @defgroup be  Code Generation
 *
 * Code Generation (backend) produces machine-code.
 * @{
 */

27
28
29
30
31
32
/**
 * flags categorizing assembler constraint specifications
 */
typedef enum asm_constraint_flags_t {
	ASM_CONSTRAINT_FLAG_NONE                  = 0, /**< no constraints */
	/** input/output can be in a register */
33
	ASM_CONSTRAINT_FLAG_SUPPORTS_REGISTER     = 1u << 0,
34
	/** input/output can be read/written to/from a memory address */
35
	ASM_CONSTRAINT_FLAG_SUPPORTS_MEMOP        = 1u << 1,
36
	/** input can be encoded as an immediate number */
37
	ASM_CONSTRAINT_FLAG_SUPPORTS_IMMEDIATE    = 1u << 2,
38
39
	/** input/output can be in a register, in memory or an immediate */
	ASM_CONSTRAINT_FLAG_SUPPORTS_ANY          = ASM_CONSTRAINT_FLAG_SUPPORTS_IMMEDIATE | ASM_CONSTRAINT_FLAG_SUPPORTS_MEMOP | ASM_CONSTRAINT_FLAG_SUPPORTS_REGISTER,
40
	/** the constraint is not supported yet by libFirm (but valid in gcc) */
41
	ASM_CONSTRAINT_FLAG_NO_SUPPORT            = 1u << 3,
42
	/** The input is also written to */
43
	ASM_CONSTRAINT_FLAG_MODIFIER_WRITE        = 1u << 4,
44
	/** the input is read */
45
	ASM_CONSTRAINT_FLAG_MODIFIER_READ         = 1u << 5,
46
47
	/** the value is modified before all inputs to the asm block
	 * are handled. */
48
	ASM_CONSTRAINT_FLAG_MODIFIER_EARLYCLOBBER = 1u << 6,
49
	/** This operand and the following operand are commutative */
50
	ASM_CONSTRAINT_FLAG_MODIFIER_COMMUTATIVE  = 1u << 7,
51
	/** invalid constraint (due to parse error) */
52
	ASM_CONSTRAINT_FLAG_INVALID               = 1u << 8
53
} asm_constraint_flags_t;
54
ENUM_BITSET(asm_constraint_flags_t)
55

Matthias Braun's avatar
Matthias Braun committed
56
/** Dwarf source language codes. */
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
typedef enum {
	DW_LANG_C89 = 0x0001,
	DW_LANG_C = 0x0002,
	DW_LANG_Ada83 = 0x0003,
	DW_LANG_C_plus_plus = 0x0004,
	DW_LANG_Cobol74 = 0x0005,
	DW_LANG_Cobol85 = 0x0006,
	DW_LANG_Fortran77 = 0x0007,
	DW_LANG_Fortran90 = 0x0008,
	DW_LANG_Pascal83 = 0x0009,
	DW_LANG_Modula2 = 0x000a,
	DW_LANG_Java = 0x000b,
	DW_LANG_C99 = 0x000c,
	DW_LANG_Ada95 = 0x000d,
	DW_LANG_Fortran95 = 0x000e,
	DW_LANG_PLI = 0x000f,
	DW_LANG_ObjC = 0x0010,
	DW_LANG_ObjC_plus_plus = 0x0011,
	DW_LANG_UPC = 0x0012,
	DW_LANG_D = 0x0013,
	DW_LANG_Python = 0x0014,
	DW_LANG_Go = 0x0016,
} dwarf_source_language;

81
82
83
84
85
86
87
88
89
90
91
92
93
94
typedef void(*lower_func)(ir_node*);

/**
 * This structure holds the information on how the backend implements
 * variadic functions.
 */
typedef struct vararg_params {
	/** Which type is to be used for va_list. If this is NULL, the
	 * backend does not implement variadic functions. */
	ir_type    *va_list_type;
	/** The function to lower a call to the va_arg macro. */
	lower_func  lower_va_arg;
} vararg_params;

95
96
97
98
99
/**
 * This structure contains parameters that should be
 * propagated to the libFirm parameter set.
 */
typedef struct backend_params {
100
101
	/** the backend uses big-endian byte ordering if set, else little endian */
	unsigned byte_order_big_endian:1;
102
103
	/** 1 if backend supports generation of position independent code (PIC) */
	unsigned pic_supported:1;
104
105
106
	/** unaligned memory accesses are not supported natively (but the backend
	 * may break the access up into several smaller ones) */
	unsigned unaligned_memaccess_supported:1;
107

108
109
110
111
112
113
	/**
	 * Shifts on this architecture only read some bits of the shift value.
	 * For example on x86 for every mode with less than 32bits only 5 bits of
	 * the shift value are read resulting in a modulo shift value of 32.
	 * On an architecture without modulo_shift this value is 0.
	 */
Matthias Braun's avatar
Matthias Braun committed
114
	unsigned modulo_shift;
115

116
	/** Settings for architecture dependent optimizations. */
117
	const ir_settings_arch_dep_t *dep_param;
118

119
	/** Backend settings for if-conversion. */
120
	arch_allow_ifconv_func allow_ifconv;
121

122
123
	/** size of machine word in bits. This is usually the size of the general
	 * purpose integer/address registers. */
124
125
	unsigned machine_size;

126
127
	/**
	 * some backends like x87 can only do arithmetic in a specific float
128
	 * mode (load/store are still done in the "normal" float/double modes).
129
130
131
	 */
	ir_mode *mode_float_arithmetic;

132
133
134
135
136
137
138
139
140
141
142
143
144
145
	/**
	 * type used for long long or NULL if none available.
	 */
	ir_type *type_long_long;

	/**
	 * type used for unsigned long long or NULL if none available
	 */
	ir_type *type_unsigned_long_long;

	/**
	 * type used for long double or NULL if none available.
	 */
	ir_type *type_long_double;
146

147
148
	/** Alignment of stack parameters */
	unsigned stack_param_align;
149
150
151

	/** Semantic on float->int conversion overflow. */
	float_int_conversion_overflow_style_t float_int_overflow;
152
153
154

	/** How this backend implements variadic functions. */
	vararg_params vararg;
155
156
} backend_params;

157
/**
Matthias Braun's avatar
Matthias Braun committed
158
159
160
161
 * Parse one backend argument. This is intended to provide commandline options
 * to various backend parameters that might be changing.
 * Returns -1 if 'help' was found, 0 if the argument could not be parsed,
 * 1 if the option could be set.
162
 */
Michael Beck's avatar
Michael Beck committed
163
FIRM_API int be_parse_arg(const char *arg);
164

Manuel Mohr's avatar
Manuel Mohr committed
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
/**
 * Returns 1 if the backend uses big-endian byte ordering
 * and 0 for little-endian.
 */
FIRM_API int be_is_big_endian(void);

/**
 * Returns size of machine words. This is usually the size
 * of the general purpose integer registers.
 */
FIRM_API unsigned be_get_machine_size(void);

/**
 * Returns supported float arithmetic mode or NULL if mode_D and mode_F
 * are supported natively.
 * Some backends like x87 can only do arithmetic in a specific float
 * mode (load/store are still done in the "normal" float/double modes).
 */
FIRM_API ir_mode *be_get_mode_float_arithmetic(void);

/** Returns type used for long long or NULL if none available. */
FIRM_API ir_type *be_get_type_long_long(void);

/** Returns type used for unsigned long long or NULL if none available. */
FIRM_API ir_type *be_get_type_unsigned_long_long(void);

/** Returns type used for long double or NULL if none available. */
FIRM_API ir_type *be_get_type_long_double(void);

194
195
196
/** Returns the backend behaviour on float to integer conversion overflow. */
FIRM_API float_int_conversion_overflow_style_t be_get_float_int_overflow(void);

197
/**
198
 * Returns the backend configuration parameter.
199
200
201
 *
 * @return libFirm configuration parameters for the selected
 *         backend
202
 */
Michael Beck's avatar
Michael Beck committed
203
FIRM_API const backend_params *be_get_backend_param(void);
Michael Beck's avatar
Michael Beck committed
204

205
206
207
208
209
210
211
/**
 * Lowers current program for the target architecture.
 * This must be run once before using be_main. The idea here is that the backend
 * can perform lowerings like doubleword-lowering, ABI adjustments or
 * implementation of boolean values, if-conversion, with target specific
 * settings.
 * The resulting graph is still a "normal" firm-graph on which you can and
212
 * should perform further architecture-neutral optimizations before be_main.
213
214
215
 */
FIRM_API void be_lower_for_target(void);

216
217
218
219
220
221
222
223
224
typedef void (*after_transform_func)(ir_graph *irg, const char *name);

/**
 * Sets a callback that is called after each transformation step in
 * be_lower_for_target(). This is typically used to run dump & verify steps
 * to help debugging.
 */
FIRM_API void be_set_after_transform_func(after_transform_func func);

Michael Beck's avatar
Michael Beck committed
225
226
227
/**
 * Main interface to the frontend.
 */
Michael Beck's avatar
Michael Beck committed
228
FIRM_API void be_main(FILE *output, const char *compilation_unit_name);
229

230
231
/**
 * parse assembler constraint strings and returns flags (so the frontend knows
232
 * which operands are inputs/outputs and whether memory is required)
233
 */
Michael Beck's avatar
Michael Beck committed
234
FIRM_API asm_constraint_flags_t be_parse_asm_constraints(const char *constraints);
235
236

/**
237
 * tests whether a string is a valid clobber in an ASM instruction
238
 */
Michael Beck's avatar
Michael Beck committed
239
FIRM_API int be_is_valid_clobber(const char *clobber);
240

241
242
243
244
245
246
247
248
249
250
251
/**
 * Sets source language for dwarf debug information.
 */
FIRM_API void be_dwarf_set_source_language(dwarf_source_language language);

/**
 * Sets working directory of the compiler (or directory where the compiler
 * searched for sources) for dwarf debug information.
 */
FIRM_API void be_dwarf_set_compilation_directory(const char *directory);

Matthias Braun's avatar
Matthias Braun committed
252
253
/** @} */

254
255
#include "end.h"

Matthias Braun's avatar
Matthias Braun committed
256
#endif