| Index: gcc/gcc/config/alpha/vms.h
|
| diff --git a/gcc/gcc/config/alpha/vms.h b/gcc/gcc/config/alpha/vms.h
|
| index 4f043a5dc8affa53973ea82e6322a3721fe7cbd7..c0b20f89d61b1bfc3eaa50cfa85697aed15265d6 100644
|
| --- a/gcc/gcc/config/alpha/vms.h
|
| +++ b/gcc/gcc/config/alpha/vms.h
|
| @@ -1,5 +1,6 @@
|
| /* Output variables, constants and external declarations, for GNU compiler.
|
| - Copyright (C) 1996, 1997, 1998, 2000, 2001, 2002, 2004, 2005, 2007, 2008
|
| + Copyright (C) 1996, 1997, 1998, 2000, 2001, 2002, 2004, 2005, 2007, 2008,
|
| + 2009
|
| Free Software Foundation, Inc.
|
|
|
| This file is part of GCC.
|
| @@ -21,6 +22,10 @@ along with GCC; see the file COPYING3. If not see
|
| #define TARGET_OBJECT_SUFFIX ".obj"
|
| #define TARGET_EXECUTABLE_SUFFIX ".exe"
|
|
|
| +/* Alpha/VMS object format is not really Elf, but this makes compiling
|
| + crtstuff.c and dealing with shared library initialization much easier. */
|
| +#define OBJECT_FORMAT_ELF
|
| +
|
| /* This enables certain macros in alpha.h, which will make an indirect
|
| reference to an external symbol an invalid address. This needs to be
|
| defined before we include alpha.h, since it determines which macros
|
| @@ -50,6 +55,8 @@ along with GCC; see the file COPYING3. If not see
|
| #undef TARGET_VERSION
|
| #define TARGET_VERSION fprintf (stderr, " (%s)", TARGET_NAME);
|
|
|
| +#define VMS_DEBUG_MAIN_POINTER "TRANSFER$BREAK$GO"
|
| +
|
| #undef PCC_STATIC_STRUCT_RETURN
|
|
|
| /* "long" is 32 bits, but 64 bits for Ada. */
|
| @@ -62,8 +69,14 @@ along with GCC; see the file COPYING3. If not see
|
| #define POINTER_SIZE 32
|
| #define POINTERS_EXTEND_UNSIGNED 0
|
|
|
| +#define HANDLE_SYSV_PRAGMA 1
|
| +
|
| #define MAX_OFILE_ALIGNMENT 524288 /* 8 x 2^16 by DEC Ada Test CD40VRA */
|
|
|
| +/* The maximum alignment 'malloc' honors. */
|
| +#undef MALLOC_ALIGNMENT
|
| +#define MALLOC_ALIGNMENT ((TARGET_MALLOC64 ? 16 : 8) * BITS_PER_UNIT)
|
| +
|
| #undef FIXED_REGISTERS
|
| #define FIXED_REGISTERS \
|
| {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
|
| @@ -129,29 +142,10 @@ along with GCC; see the file COPYING3. If not see
|
| #undef EPILOGUE_USES
|
| #define EPILOGUE_USES(REGNO) ((REGNO) == 26 || (REGNO) == 29)
|
|
|
| -#undef CAN_ELIMINATE
|
| -#define CAN_ELIMINATE(FROM, TO) \
|
| -((TO) != STACK_POINTER_REGNUM || ! alpha_using_fp ())
|
| -
|
| #undef INITIAL_ELIMINATION_OFFSET
|
| #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
|
| -{ switch (FROM) \
|
| - { \
|
| - case FRAME_POINTER_REGNUM: \
|
| - (OFFSET) = alpha_sa_size () + alpha_pv_save_size (); \
|
| - break; \
|
| - case ARG_POINTER_REGNUM: \
|
| - (OFFSET) = (ALPHA_ROUND (alpha_sa_size () + alpha_pv_save_size () \
|
| - + get_frame_size () \
|
| - + crtl->args.pretend_args_size) \
|
| - - crtl->args.pretend_args_size); \
|
| - break; \
|
| - default: \
|
| - gcc_unreachable (); \
|
| - } \
|
| - if ((TO) == STACK_POINTER_REGNUM) \
|
| - (OFFSET) += ALPHA_ROUND (crtl->outgoing_args_size); \
|
| -}
|
| + ((OFFSET) = alpha_vms_initial_elimination_offset(FROM, TO))
|
| +
|
|
|
| /* Define a data type for recording info about an argument list
|
| during the scan of that argument list. This data type should
|
| @@ -193,13 +187,19 @@ typedef struct {int num_args; enum avms_arg_type atypes[6];} avms_arg_info;
|
| (CUM).num_args += ALPHA_ARG_SIZE (MODE, TYPE, NAMED); \
|
| }
|
|
|
| -/* ABI has stack checking, but it's broken. */
|
| -#undef STACK_CHECK_BUILTIN
|
| -#define STACK_CHECK_BUILTIN 0
|
| +#define DEFAULT_PCC_STRUCT_RETURN 0
|
| +
|
| +#undef ASM_WEAKEN_LABEL
|
| +#define ASM_WEAKEN_LABEL(FILE, NAME) \
|
| + do { fputs ("\t.weak\t", FILE); assemble_name (FILE, NAME); \
|
| + fputc ('\n', FILE); } while (0)
|
|
|
| #define READONLY_DATA_SECTION_ASM_OP "\t.rdata"
|
| #define CTORS_SECTION_ASM_OP "\t.ctors"
|
| #define DTORS_SECTION_ASM_OP "\t.dtors"
|
| +#define SDATA_SECTION_ASM_OP "\t.sdata"
|
| +#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \
|
| + asm (SECTION_OP "\n\t.long " #FUNC"\n");
|
|
|
| #undef ASM_OUTPUT_ADDR_DIFF_ELT
|
| #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) gcc_unreachable ()
|
| @@ -221,49 +221,10 @@ typedef struct {int num_args; enum avms_arg_type atypes[6];} avms_arg_info;
|
|
|
| #define COMMON_ASM_OP "\t.comm\t"
|
|
|
| -#undef ASM_OUTPUT_ALIGNED_COMMON
|
| -#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \
|
| -do { \
|
| - fprintf ((FILE), "%s", COMMON_ASM_OP); \
|
| - assemble_name ((FILE), (NAME)); \
|
| - fprintf ((FILE), "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \
|
| -} while (0)
|
| -
|
| +#undef ASM_OUTPUT_ALIGNED_DECL_COMMON
|
| +#define ASM_OUTPUT_ALIGNED_DECL_COMMON(FILE, DECL, NAME, SIZE, ALIGN) \
|
| + vms_output_aligned_decl_common (FILE, DECL, NAME, SIZE, ALIGN)
|
|
|
| -/* Output assembler code for a block containing the constant parts
|
| - of a trampoline, leaving space for the variable parts.
|
| -
|
| - The trampoline should set the static chain pointer to value placed
|
| - into the trampoline and should branch to the specified routine.
|
| - Note that $27 has been set to the address of the trampoline, so we can
|
| - use it for addressability of the two data items. */
|
| -
|
| -#undef TRAMPOLINE_TEMPLATE
|
| -#define TRAMPOLINE_TEMPLATE(FILE) \
|
| -{ \
|
| - fprintf (FILE, "\t.quad 0\n"); \
|
| - fprintf (FILE, "\t.linkage __tramp\n"); \
|
| - fprintf (FILE, "\t.quad 0\n"); \
|
| -}
|
| -
|
| -/* Length in units of the trampoline for entering a nested function. */
|
| -
|
| -#undef TRAMPOLINE_SIZE
|
| -#define TRAMPOLINE_SIZE 32
|
| -
|
| -/* The alignment of a trampoline, in bits. */
|
| -
|
| -#undef TRAMPOLINE_ALIGNMENT
|
| -#define TRAMPOLINE_ALIGNMENT 64
|
| -
|
| -/* Emit RTL insns to initialize the variable parts of a trampoline.
|
| - FNADDR is an RTX for the address of the function's pure code.
|
| - CXT is an RTX for the static chain value for the function. */
|
| -
|
| -#undef INITIALIZE_TRAMPOLINE
|
| -#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
|
| - alpha_initialize_trampoline (TRAMP, FNADDR, CXT, 16, 24, -1)
|
| -
|
| /* Control how constructors and destructors are emitted. */
|
| #define TARGET_ASM_CONSTRUCTOR vms_asm_out_constructor
|
| #define TARGET_ASM_DESTRUCTOR vms_asm_out_destructor
|
| @@ -282,8 +243,64 @@ do { \
|
| gen_rtx_MEM (Pmode, plus_constant (stack_pointer_rtx, 8))
|
|
|
| #define LINK_EH_SPEC "vms-dwarf2eh.o%s "
|
| +#define LINK_GCC_C_SEQUENCE_SPEC "%G"
|
| +
|
| +#ifdef IN_LIBGCC2
|
| +/* Get the definition for MD_FALLBACK_FRAME_STATE_FOR from a separate
|
| + file. This avoids having to recompile the world instead of libgcc only
|
| + when changes to this macro are exercised. */
|
|
|
| #define MD_UNWIND_SUPPORT "config/alpha/vms-unwind.h"
|
| +#endif
|
| +
|
| +#define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME) \
|
| + avms_asm_output_external (FILE, DECL, NAME)
|
| +
|
| +typedef struct crtl_name_spec
|
| +{
|
| + const char *const name;
|
| + const char *deccname;
|
| + int referenced;
|
| +} crtl_name_spec;
|
| +
|
| +#include "config/vms/vms-crtl.h"
|
| +
|
| +/* Alias CRTL names to 32/64bit DECCRTL functions.
|
| + Fixme: This should do a binary search. */
|
| +#define DO_CRTL_NAMES \
|
| + do \
|
| + { \
|
| + int i; \
|
| + static crtl_name_spec vms_crtl_names[] = CRTL_NAMES; \
|
| + static int malloc64_init = 0; \
|
| + \
|
| + if ((malloc64_init == 0) && TARGET_MALLOC64) \
|
| + { \
|
| + for (i=0; vms_crtl_names [i].name; i++) \
|
| + { \
|
| + if (strcmp ("calloc", vms_crtl_names [i].name) == 0) \
|
| + vms_crtl_names [i].deccname = "decc$_calloc64"; \
|
| + else \
|
| + if (strcmp ("malloc", vms_crtl_names [i].name) == 0) \
|
| + vms_crtl_names [i].deccname = "decc$_malloc64"; \
|
| + else \
|
| + if (strcmp ("realloc", vms_crtl_names [i].name) == 0) \
|
| + vms_crtl_names [i].deccname = "decc$_realloc64"; \
|
| + else \
|
| + if (strcmp ("strdup", vms_crtl_names [i].name) == 0) \
|
| + vms_crtl_names [i].deccname = "decc$_strdup64"; \
|
| + } \
|
| + malloc64_init = 1; \
|
| + } \
|
| + for (i=0; vms_crtl_names [i].name; i++) \
|
| + if (!vms_crtl_names [i].referenced && \
|
| + (strcmp (name, vms_crtl_names [i].name) == 0)) \
|
| + { \
|
| + fprintf (file, "\t%s=%s\n", \
|
| + name, vms_crtl_names [i].deccname); \
|
| + vms_crtl_names [i].referenced = 1; \
|
| + } \
|
| + } while (0)
|
|
|
| /* This is how to output an assembler line
|
| that says to advance the location counter
|
| @@ -318,22 +335,18 @@ do { \
|
| #undef ASM_FINAL_SPEC
|
|
|
| /* The VMS convention is to always provide minimal debug info
|
| - for a traceback unless specifically overridden. Defaulting this here
|
| - is a kludge. */
|
| -
|
| -#define OPTIMIZATION_OPTIONS(OPTIMIZE, OPTIMIZE_SIZE) \
|
| -{ \
|
| - write_symbols = VMS_DEBUG; \
|
| - debug_info_level = (enum debug_info_level) 1; \
|
| -}
|
| + for a traceback unless specifically overridden. */
|
|
|
| -/* Override traceback debug info on -g0. */
|
| #undef OVERRIDE_OPTIONS
|
| -#define OVERRIDE_OPTIONS \
|
| -{ \
|
| - if (write_symbols == NO_DEBUG) \
|
| - debug_info_level = (enum debug_info_level) 0; \
|
| - override_options (); \
|
| +#define OVERRIDE_OPTIONS \
|
| +{ \
|
| + if (write_symbols == NO_DEBUG \
|
| + && debug_info_level == DINFO_LEVEL_NONE) \
|
| + { \
|
| + write_symbols = VMS_DEBUG; \
|
| + debug_info_level = DINFO_LEVEL_TERSE; \
|
| + } \
|
| + override_options (); \
|
| }
|
|
|
| /* Link with vms-dwarf2.o if -g (except -g0). This causes the
|
| @@ -343,26 +356,20 @@ do { \
|
| %{g2:-g2 vms-dwarf2.o%s} %{g3:-g3 vms-dwarf2.o%s} %{shared} %{v} %{map}"
|
|
|
| #undef STARTFILE_SPEC
|
| -#define STARTFILE_SPEC "%{!shared:%{mvms-return-codes:vcrt0.o%s} \
|
| -%{!mvms-return-codes:pcrt0.o%s}}"
|
| +#define STARTFILE_SPEC \
|
| +"%{!shared:%{mvms-return-codes:vcrt0.o%s} %{!mvms-return-codes:pcrt0.o%s} \
|
| + crtbegin.o%s} \
|
| + %{!static:%{shared:crtbeginS.o%s}}"
|
|
|
| -#undef LIB_SPEC
|
| -#define LIB_SPEC "-lc"
|
| +#define ENDFILE_SPEC \
|
| +"%{!shared:crtend.o%s} %{!static:%{shared:crtendS.o%s}}"
|
|
|
| #define NAME__MAIN "__gccmain"
|
| #define SYMBOL__MAIN __gccmain
|
|
|
| -#define MD_EXEC_PREFIX "/gnu/lib/gcc-lib/"
|
| -#define MD_STARTFILE_PREFIX "/gnu/lib/gcc-lib/"
|
| -
|
| -/* Specify the list of include file directories. */
|
| -#define INCLUDE_DEFAULTS \
|
| -{ \
|
| - { "/gnu/lib/gcc-lib/include", 0, 0, 0 }, \
|
| - { "/gnu_gxx_include", 0, 1, 1 }, \
|
| - { "/gnu_cc_include", 0, 0, 0 }, \
|
| - { "/gnu/include", 0, 0, 0 }, \
|
| - { 0, 0, 0, 0 } \
|
| -}
|
| +#define INIT_SECTION_ASM_OP "\t.section LIB$INITIALIZE,GBL,NOWRT"
|
|
|
| #define LONGLONG_STANDALONE 1
|
| +
|
| +#undef TARGET_VALID_POINTER_MODE
|
| +#define TARGET_VALID_POINTER_MODE vms_valid_pointer_mode
|
|
|