OSDN Git Service

* config/alpha/alpha.c: Include libfuncs.h
[pf3gnuchains/gcc-fork.git] / gcc / config / alpha / vms.h
1 /* Output variables, constants and external declarations, for GNU compiler.
2    Copyright (C) 1996, 1997, 1998, 2000, 2001, 2002, 2004, 2005, 2007, 2008,
3    2009
4    Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12
13 GCC is distributed in the hope that it will be useful,
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
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 #define TARGET_OBJECT_SUFFIX ".obj"
23 #define TARGET_EXECUTABLE_SUFFIX ".exe"
24
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
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
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");          \
42         if (TARGET_FLOAT_VAX)                   \
43           builtin_define ("__G_FLOAT");         \
44         else                                    \
45           builtin_define ("__IEEE_FLOAT");      \
46     } while (0)
47
48 #undef TARGET_DEFAULT
49 #define TARGET_DEFAULT (MASK_FPREGS|MASK_GAS)
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
58 #define VMS_DEBUG_MAIN_POINTER "TRANSFER$BREAK$GO"
59
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 HANDLE_SYSV_PRAGMA 1
73
74 #define MAX_OFILE_ALIGNMENT 524288  /* 8 x 2^16 by DEC Ada Test CD40VRA */
75
76 /* The maximum alignment 'malloc' honors.  */
77 #undef  MALLOC_ALIGNMENT
78 #define MALLOC_ALIGNMENT ((TARGET_MALLOC64 ? 16 : 8) * BITS_PER_UNIT)
79
80 #undef FIXED_REGISTERS
81 #define FIXED_REGISTERS  \
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, 1, 1, 1, 1, 1, 1, \
84   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
85   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }
86
87 #undef CALL_USED_REGISTERS
88 #define CALL_USED_REGISTERS  \
89  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
90   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
91   1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, \
92   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
93
94 /* List the order in which to allocate registers.  Each register must be
95    listed once, even those in FIXED_REGISTERS.
96
97    We allocate in the following order:
98    $f1                  (nonsaved floating-point register)
99    $f10-$f15            (likewise)
100    $f22-$f30            (likewise)
101    $f21-$f16            (likewise, but input args)
102    $f0                  (nonsaved, but return value)
103    $f2-$f9              (saved floating-point registers)
104    $1                   (nonsaved integer registers)
105    $22-$25              (likewise)
106    $28                  (likewise)
107    $0                   (likewise, but return value)
108    $21-$16              (likewise, but input args)
109    $27                  (procedure value in OSF, nonsaved in NT)
110    $2-$8                (saved integer registers)
111    $9-$14               (saved integer registers)
112    $26                  (return PC)
113    $15                  (frame pointer)
114    $29                  (global pointer)
115    $30, $31, $f31       (stack pointer and always zero/ap & fp)  */
116
117 #undef REG_ALLOC_ORDER
118 #define REG_ALLOC_ORDER         \
119   {33,                                  \
120    42, 43, 44, 45, 46, 47,              \
121    54, 55, 56, 57, 58, 59, 60, 61, 62,  \
122    53, 52, 51, 50, 49, 48,              \
123    32,                                  \
124    34, 35, 36, 37, 38, 39, 40, 41,      \
125    1,                                   \
126    22, 23, 24, 25,                      \
127    28,                                  \
128    0,                                   \
129    21, 20, 19, 18, 17, 16,              \
130    27,                                  \
131    2, 3, 4, 5, 6, 7, 8,                 \
132    9, 10, 11, 12, 13, 14,               \
133    26,                                  \
134    15,                                  \
135    29,                                  \
136    30, 31, 63 }
137
138 #undef HARD_FRAME_POINTER_REGNUM
139 #define HARD_FRAME_POINTER_REGNUM 29
140
141 /* Define registers used by the epilogue and return instruction.  */
142 #undef EPILOGUE_USES
143 #define EPILOGUE_USES(REGNO)    ((REGNO) == 26 || (REGNO) == 29)
144
145 #undef CAN_ELIMINATE
146 #define CAN_ELIMINATE(FROM, TO)  \
147 ((TO) != STACK_POINTER_REGNUM || ! alpha_using_fp ())
148
149 #undef INITIAL_ELIMINATION_OFFSET
150 #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET)                    \
151 { switch (FROM)                                                         \
152     {                                                                   \
153     case FRAME_POINTER_REGNUM:                                          \
154       (OFFSET) = alpha_sa_size () + alpha_pv_save_size ();              \
155       break;                                                            \
156     case ARG_POINTER_REGNUM:                                            \
157       (OFFSET) = (ALPHA_ROUND (alpha_sa_size () + alpha_pv_save_size () \
158                                + get_frame_size ()                      \
159                                + crtl->args.pretend_args_size)  \
160                   - crtl->args.pretend_args_size);              \
161       break;                                                            \
162     default:                                                            \
163       gcc_unreachable ();                                               \
164     }                                                                   \
165   if ((TO) == STACK_POINTER_REGNUM)                                     \
166     (OFFSET) += ALPHA_ROUND (crtl->outgoing_args_size); \
167 }
168 \f
169 /* Define a data type for recording info about an argument list
170    during the scan of that argument list.  This data type should
171    hold all necessary information about the function itself
172    and about the args processed so far, enough to enable macros
173    such as FUNCTION_ARG to determine where the next arg should go.
174
175    On Alpha/VMS, this is a structure that contains the number of
176    arguments and, for each argument, the datatype of that argument.
177
178    The number of arguments is a number of words of arguments scanned so far.
179    Thus 6 or more means all following args should go on the stack.  */
180
181 enum avms_arg_type {I64, FF, FD, FG, FS, FT};
182 typedef struct {int num_args; enum avms_arg_type atypes[6];} avms_arg_info;
183
184 #undef CUMULATIVE_ARGS
185 #define CUMULATIVE_ARGS avms_arg_info
186
187 /* Initialize a variable CUM of type CUMULATIVE_ARGS
188    for a call to a function whose data type is FNTYPE.
189    For a library call, FNTYPE is 0.  */
190
191 #undef INIT_CUMULATIVE_ARGS
192 #define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \
193   (CUM).num_args = 0;                                           \
194   (CUM).atypes[0] = (CUM).atypes[1] = (CUM).atypes[2] = I64;    \
195   (CUM).atypes[3] = (CUM).atypes[4] = (CUM).atypes[5] = I64;
196
197 #undef FUNCTION_ARG_ADVANCE
198 #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED)                    \
199   if (targetm.calls.must_pass_in_stack (MODE, TYPE))                    \
200     (CUM).num_args += 6;                                                \
201   else                                                                  \
202     {                                                                   \
203       if ((CUM).num_args < 6)                                           \
204         (CUM).atypes[(CUM).num_args] = alpha_arg_type (MODE);           \
205                                                                         \
206      (CUM).num_args += ALPHA_ARG_SIZE (MODE, TYPE, NAMED);              \
207     }
208
209 /* ABI has stack checking, but it's broken.  */
210 #undef STACK_CHECK_BUILTIN
211 #define STACK_CHECK_BUILTIN 0
212
213 #undef  ASM_WEAKEN_LABEL
214 #define ASM_WEAKEN_LABEL(FILE, NAME)                            \
215    do { fputs ("\t.weak\t", FILE); assemble_name (FILE, NAME);  \
216         fputc ('\n', FILE); } while (0)
217
218 #define READONLY_DATA_SECTION_ASM_OP "\t.rdata"
219 #define CTORS_SECTION_ASM_OP "\t.ctors"
220 #define DTORS_SECTION_ASM_OP "\t.dtors"
221 #define SDATA_SECTION_ASM_OP "\t.sdata"
222 #define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC)              \
223    asm (SECTION_OP "\n\t.long " #FUNC"\n");
224
225 #undef ASM_OUTPUT_ADDR_DIFF_ELT
226 #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) gcc_unreachable ()
227
228 #undef ASM_OUTPUT_ADDR_VEC_ELT
229 #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
230   fprintf (FILE, "\t.quad $L%d\n", (VALUE))
231
232 #undef CASE_VECTOR_MODE
233 #define CASE_VECTOR_MODE DImode
234 #undef CASE_VECTOR_PC_RELATIVE
235
236 #undef ASM_OUTPUT_CASE_LABEL
237 #define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,TABLEINSN)        \
238 { ASM_OUTPUT_ALIGN (FILE, 3); (*targetm.asm_out.internal_label) (FILE, PREFIX, NUM); }
239
240 /* This says how to output assembler code to declare an                
241    uninitialized external linkage data object.  */ 
242
243 #define COMMON_ASM_OP "\t.comm\t"
244
245 #undef ASM_OUTPUT_ALIGNED_COMMON
246 #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN)              \
247 do {                                                                    \
248   fprintf ((FILE), "%s", COMMON_ASM_OP);                                \
249   assemble_name ((FILE), (NAME));                                       \
250   fprintf ((FILE), "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT);  \
251 } while (0)
252
253 \f
254 #undef TRAMPOLINE_TEMPLATE
255
256 /* Length in units of the trampoline for entering a nested function.  */
257
258 #undef TRAMPOLINE_SIZE
259 #define TRAMPOLINE_SIZE    32
260
261 /* The alignment of a trampoline, in bits.  */
262
263 #undef TRAMPOLINE_ALIGNMENT
264 #define TRAMPOLINE_ALIGNMENT  64
265
266 /* Emit RTL insns to initialize the variable parts of a trampoline.
267    FNADDR is an RTX for the address of the function's pure code.
268    CXT is an RTX for the static chain value for the function.  */
269
270 #undef INITIALIZE_TRAMPOLINE
271 #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
272   alpha_initialize_trampoline (TRAMP, FNADDR, CXT, 16, 24, -1)
273
274 /* Control how constructors and destructors are emitted.  */
275 #define TARGET_ASM_CONSTRUCTOR  vms_asm_out_constructor
276 #define TARGET_ASM_DESTRUCTOR   vms_asm_out_destructor
277
278 #undef SDB_DEBUGGING_INFO
279 #undef MIPS_DEBUGGING_INFO
280 #undef DBX_DEBUGGING_INFO
281
282 #define DWARF2_DEBUGGING_INFO 1
283 #define VMS_DEBUGGING_INFO 1
284
285 #define DWARF2_UNWIND_INFO 1
286
287 #undef EH_RETURN_HANDLER_RTX
288 #define EH_RETURN_HANDLER_RTX \
289   gen_rtx_MEM (Pmode, plus_constant (stack_pointer_rtx, 8))
290
291 #define LINK_EH_SPEC "vms-dwarf2eh.o%s "
292 #define LINK_GCC_C_SEQUENCE_SPEC "%G"
293
294 #ifdef IN_LIBGCC2
295 /* Get the definition for MD_FALLBACK_FRAME_STATE_FOR from a separate
296    file. This avoids having to recompile the world instead of libgcc only
297    when changes to this macro are exercised.  */
298
299 #define MD_UNWIND_SUPPORT "config/alpha/vms-unwind.h"
300 #endif
301
302 #define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME) \
303   avms_asm_output_external (FILE, DECL, NAME)
304
305 typedef struct crtl_name_spec
306 {
307   const char *const name;
308   const char *deccname;
309   int referenced;
310 } crtl_name_spec;
311
312 #include "config/vms/vms-crtl.h"
313
314 /* Alias CRTL names to 32/64bit DECCRTL functions. 
315    Fixme: This should do a binary search.  */
316 #define DO_CRTL_NAMES                                                      \
317   do                                                                       \
318     {                                                                      \
319       int i;                                                               \
320       static crtl_name_spec vms_crtl_names[] = CRTL_NAMES;                 \
321       static int malloc64_init = 0;                                        \
322                                                                            \
323       if ((malloc64_init == 0) && TARGET_MALLOC64)                         \
324         {                                                                  \
325           for (i=0; vms_crtl_names [i].name; i++)                          \
326             {                                                              \
327               if (strcmp ("calloc", vms_crtl_names [i].name) == 0)         \
328                 vms_crtl_names [i].deccname = "decc$_calloc64";            \
329               else                                                         \
330               if (strcmp ("malloc", vms_crtl_names [i].name) == 0)         \
331                 vms_crtl_names [i].deccname = "decc$_malloc64";            \
332               else                                                         \
333               if (strcmp ("realloc", vms_crtl_names [i].name) == 0)        \
334                 vms_crtl_names [i].deccname = "decc$_realloc64";           \
335               else                                                         \
336               if (strcmp ("strdup", vms_crtl_names [i].name) == 0)         \
337                 vms_crtl_names [i].deccname = "decc$_strdup64";            \
338             }                                                              \
339             malloc64_init = 1;                                             \
340         }                                                                  \
341       for (i=0; vms_crtl_names [i].name; i++)                              \
342         if (!vms_crtl_names [i].referenced &&                              \
343             (strcmp (name, vms_crtl_names [i].name) == 0))                 \
344           {                                                                \
345             fprintf (file, "\t%s=%s\n",                        \
346                      name, vms_crtl_names [i].deccname);                   \
347             vms_crtl_names [i].referenced = 1;                             \
348           }                                                                \
349     } while (0)
350
351 /* This is how to output an assembler line
352    that says to advance the location counter
353    to a multiple of 2**LOG bytes.  */
354
355 #undef ASM_OUTPUT_ALIGN
356 #define ASM_OUTPUT_ALIGN(FILE,LOG)      \
357     fprintf (FILE, "\t.align %d\n", LOG);
358
359 /* Switch into a generic section.  */
360 #define TARGET_ASM_NAMED_SECTION vms_asm_named_section
361
362 #define ASM_OUTPUT_DEF(FILE,LABEL1,LABEL2)                              \
363   do {  fprintf ((FILE), "\t.literals\n");                              \
364         in_section = NULL;                                              \
365         fprintf ((FILE), "\t");                                         \
366         assemble_name (FILE, LABEL1);                                   \
367         fprintf (FILE, " = ");                                          \
368         assemble_name (FILE, LABEL2);                                   \
369         fprintf (FILE, "\n");                                           \
370   } while (0)
371
372 #undef PREFERRED_DEBUGGING_TYPE
373 #define PREFERRED_DEBUGGING_TYPE VMS_AND_DWARF2_DEBUG
374
375 #define ASM_PN_FORMAT "%s___%lu"
376
377 /* ??? VMS uses different linkage.  */
378 #undef TARGET_ASM_OUTPUT_MI_THUNK
379
380 #undef ASM_SPEC
381 #undef ASM_FINAL_SPEC
382
383 /* The VMS convention is to always provide minimal debug info
384    for a traceback unless specifically overridden.  Defaulting this here
385    is a kludge.  */
386
387 #define OPTIMIZATION_OPTIONS(OPTIMIZE, OPTIMIZE_SIZE) \
388 {                                                  \
389    write_symbols = VMS_DEBUG;                      \
390    debug_info_level = (enum debug_info_level) 1;   \
391 }
392
393 /* Override traceback debug info on -g0.  */
394 #undef OVERRIDE_OPTIONS
395 #define OVERRIDE_OPTIONS                           \
396 {                                                  \
397    if (write_symbols == NO_DEBUG)                  \
398      debug_info_level = (enum debug_info_level) 0; \
399    override_options ();                            \
400 }
401
402 /* Link with vms-dwarf2.o if -g (except -g0). This causes the
403    VMS link to pull all the dwarf2 debug sections together.  */
404 #undef LINK_SPEC
405 #define LINK_SPEC "%{g:-g vms-dwarf2.o%s} %{g0} %{g1:-g1 vms-dwarf2.o%s} \
406 %{g2:-g2 vms-dwarf2.o%s} %{g3:-g3 vms-dwarf2.o%s} %{shared} %{v} %{map}"
407
408 #undef STARTFILE_SPEC
409 #define STARTFILE_SPEC \
410 "%{!shared:%{mvms-return-codes:vcrt0.o%s} %{!mvms-return-codes:pcrt0.o%s} \
411     crtbegin.o%s} \
412  %{!static:%{shared:crtbeginS.o%s}}"
413
414 #define ENDFILE_SPEC \
415 "%{!shared:crtend.o%s} %{!static:%{shared:crtendS.o%s}}"
416
417 #define NAME__MAIN "__gccmain"
418 #define SYMBOL__MAIN __gccmain
419
420 #define INIT_SECTION_ASM_OP "\t.section LIB$INITIALIZE,GBL,NOWRT"
421
422 #define LONGLONG_STANDALONE 1