]>
Commit | Line | Data |
---|---|---|
16b61764 | 1 | /* Output variables, constants and external declarations, for GNU compiler. |
5ea8f977 | 2 | Copyright (C) 1996, 1997, 1998, 2000, 2001, 2002, 2004, 2005, 2007, 2008, |
c5387660 | 3 | 2009, 2010 |
16b61764 DR |
4 | Free Software Foundation, Inc. |
5 | ||
7ec022b2 | 6 | This file is part of GCC. |
16b61764 | 7 | |
7ec022b2 | 8 | GCC is free software; you can redistribute it and/or modify |
16b61764 | 9 | it under the terms of the GNU General Public License as published by |
2f83c7d6 | 10 | the Free Software Foundation; either version 3, or (at your option) |
16b61764 DR |
11 | any later version. |
12 | ||
7ec022b2 | 13 | GCC is distributed in the hope that it will be useful, |
16b61764 DR |
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | GNU General Public License for more details. | |
17 | ||
18 | You should have received a copy of the GNU General Public License | |
2f83c7d6 NC |
19 | along with GCC; see the file COPYING3. If not see |
20 | <http://www.gnu.org/licenses/>. */ | |
16b61764 DR |
21 | |
22 | #define TARGET_OBJECT_SUFFIX ".obj" | |
23 | #define TARGET_EXECUTABLE_SUFFIX ".exe" | |
24 | ||
3bd1b109 DR |
25 | /* Alpha/VMS object format is not really Elf, but this makes compiling |
26 | crtstuff.c and dealing with shared library initialization much easier. */ | |
27 | #define OBJECT_FORMAT_ELF | |
28 | ||
16b61764 DR |
29 | /* This enables certain macros in alpha.h, which will make an indirect |
30 | reference to an external symbol an invalid address. This needs to be | |
31 | defined before we include alpha.h, since it determines which macros | |
32 | are used for GO_IF_*. */ | |
33 | ||
34 | #define NO_EXTERNAL_INDIRECT_ADDRESS | |
35 | ||
12a41c22 NB |
36 | #define TARGET_OS_CPP_BUILTINS() \ |
37 | do { \ | |
38 | builtin_define_std ("vms"); \ | |
39 | builtin_define_std ("VMS"); \ | |
40 | builtin_define ("__ALPHA"); \ | |
41 | builtin_assert ("system=vms"); \ | |
e0322d5c NB |
42 | if (TARGET_FLOAT_VAX) \ |
43 | builtin_define ("__G_FLOAT"); \ | |
44 | else \ | |
45 | builtin_define ("__IEEE_FLOAT"); \ | |
12a41c22 | 46 | } while (0) |
16b61764 | 47 | |
16b61764 | 48 | #undef TARGET_DEFAULT |
8bea7f7c | 49 | #define TARGET_DEFAULT (MASK_FPREGS|MASK_GAS) |
16b61764 DR |
50 | #undef TARGET_ABI_OPEN_VMS |
51 | #define TARGET_ABI_OPEN_VMS 1 | |
52 | ||
53 | #undef TARGET_NAME | |
54 | #define TARGET_NAME "OpenVMS/Alpha" | |
55 | #undef TARGET_VERSION | |
56 | #define TARGET_VERSION fprintf (stderr, " (%s)", TARGET_NAME); | |
57 | ||
5ea8f977 DR |
58 | #define VMS_DEBUG_MAIN_POINTER "TRANSFER$BREAK$GO" |
59 | ||
16b61764 DR |
60 | #undef PCC_STATIC_STRUCT_RETURN |
61 | ||
62 | /* "long" is 32 bits, but 64 bits for Ada. */ | |
63 | #undef LONG_TYPE_SIZE | |
64 | #define LONG_TYPE_SIZE 32 | |
65 | #define ADA_LONG_TYPE_SIZE 64 | |
66 | ||
67 | /* Pointer is 32 bits but the hardware has 64-bit addresses, sign extended. */ | |
68 | #undef POINTER_SIZE | |
69 | #define POINTER_SIZE 32 | |
70 | #define POINTERS_EXTEND_UNSIGNED 0 | |
71 | ||
72 | #define MAX_OFILE_ALIGNMENT 524288 /* 8 x 2^16 by DEC Ada Test CD40VRA */ | |
73 | ||
5e3fef6c DR |
74 | /* The maximum alignment 'malloc' honors. */ |
75 | #undef MALLOC_ALIGNMENT | |
76 | #define MALLOC_ALIGNMENT ((TARGET_MALLOC64 ? 16 : 8) * BITS_PER_UNIT) | |
77 | ||
16b61764 DR |
78 | #undef FIXED_REGISTERS |
79 | #define FIXED_REGISTERS \ | |
80 | {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ | |
81 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, \ | |
82 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ | |
83 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } | |
84 | ||
85 | #undef CALL_USED_REGISTERS | |
86 | #define CALL_USED_REGISTERS \ | |
87 | {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ | |
88 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ | |
89 | 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, \ | |
90 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } | |
91 | ||
92 | /* List the order in which to allocate registers. Each register must be | |
93 | listed once, even those in FIXED_REGISTERS. | |
94 | ||
95 | We allocate in the following order: | |
96 | $f1 (nonsaved floating-point register) | |
97 | $f10-$f15 (likewise) | |
98 | $f22-$f30 (likewise) | |
99 | $f21-$f16 (likewise, but input args) | |
100 | $f0 (nonsaved, but return value) | |
101 | $f2-$f9 (saved floating-point registers) | |
102 | $1 (nonsaved integer registers) | |
103 | $22-$25 (likewise) | |
104 | $28 (likewise) | |
105 | $0 (likewise, but return value) | |
106 | $21-$16 (likewise, but input args) | |
107 | $27 (procedure value in OSF, nonsaved in NT) | |
108 | $2-$8 (saved integer registers) | |
109 | $9-$14 (saved integer registers) | |
110 | $26 (return PC) | |
111 | $15 (frame pointer) | |
112 | $29 (global pointer) | |
113 | $30, $31, $f31 (stack pointer and always zero/ap & fp) */ | |
114 | ||
115 | #undef REG_ALLOC_ORDER | |
116 | #define REG_ALLOC_ORDER \ | |
117 | {33, \ | |
118 | 42, 43, 44, 45, 46, 47, \ | |
119 | 54, 55, 56, 57, 58, 59, 60, 61, 62, \ | |
120 | 53, 52, 51, 50, 49, 48, \ | |
121 | 32, \ | |
122 | 34, 35, 36, 37, 38, 39, 40, 41, \ | |
123 | 1, \ | |
124 | 22, 23, 24, 25, \ | |
125 | 28, \ | |
126 | 0, \ | |
127 | 21, 20, 19, 18, 17, 16, \ | |
128 | 27, \ | |
129 | 2, 3, 4, 5, 6, 7, 8, \ | |
130 | 9, 10, 11, 12, 13, 14, \ | |
131 | 26, \ | |
132 | 15, \ | |
133 | 29, \ | |
134 | 30, 31, 63 } | |
135 | ||
136 | #undef HARD_FRAME_POINTER_REGNUM | |
137 | #define HARD_FRAME_POINTER_REGNUM 29 | |
138 | ||
139 | /* Define registers used by the epilogue and return instruction. */ | |
140 | #undef EPILOGUE_USES | |
141 | #define EPILOGUE_USES(REGNO) ((REGNO) == 26 || (REGNO) == 29) | |
142 | ||
16b61764 DR |
143 | #undef INITIAL_ELIMINATION_OFFSET |
144 | #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \ | |
1d3499d8 OH |
145 | ((OFFSET) = alpha_vms_initial_elimination_offset(FROM, TO)) |
146 | ||
16b61764 DR |
147 | \f |
148 | /* Define a data type for recording info about an argument list | |
149 | during the scan of that argument list. This data type should | |
150 | hold all necessary information about the function itself | |
151 | and about the args processed so far, enough to enable macros | |
152 | such as FUNCTION_ARG to determine where the next arg should go. | |
153 | ||
154 | On Alpha/VMS, this is a structure that contains the number of | |
155 | arguments and, for each argument, the datatype of that argument. | |
156 | ||
157 | The number of arguments is a number of words of arguments scanned so far. | |
158 | Thus 6 or more means all following args should go on the stack. */ | |
159 | ||
160 | enum avms_arg_type {I64, FF, FD, FG, FS, FT}; | |
161 | typedef struct {int num_args; enum avms_arg_type atypes[6];} avms_arg_info; | |
162 | ||
163 | #undef CUMULATIVE_ARGS | |
164 | #define CUMULATIVE_ARGS avms_arg_info | |
165 | ||
166 | /* Initialize a variable CUM of type CUMULATIVE_ARGS | |
167 | for a call to a function whose data type is FNTYPE. | |
168 | For a library call, FNTYPE is 0. */ | |
169 | ||
170 | #undef INIT_CUMULATIVE_ARGS | |
0f6937fe | 171 | #define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ |
16b61764 DR |
172 | (CUM).num_args = 0; \ |
173 | (CUM).atypes[0] = (CUM).atypes[1] = (CUM).atypes[2] = I64; \ | |
174 | (CUM).atypes[3] = (CUM).atypes[4] = (CUM).atypes[5] = I64; | |
175 | ||
050d3f9d | 176 | #define DEFAULT_PCC_STRUCT_RETURN 0 |
16b61764 | 177 | |
3bd1b109 DR |
178 | #undef ASM_WEAKEN_LABEL |
179 | #define ASM_WEAKEN_LABEL(FILE, NAME) \ | |
180 | do { fputs ("\t.weak\t", FILE); assemble_name (FILE, NAME); \ | |
181 | fputc ('\n', FILE); } while (0) | |
182 | ||
d48bc59a | 183 | #define READONLY_DATA_SECTION_ASM_OP "\t.rdata" |
16b61764 DR |
184 | #define CTORS_SECTION_ASM_OP "\t.ctors" |
185 | #define DTORS_SECTION_ASM_OP "\t.dtors" | |
3bd1b109 DR |
186 | #define SDATA_SECTION_ASM_OP "\t.sdata" |
187 | #define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \ | |
188 | asm (SECTION_OP "\n\t.long " #FUNC"\n"); | |
16b61764 | 189 | |
16b61764 | 190 | #undef ASM_OUTPUT_ADDR_DIFF_ELT |
56daab84 | 191 | #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) gcc_unreachable () |
16b61764 DR |
192 | |
193 | #undef ASM_OUTPUT_ADDR_VEC_ELT | |
194 | #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \ | |
195 | fprintf (FILE, "\t.quad $L%d\n", (VALUE)) | |
196 | ||
16b61764 DR |
197 | #undef CASE_VECTOR_MODE |
198 | #define CASE_VECTOR_MODE DImode | |
199 | #undef CASE_VECTOR_PC_RELATIVE | |
200 | ||
201 | #undef ASM_OUTPUT_CASE_LABEL | |
202 | #define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,TABLEINSN) \ | |
4977bab6 | 203 | { ASM_OUTPUT_ALIGN (FILE, 3); (*targetm.asm_out.internal_label) (FILE, PREFIX, NUM); } |
16b61764 DR |
204 | |
205 | /* This says how to output assembler code to declare an | |
206 | uninitialized external linkage data object. */ | |
207 | ||
208 | #define COMMON_ASM_OP "\t.comm\t" | |
209 | ||
18fd5621 EB |
210 | #undef ASM_OUTPUT_ALIGNED_DECL_COMMON |
211 | #define ASM_OUTPUT_ALIGNED_DECL_COMMON(FILE, DECL, NAME, SIZE, ALIGN) \ | |
212 | vms_output_aligned_decl_common (FILE, DECL, NAME, SIZE, ALIGN) | |
16b61764 | 213 | \f |
16b61764 DR |
214 | /* Control how constructors and destructors are emitted. */ |
215 | #define TARGET_ASM_CONSTRUCTOR vms_asm_out_constructor | |
216 | #define TARGET_ASM_DESTRUCTOR vms_asm_out_destructor | |
217 | ||
218 | #undef SDB_DEBUGGING_INFO | |
219 | #undef MIPS_DEBUGGING_INFO | |
220 | #undef DBX_DEBUGGING_INFO | |
221 | ||
23532de9 JT |
222 | #define DWARF2_DEBUGGING_INFO 1 |
223 | #define VMS_DEBUGGING_INFO 1 | |
16b61764 DR |
224 | |
225 | #define DWARF2_UNWIND_INFO 1 | |
226 | ||
227 | #undef EH_RETURN_HANDLER_RTX | |
228 | #define EH_RETURN_HANDLER_RTX \ | |
229 | gen_rtx_MEM (Pmode, plus_constant (stack_pointer_rtx, 8)) | |
230 | ||
12300dad | 231 | #define LINK_EH_SPEC "vms-dwarf2eh.o%s " |
c889a16f | 232 | #define LINK_GCC_C_SEQUENCE_SPEC "%G" |
16b61764 | 233 | |
221cf9ab OH |
234 | #ifdef IN_LIBGCC2 |
235 | /* Get the definition for MD_FALLBACK_FRAME_STATE_FOR from a separate | |
236 | file. This avoids having to recompile the world instead of libgcc only | |
237 | when changes to this macro are exercised. */ | |
238 | ||
8662eb14 | 239 | #define MD_UNWIND_SUPPORT "config/alpha/vms-unwind.h" |
221cf9ab | 240 | #endif |
16b61764 | 241 | |
5e3fef6c DR |
242 | #define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME) \ |
243 | avms_asm_output_external (FILE, DECL, NAME) | |
244 | ||
245 | typedef struct crtl_name_spec | |
246 | { | |
247 | const char *const name; | |
248 | const char *deccname; | |
249 | int referenced; | |
250 | } crtl_name_spec; | |
251 | ||
252 | #include "config/vms/vms-crtl.h" | |
253 | ||
254 | /* Alias CRTL names to 32/64bit DECCRTL functions. | |
255 | Fixme: This should do a binary search. */ | |
256 | #define DO_CRTL_NAMES \ | |
257 | do \ | |
258 | { \ | |
259 | int i; \ | |
260 | static crtl_name_spec vms_crtl_names[] = CRTL_NAMES; \ | |
261 | static int malloc64_init = 0; \ | |
262 | \ | |
263 | if ((malloc64_init == 0) && TARGET_MALLOC64) \ | |
264 | { \ | |
265 | for (i=0; vms_crtl_names [i].name; i++) \ | |
266 | { \ | |
267 | if (strcmp ("calloc", vms_crtl_names [i].name) == 0) \ | |
268 | vms_crtl_names [i].deccname = "decc$_calloc64"; \ | |
269 | else \ | |
270 | if (strcmp ("malloc", vms_crtl_names [i].name) == 0) \ | |
271 | vms_crtl_names [i].deccname = "decc$_malloc64"; \ | |
272 | else \ | |
273 | if (strcmp ("realloc", vms_crtl_names [i].name) == 0) \ | |
274 | vms_crtl_names [i].deccname = "decc$_realloc64"; \ | |
275 | else \ | |
276 | if (strcmp ("strdup", vms_crtl_names [i].name) == 0) \ | |
277 | vms_crtl_names [i].deccname = "decc$_strdup64"; \ | |
278 | } \ | |
279 | malloc64_init = 1; \ | |
280 | } \ | |
281 | for (i=0; vms_crtl_names [i].name; i++) \ | |
282 | if (!vms_crtl_names [i].referenced && \ | |
283 | (strcmp (name, vms_crtl_names [i].name) == 0)) \ | |
284 | { \ | |
285 | fprintf (file, "\t%s=%s\n", \ | |
286 | name, vms_crtl_names [i].deccname); \ | |
287 | vms_crtl_names [i].referenced = 1; \ | |
288 | } \ | |
289 | } while (0) | |
290 | ||
e9a25f70 JL |
291 | /* This is how to output an assembler line |
292 | that says to advance the location counter | |
293 | to a multiple of 2**LOG bytes. */ | |
294 | ||
295 | #undef ASM_OUTPUT_ALIGN | |
296 | #define ASM_OUTPUT_ALIGN(FILE,LOG) \ | |
297 | fprintf (FILE, "\t.align %d\n", LOG); | |
298 | ||
7c262518 RH |
299 | /* Switch into a generic section. */ |
300 | #define TARGET_ASM_NAMED_SECTION vms_asm_named_section | |
e9a25f70 JL |
301 | |
302 | #define ASM_OUTPUT_DEF(FILE,LABEL1,LABEL2) \ | |
d6b5193b RS |
303 | do { fprintf ((FILE), "\t.literals\n"); \ |
304 | in_section = NULL; \ | |
e9a25f70 JL |
305 | fprintf ((FILE), "\t"); \ |
306 | assemble_name (FILE, LABEL1); \ | |
307 | fprintf (FILE, " = "); \ | |
308 | assemble_name (FILE, LABEL2); \ | |
309 | fprintf (FILE, "\n"); \ | |
310 | } while (0) | |
311 | ||
aacdb8bb | 312 | #undef PREFERRED_DEBUGGING_TYPE |
7a0c8d71 | 313 | #define PREFERRED_DEBUGGING_TYPE VMS_AND_DWARF2_DEBUG |
aacdb8bb | 314 | |
4977bab6 | 315 | #define ASM_PN_FORMAT "%s___%lu" |
aacdb8bb | 316 | |
60593797 | 317 | /* ??? VMS uses different linkage. */ |
eb0424da | 318 | #undef TARGET_ASM_OUTPUT_MI_THUNK |
60593797 | 319 | |
aacdb8bb | 320 | #undef ASM_SPEC |
aacdb8bb | 321 | #undef ASM_FINAL_SPEC |
7a0c8d71 DR |
322 | |
323 | /* The VMS convention is to always provide minimal debug info | |
fddeba6d | 324 | for a traceback unless specifically overridden. */ |
7a0c8d71 | 325 | |
c5387660 JM |
326 | #undef SUBTARGET_OVERRIDE_OPTIONS |
327 | #define SUBTARGET_OVERRIDE_OPTIONS \ | |
328 | do { \ | |
fddeba6d DR |
329 | if (write_symbols == NO_DEBUG \ |
330 | && debug_info_level == DINFO_LEVEL_NONE) \ | |
331 | { \ | |
332 | write_symbols = VMS_DEBUG; \ | |
333 | debug_info_level = DINFO_LEVEL_TERSE; \ | |
334 | } \ | |
c5387660 | 335 | } while (0) |
7a0c8d71 DR |
336 | |
337 | /* Link with vms-dwarf2.o if -g (except -g0). This causes the | |
d6b4baa4 | 338 | VMS link to pull all the dwarf2 debug sections together. */ |
aacdb8bb | 339 | #undef LINK_SPEC |
7a0c8d71 DR |
340 | #define LINK_SPEC "%{g:-g vms-dwarf2.o%s} %{g0} %{g1:-g1 vms-dwarf2.o%s} \ |
341 | %{g2:-g2 vms-dwarf2.o%s} %{g3:-g3 vms-dwarf2.o%s} %{shared} %{v} %{map}" | |
342 | ||
aacdb8bb | 343 | #undef STARTFILE_SPEC |
3bd1b109 DR |
344 | #define STARTFILE_SPEC \ |
345 | "%{!shared:%{mvms-return-codes:vcrt0.o%s} %{!mvms-return-codes:pcrt0.o%s} \ | |
346 | crtbegin.o%s} \ | |
347 | %{!static:%{shared:crtbeginS.o%s}}" | |
348 | ||
349 | #define ENDFILE_SPEC \ | |
350 | "%{!shared:crtend.o%s} %{!static:%{shared:crtendS.o%s}}" | |
aacdb8bb | 351 | |
5a598ccc DR |
352 | #define NAME__MAIN "__gccmain" |
353 | #define SYMBOL__MAIN __gccmain | |
5dd8a9b1 | 354 | |
3bd1b109 DR |
355 | #define INIT_SECTION_ASM_OP "\t.section LIB$INITIALIZE,GBL,NOWRT" |
356 | ||
41823c5e | 357 | #define LONGLONG_STANDALONE 1 |
dfe6ba6d DR |
358 | |
359 | #undef TARGET_VALID_POINTER_MODE | |
360 | #define TARGET_VALID_POINTER_MODE vms_valid_pointer_mode |