1*404b540aSrobert /* Output variables, constants and external declarations, for GNU compiler. 2*404b540aSrobert Copyright (C) 1996, 1997, 1998, 2000, 2001, 2002, 2004, 2005 3*404b540aSrobert Free Software Foundation, Inc. 4*404b540aSrobert 5*404b540aSrobert This file is part of GCC. 6*404b540aSrobert 7*404b540aSrobert GCC is free software; you can redistribute it and/or modify 8*404b540aSrobert it under the terms of the GNU General Public License as published by 9*404b540aSrobert the Free Software Foundation; either version 2, or (at your option) 10*404b540aSrobert any later version. 11*404b540aSrobert 12*404b540aSrobert GCC is distributed in the hope that it will be useful, 13*404b540aSrobert but WITHOUT ANY WARRANTY; without even the implied warranty of 14*404b540aSrobert MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*404b540aSrobert GNU General Public License for more details. 16*404b540aSrobert 17*404b540aSrobert You should have received a copy of the GNU General Public License 18*404b540aSrobert along with GCC; see the file COPYING. If not, write to 19*404b540aSrobert the Free Software Foundation, 51 Franklin Street, Fifth Floor, 20*404b540aSrobert Boston, MA 02110-1301, USA. */ 21*404b540aSrobert 22*404b540aSrobert #define TARGET_OBJECT_SUFFIX ".obj" 23*404b540aSrobert #define TARGET_EXECUTABLE_SUFFIX ".exe" 24*404b540aSrobert 25*404b540aSrobert /* This enables certain macros in alpha.h, which will make an indirect 26*404b540aSrobert reference to an external symbol an invalid address. This needs to be 27*404b540aSrobert defined before we include alpha.h, since it determines which macros 28*404b540aSrobert are used for GO_IF_*. */ 29*404b540aSrobert 30*404b540aSrobert #define NO_EXTERNAL_INDIRECT_ADDRESS 31*404b540aSrobert 32*404b540aSrobert #define TARGET_OS_CPP_BUILTINS() \ 33*404b540aSrobert do { \ 34*404b540aSrobert builtin_define_std ("vms"); \ 35*404b540aSrobert builtin_define_std ("VMS"); \ 36*404b540aSrobert builtin_define ("__ALPHA"); \ 37*404b540aSrobert builtin_assert ("system=vms"); \ 38*404b540aSrobert if (TARGET_FLOAT_VAX) \ 39*404b540aSrobert builtin_define ("__G_FLOAT"); \ 40*404b540aSrobert else \ 41*404b540aSrobert builtin_define ("__IEEE_FLOAT"); \ 42*404b540aSrobert } while (0) 43*404b540aSrobert 44*404b540aSrobert #undef TARGET_DEFAULT 45*404b540aSrobert #define TARGET_DEFAULT (MASK_FPREGS|MASK_GAS) 46*404b540aSrobert #undef TARGET_ABI_OPEN_VMS 47*404b540aSrobert #define TARGET_ABI_OPEN_VMS 1 48*404b540aSrobert 49*404b540aSrobert #undef TARGET_NAME 50*404b540aSrobert #define TARGET_NAME "OpenVMS/Alpha" 51*404b540aSrobert #undef TARGET_VERSION 52*404b540aSrobert #define TARGET_VERSION fprintf (stderr, " (%s)", TARGET_NAME); 53*404b540aSrobert 54*404b540aSrobert #undef PCC_STATIC_STRUCT_RETURN 55*404b540aSrobert 56*404b540aSrobert /* "long" is 32 bits, but 64 bits for Ada. */ 57*404b540aSrobert #undef LONG_TYPE_SIZE 58*404b540aSrobert #define LONG_TYPE_SIZE 32 59*404b540aSrobert #define ADA_LONG_TYPE_SIZE 64 60*404b540aSrobert 61*404b540aSrobert /* Pointer is 32 bits but the hardware has 64-bit addresses, sign extended. */ 62*404b540aSrobert #undef POINTER_SIZE 63*404b540aSrobert #define POINTER_SIZE 32 64*404b540aSrobert #define POINTERS_EXTEND_UNSIGNED 0 65*404b540aSrobert 66*404b540aSrobert #define MAX_OFILE_ALIGNMENT 524288 /* 8 x 2^16 by DEC Ada Test CD40VRA */ 67*404b540aSrobert 68*404b540aSrobert #undef FIXED_REGISTERS 69*404b540aSrobert #define FIXED_REGISTERS \ 70*404b540aSrobert {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 71*404b540aSrobert 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, \ 72*404b540aSrobert 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 73*404b540aSrobert 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } 74*404b540aSrobert 75*404b540aSrobert #undef CALL_USED_REGISTERS 76*404b540aSrobert #define CALL_USED_REGISTERS \ 77*404b540aSrobert {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 78*404b540aSrobert 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 79*404b540aSrobert 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, \ 80*404b540aSrobert 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } 81*404b540aSrobert 82*404b540aSrobert /* List the order in which to allocate registers. Each register must be 83*404b540aSrobert listed once, even those in FIXED_REGISTERS. 84*404b540aSrobert 85*404b540aSrobert We allocate in the following order: 86*404b540aSrobert $f1 (nonsaved floating-point register) 87*404b540aSrobert $f10-$f15 (likewise) 88*404b540aSrobert $f22-$f30 (likewise) 89*404b540aSrobert $f21-$f16 (likewise, but input args) 90*404b540aSrobert $f0 (nonsaved, but return value) 91*404b540aSrobert $f2-$f9 (saved floating-point registers) 92*404b540aSrobert $1 (nonsaved integer registers) 93*404b540aSrobert $22-$25 (likewise) 94*404b540aSrobert $28 (likewise) 95*404b540aSrobert $0 (likewise, but return value) 96*404b540aSrobert $21-$16 (likewise, but input args) 97*404b540aSrobert $27 (procedure value in OSF, nonsaved in NT) 98*404b540aSrobert $2-$8 (saved integer registers) 99*404b540aSrobert $9-$14 (saved integer registers) 100*404b540aSrobert $26 (return PC) 101*404b540aSrobert $15 (frame pointer) 102*404b540aSrobert $29 (global pointer) 103*404b540aSrobert $30, $31, $f31 (stack pointer and always zero/ap & fp) */ 104*404b540aSrobert 105*404b540aSrobert #undef REG_ALLOC_ORDER 106*404b540aSrobert #define REG_ALLOC_ORDER \ 107*404b540aSrobert {33, \ 108*404b540aSrobert 42, 43, 44, 45, 46, 47, \ 109*404b540aSrobert 54, 55, 56, 57, 58, 59, 60, 61, 62, \ 110*404b540aSrobert 53, 52, 51, 50, 49, 48, \ 111*404b540aSrobert 32, \ 112*404b540aSrobert 34, 35, 36, 37, 38, 39, 40, 41, \ 113*404b540aSrobert 1, \ 114*404b540aSrobert 22, 23, 24, 25, \ 115*404b540aSrobert 28, \ 116*404b540aSrobert 0, \ 117*404b540aSrobert 21, 20, 19, 18, 17, 16, \ 118*404b540aSrobert 27, \ 119*404b540aSrobert 2, 3, 4, 5, 6, 7, 8, \ 120*404b540aSrobert 9, 10, 11, 12, 13, 14, \ 121*404b540aSrobert 26, \ 122*404b540aSrobert 15, \ 123*404b540aSrobert 29, \ 124*404b540aSrobert 30, 31, 63 } 125*404b540aSrobert 126*404b540aSrobert #undef HARD_FRAME_POINTER_REGNUM 127*404b540aSrobert #define HARD_FRAME_POINTER_REGNUM 29 128*404b540aSrobert 129*404b540aSrobert /* Define registers used by the epilogue and return instruction. */ 130*404b540aSrobert #undef EPILOGUE_USES 131*404b540aSrobert #define EPILOGUE_USES(REGNO) ((REGNO) == 26 || (REGNO) == 29) 132*404b540aSrobert 133*404b540aSrobert #undef CAN_ELIMINATE 134*404b540aSrobert #define CAN_ELIMINATE(FROM, TO) \ 135*404b540aSrobert ((TO) != STACK_POINTER_REGNUM || ! alpha_using_fp ()) 136*404b540aSrobert 137*404b540aSrobert #undef INITIAL_ELIMINATION_OFFSET 138*404b540aSrobert #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \ 139*404b540aSrobert { switch (FROM) \ 140*404b540aSrobert { \ 141*404b540aSrobert case FRAME_POINTER_REGNUM: \ 142*404b540aSrobert (OFFSET) = alpha_sa_size () + alpha_pv_save_size (); \ 143*404b540aSrobert break; \ 144*404b540aSrobert case ARG_POINTER_REGNUM: \ 145*404b540aSrobert (OFFSET) = (ALPHA_ROUND (alpha_sa_size () + alpha_pv_save_size () \ 146*404b540aSrobert + get_frame_size () \ 147*404b540aSrobert + current_function_pretend_args_size) \ 148*404b540aSrobert - current_function_pretend_args_size); \ 149*404b540aSrobert break; \ 150*404b540aSrobert default: \ 151*404b540aSrobert gcc_unreachable (); \ 152*404b540aSrobert } \ 153*404b540aSrobert if ((TO) == STACK_POINTER_REGNUM) \ 154*404b540aSrobert (OFFSET) += ALPHA_ROUND (current_function_outgoing_args_size); \ 155*404b540aSrobert } 156*404b540aSrobert 157*404b540aSrobert /* Define a data type for recording info about an argument list 158*404b540aSrobert during the scan of that argument list. This data type should 159*404b540aSrobert hold all necessary information about the function itself 160*404b540aSrobert and about the args processed so far, enough to enable macros 161*404b540aSrobert such as FUNCTION_ARG to determine where the next arg should go. 162*404b540aSrobert 163*404b540aSrobert On Alpha/VMS, this is a structure that contains the number of 164*404b540aSrobert arguments and, for each argument, the datatype of that argument. 165*404b540aSrobert 166*404b540aSrobert The number of arguments is a number of words of arguments scanned so far. 167*404b540aSrobert Thus 6 or more means all following args should go on the stack. */ 168*404b540aSrobert 169*404b540aSrobert enum avms_arg_type {I64, FF, FD, FG, FS, FT}; 170*404b540aSrobert typedef struct {int num_args; enum avms_arg_type atypes[6];} avms_arg_info; 171*404b540aSrobert 172*404b540aSrobert #undef CUMULATIVE_ARGS 173*404b540aSrobert #define CUMULATIVE_ARGS avms_arg_info 174*404b540aSrobert 175*404b540aSrobert /* Initialize a variable CUM of type CUMULATIVE_ARGS 176*404b540aSrobert for a call to a function whose data type is FNTYPE. 177*404b540aSrobert For a library call, FNTYPE is 0. */ 178*404b540aSrobert 179*404b540aSrobert #undef INIT_CUMULATIVE_ARGS 180*404b540aSrobert #define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ 181*404b540aSrobert (CUM).num_args = 0; \ 182*404b540aSrobert (CUM).atypes[0] = (CUM).atypes[1] = (CUM).atypes[2] = I64; \ 183*404b540aSrobert (CUM).atypes[3] = (CUM).atypes[4] = (CUM).atypes[5] = I64; 184*404b540aSrobert 185*404b540aSrobert #undef FUNCTION_ARG_ADVANCE 186*404b540aSrobert #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \ 187*404b540aSrobert if (targetm.calls.must_pass_in_stack (MODE, TYPE)) \ 188*404b540aSrobert (CUM).num_args += 6; \ 189*404b540aSrobert else \ 190*404b540aSrobert { \ 191*404b540aSrobert if ((CUM).num_args < 6) \ 192*404b540aSrobert (CUM).atypes[(CUM).num_args] = alpha_arg_type (MODE); \ 193*404b540aSrobert \ 194*404b540aSrobert (CUM).num_args += ALPHA_ARG_SIZE (MODE, TYPE, NAMED); \ 195*404b540aSrobert } 196*404b540aSrobert 197*404b540aSrobert /* ABI has stack checking, but it's broken. */ 198*404b540aSrobert #undef STACK_CHECK_BUILTIN 199*404b540aSrobert #define STACK_CHECK_BUILTIN 0 200*404b540aSrobert 201*404b540aSrobert #define READONLY_DATA_SECTION_ASM_OP "\t.rdata" 202*404b540aSrobert #define CTORS_SECTION_ASM_OP "\t.ctors" 203*404b540aSrobert #define DTORS_SECTION_ASM_OP "\t.dtors" 204*404b540aSrobert 205*404b540aSrobert #undef ASM_OUTPUT_ADDR_DIFF_ELT 206*404b540aSrobert #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) gcc_unreachable () 207*404b540aSrobert 208*404b540aSrobert #undef ASM_OUTPUT_ADDR_VEC_ELT 209*404b540aSrobert #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \ 210*404b540aSrobert fprintf (FILE, "\t.quad $L%d\n", (VALUE)) 211*404b540aSrobert 212*404b540aSrobert #undef CASE_VECTOR_MODE 213*404b540aSrobert #define CASE_VECTOR_MODE DImode 214*404b540aSrobert #undef CASE_VECTOR_PC_RELATIVE 215*404b540aSrobert 216*404b540aSrobert #undef ASM_OUTPUT_CASE_LABEL 217*404b540aSrobert #define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,TABLEINSN) \ 218*404b540aSrobert { ASM_OUTPUT_ALIGN (FILE, 3); (*targetm.asm_out.internal_label) (FILE, PREFIX, NUM); } 219*404b540aSrobert 220*404b540aSrobert /* This says how to output assembler code to declare an 221*404b540aSrobert uninitialized external linkage data object. */ 222*404b540aSrobert 223*404b540aSrobert #define COMMON_ASM_OP "\t.comm\t" 224*404b540aSrobert 225*404b540aSrobert #undef ASM_OUTPUT_ALIGNED_COMMON 226*404b540aSrobert #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \ 227*404b540aSrobert do { \ 228*404b540aSrobert fprintf ((FILE), "%s", COMMON_ASM_OP); \ 229*404b540aSrobert assemble_name ((FILE), (NAME)); \ 230*404b540aSrobert fprintf ((FILE), "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \ 231*404b540aSrobert } while (0) 232*404b540aSrobert 233*404b540aSrobert 234*404b540aSrobert /* Output assembler code for a block containing the constant parts 235*404b540aSrobert of a trampoline, leaving space for the variable parts. 236*404b540aSrobert 237*404b540aSrobert The trampoline should set the static chain pointer to value placed 238*404b540aSrobert into the trampoline and should branch to the specified routine. 239*404b540aSrobert Note that $27 has been set to the address of the trampoline, so we can 240*404b540aSrobert use it for addressability of the two data items. */ 241*404b540aSrobert 242*404b540aSrobert #undef TRAMPOLINE_TEMPLATE 243*404b540aSrobert #define TRAMPOLINE_TEMPLATE(FILE) \ 244*404b540aSrobert { \ 245*404b540aSrobert fprintf (FILE, "\t.quad 0\n"); \ 246*404b540aSrobert fprintf (FILE, "\t.linkage __tramp\n"); \ 247*404b540aSrobert fprintf (FILE, "\t.quad 0\n"); \ 248*404b540aSrobert } 249*404b540aSrobert 250*404b540aSrobert /* Length in units of the trampoline for entering a nested function. */ 251*404b540aSrobert 252*404b540aSrobert #undef TRAMPOLINE_SIZE 253*404b540aSrobert #define TRAMPOLINE_SIZE 32 254*404b540aSrobert 255*404b540aSrobert /* The alignment of a trampoline, in bits. */ 256*404b540aSrobert 257*404b540aSrobert #undef TRAMPOLINE_ALIGNMENT 258*404b540aSrobert #define TRAMPOLINE_ALIGNMENT 64 259*404b540aSrobert 260*404b540aSrobert /* Emit RTL insns to initialize the variable parts of a trampoline. 261*404b540aSrobert FNADDR is an RTX for the address of the function's pure code. 262*404b540aSrobert CXT is an RTX for the static chain value for the function. */ 263*404b540aSrobert 264*404b540aSrobert #undef INITIALIZE_TRAMPOLINE 265*404b540aSrobert #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \ 266*404b540aSrobert alpha_initialize_trampoline (TRAMP, FNADDR, CXT, 16, 24, -1) 267*404b540aSrobert 268*404b540aSrobert /* Control how constructors and destructors are emitted. */ 269*404b540aSrobert #define TARGET_ASM_CONSTRUCTOR vms_asm_out_constructor 270*404b540aSrobert #define TARGET_ASM_DESTRUCTOR vms_asm_out_destructor 271*404b540aSrobert 272*404b540aSrobert #undef SDB_DEBUGGING_INFO 273*404b540aSrobert #undef MIPS_DEBUGGING_INFO 274*404b540aSrobert #undef DBX_DEBUGGING_INFO 275*404b540aSrobert 276*404b540aSrobert #define DWARF2_DEBUGGING_INFO 1 277*404b540aSrobert #define VMS_DEBUGGING_INFO 1 278*404b540aSrobert 279*404b540aSrobert #define DWARF2_UNWIND_INFO 1 280*404b540aSrobert 281*404b540aSrobert #undef EH_RETURN_HANDLER_RTX 282*404b540aSrobert #define EH_RETURN_HANDLER_RTX \ 283*404b540aSrobert gen_rtx_MEM (Pmode, plus_constant (stack_pointer_rtx, 8)) 284*404b540aSrobert 285*404b540aSrobert #define LINK_EH_SPEC "vms-dwarf2eh.o%s " 286*404b540aSrobert 287*404b540aSrobert #define MD_UNWIND_SUPPORT "config/alpha/vms-unwind.h" 288*404b540aSrobert 289*404b540aSrobert /* This is how to output an assembler line 290*404b540aSrobert that says to advance the location counter 291*404b540aSrobert to a multiple of 2**LOG bytes. */ 292*404b540aSrobert 293*404b540aSrobert #undef ASM_OUTPUT_ALIGN 294*404b540aSrobert #define ASM_OUTPUT_ALIGN(FILE,LOG) \ 295*404b540aSrobert fprintf (FILE, "\t.align %d\n", LOG); 296*404b540aSrobert 297*404b540aSrobert /* Switch into a generic section. */ 298*404b540aSrobert #define TARGET_ASM_NAMED_SECTION vms_asm_named_section 299*404b540aSrobert 300*404b540aSrobert #define ASM_OUTPUT_DEF(FILE,LABEL1,LABEL2) \ 301*404b540aSrobert do { fprintf ((FILE), "\t.literals\n"); \ 302*404b540aSrobert in_section = NULL; \ 303*404b540aSrobert fprintf ((FILE), "\t"); \ 304*404b540aSrobert assemble_name (FILE, LABEL1); \ 305*404b540aSrobert fprintf (FILE, " = "); \ 306*404b540aSrobert assemble_name (FILE, LABEL2); \ 307*404b540aSrobert fprintf (FILE, "\n"); \ 308*404b540aSrobert } while (0) 309*404b540aSrobert 310*404b540aSrobert #undef PREFERRED_DEBUGGING_TYPE 311*404b540aSrobert #define PREFERRED_DEBUGGING_TYPE VMS_AND_DWARF2_DEBUG 312*404b540aSrobert 313*404b540aSrobert #define ASM_PN_FORMAT "%s___%lu" 314*404b540aSrobert 315*404b540aSrobert /* ??? VMS uses different linkage. */ 316*404b540aSrobert #undef TARGET_ASM_OUTPUT_MI_THUNK 317*404b540aSrobert 318*404b540aSrobert #undef ASM_SPEC 319*404b540aSrobert #undef ASM_FINAL_SPEC 320*404b540aSrobert 321*404b540aSrobert /* The VMS convention is to always provide minimal debug info 322*404b540aSrobert for a traceback unless specifically overridden. Defaulting this here 323*404b540aSrobert is a kludge. */ 324*404b540aSrobert 325*404b540aSrobert #define OPTIMIZATION_OPTIONS(OPTIMIZE, OPTIMIZE_SIZE) \ 326*404b540aSrobert { \ 327*404b540aSrobert write_symbols = VMS_DEBUG; \ 328*404b540aSrobert debug_info_level = (enum debug_info_level) 1; \ 329*404b540aSrobert } 330*404b540aSrobert 331*404b540aSrobert /* Override traceback debug info on -g0. */ 332*404b540aSrobert #undef OVERRIDE_OPTIONS 333*404b540aSrobert #define OVERRIDE_OPTIONS \ 334*404b540aSrobert { \ 335*404b540aSrobert if (write_symbols == NO_DEBUG) \ 336*404b540aSrobert debug_info_level = (enum debug_info_level) 0; \ 337*404b540aSrobert override_options (); \ 338*404b540aSrobert } 339*404b540aSrobert 340*404b540aSrobert /* Link with vms-dwarf2.o if -g (except -g0). This causes the 341*404b540aSrobert VMS link to pull all the dwarf2 debug sections together. */ 342*404b540aSrobert #undef LINK_SPEC 343*404b540aSrobert #define LINK_SPEC "%{g:-g vms-dwarf2.o%s} %{g0} %{g1:-g1 vms-dwarf2.o%s} \ 344*404b540aSrobert %{g2:-g2 vms-dwarf2.o%s} %{g3:-g3 vms-dwarf2.o%s} %{shared} %{v} %{map}" 345*404b540aSrobert 346*404b540aSrobert #undef STARTFILE_SPEC 347*404b540aSrobert #define STARTFILE_SPEC "%{!shared:%{mvms-return-codes:vcrt0.o%s} \ 348*404b540aSrobert %{!mvms-return-codes:pcrt0.o%s}}" 349*404b540aSrobert 350*404b540aSrobert #undef LIB_SPEC 351*404b540aSrobert #define LIB_SPEC "-lc" 352*404b540aSrobert 353*404b540aSrobert #define NAME__MAIN "__gccmain" 354*404b540aSrobert #define SYMBOL__MAIN __gccmain 355*404b540aSrobert 356*404b540aSrobert #define MD_EXEC_PREFIX "/gnu/lib/gcc-lib/" 357*404b540aSrobert #define MD_STARTFILE_PREFIX "/gnu/lib/gcc-lib/" 358*404b540aSrobert 359*404b540aSrobert /* Specify the list of include file directories. */ 360*404b540aSrobert #define INCLUDE_DEFAULTS \ 361*404b540aSrobert { \ 362*404b540aSrobert { "/gnu/lib/gcc-lib/include", 0, 0, 0 }, \ 363*404b540aSrobert { "/gnu_gxx_include", 0, 1, 1 }, \ 364*404b540aSrobert { "/gnu_cc_include", 0, 0, 0 }, \ 365*404b540aSrobert { "/gnu/include", 0, 0, 0 }, \ 366*404b540aSrobert { 0, 0, 0, 0 } \ 367*404b540aSrobert } 368*404b540aSrobert 369*404b540aSrobert #define LONGLONG_STANDALONE 1 370