OSDN Git Service

* config/alpha/alpha.c (vms_valid_pointer_mode): New function.
[pf3gnuchains/gcc-fork.git] / gcc / config / alpha / vms.h
index ba65704..e3781b5 100644 (file)
@@ -1,27 +1,31 @@
 /* Output variables, constants and external declarations, for GNU compiler.
-   Copyright (C) 1996, 1997, 1998, 2000, 2001, 2002
+   Copyright (C) 1996, 1997, 1998, 2000, 2001, 2002, 2004, 2005, 2007, 2008,
+   2009
    Free Software Foundation, Inc.
 
-This file is part of GNU CC.
+This file is part of GCC.
 
-GNU CC is free software; you can redistribute it and/or modify
+GCC is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
+the Free Software Foundation; either version 3, or (at your option)
 any later version.
 
-GNU CC is distributed in the hope that it will be useful,
+GCC is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with GNU CC; see the file COPYING.  If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
 
 #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
@@ -29,23 +33,20 @@ Boston, MA 02111-1307, USA.  */
 
 #define NO_EXTERNAL_INDIRECT_ADDRESS
 
-#include "alpha/alpha.h"
-
-#undef CPP_PREDEFINES
-#define CPP_PREDEFINES \
-"-D__ALPHA -Dvms -DVMS -D__vms__ -D__VMS__ -Asystem=vms"
-
-#undef CPP_SUBTARGET_SPEC
-#define CPP_SUBTARGET_SPEC "\
-%{mfloat-ieee:-D__IEEE_FLOAT} \
-%{mfloat-vax:-D__G_FLOAT} \
-%{!mfloat-vax:-D__IEEE_FLOAT}"
-
-/* By default, allow $ to be part of an identifier.  */
-#define DOLLARS_IN_IDENTIFIERS 2
+#define TARGET_OS_CPP_BUILTINS()               \
+    do {                                       \
+       builtin_define_std ("vms");             \
+       builtin_define_std ("VMS");             \
+       builtin_define ("__ALPHA");             \
+       builtin_assert ("system=vms");          \
+       if (TARGET_FLOAT_VAX)                   \
+         builtin_define ("__G_FLOAT");         \
+       else                                    \
+         builtin_define ("__IEEE_FLOAT");      \
+    } while (0)
 
 #undef TARGET_DEFAULT
-#define TARGET_DEFAULT (MASK_FP|MASK_FPREGS|MASK_GAS)
+#define TARGET_DEFAULT (MASK_FPREGS|MASK_GAS)
 #undef TARGET_ABI_OPEN_VMS
 #define TARGET_ABI_OPEN_VMS 1
 
@@ -54,9 +55,8 @@ Boston, MA 02111-1307, USA.  */
 #undef TARGET_VERSION
 #define TARGET_VERSION fprintf (stderr, " (%s)", TARGET_NAME);           
 
-/* The structure return address arrives as an "argument" on VMS.  */
-#undef STRUCT_VALUE_REGNUM
-#define STRUCT_VALUE 0
+#define VMS_DEBUG_MAIN_POINTER "TRANSFER$BREAK$GO"
+
 #undef PCC_STATIC_STRUCT_RETURN
 
 /* "long" is 32 bits, but 64 bits for Ada.  */
@@ -69,8 +69,14 @@ Boston, MA 02111-1307, USA.  */
 #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, \
@@ -138,22 +144,12 @@ Boston, MA 02111-1307, USA.  */
 
 #undef CAN_ELIMINATE
 #define CAN_ELIMINATE(FROM, TO)  \
-((TO) != STACK_POINTER_REGNUM || ! alpha_using_fp ())
+  (alpha_vms_can_eliminate ((FROM), (TO)))
 
 #undef INITIAL_ELIMINATION_OFFSET
 #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET)                   \
-{ if ((FROM) == FRAME_POINTER_REGNUM)                                  \
-    (OFFSET) = alpha_sa_size () + alpha_pv_save_size ();               \
-  else if ((FROM) == ARG_POINTER_REGNUM)                               \
-    (OFFSET) = (ALPHA_ROUND (alpha_sa_size () + alpha_pv_save_size ()  \
-                            + get_frame_size ()                        \
-                            + current_function_pretend_args_size)      \
-               - current_function_pretend_args_size);                  \
-  else                                                                 \
-    abort();                                                           \
-  if ((TO) == STACK_POINTER_REGNUM)                                    \
-    (OFFSET) += ALPHA_ROUND (current_function_outgoing_args_size);     \
-}
+  ((OFFSET) = alpha_vms_initial_elimination_offset(FROM, TO))
+
 \f
 /* Define a data type for recording info about an argument list
    during the scan of that argument list.  This data type should
@@ -178,14 +174,14 @@ typedef struct {int num_args; enum avms_arg_type atypes[6];} avms_arg_info;
    For a library call, FNTYPE is 0.  */
 
 #undef INIT_CUMULATIVE_ARGS
-#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) \
+#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \
   (CUM).num_args = 0;                                          \
   (CUM).atypes[0] = (CUM).atypes[1] = (CUM).atypes[2] = I64;   \
   (CUM).atypes[3] = (CUM).atypes[4] = (CUM).atypes[5] = I64;
 
 #undef FUNCTION_ARG_ADVANCE
 #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED)                   \
-  if (MUST_PASS_IN_STACK (MODE, TYPE))                                 \
+  if (targetm.calls.must_pass_in_stack (MODE, TYPE))                   \
     (CUM).num_args += 6;                                               \
   else                                                                 \
     {                                                                  \
@@ -195,163 +191,45 @@ typedef struct {int num_args; enum avms_arg_type atypes[6];} avms_arg_info;
      (CUM).num_args += ALPHA_ARG_SIZE (MODE, TYPE, NAMED);             \
     }
 
-/* For an arg passed partly in registers and partly in memory,
-   this is the number of registers used.
-   For args passed entirely in registers or entirely in memory, zero.  */
-
-#undef FUNCTION_ARG_PARTIAL_NREGS
-#define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED)             \
-((CUM).num_args < 6 && 6 < (CUM).num_args                              \
-   + ALPHA_ARG_SIZE (MODE, TYPE, NAMED)                                        \
- ? 6 - (CUM).num_args : 0)
-
-/* Perform any needed actions needed for a function that is receiving a
-   variable number of arguments. 
-
-   CUM is as for INIT_CUMULATIVE_ARGS.
-
-   MODE and TYPE are the mode and type of the current parameter.
-
-   PRETEND_SIZE is a variable that should be set to the amount of stack
-   that must be pushed by the prolog to pretend that our caller pushed
-   it.
-
-   Normally, this macro will push all remaining incoming registers on the
-   stack and set PRETEND_SIZE to the length of the registers pushed. 
-
-   For VMS, we allocate space for all 6 arg registers plus a count.
-
-   However, if NO registers need to be saved, don't allocate any space.
-   This is not only because we won't need the space, but because AP includes
-   the current_pretend_args_size and we don't want to mess up any
-   ap-relative addresses already made.  */
-
-#undef SETUP_INCOMING_VARARGS
-#define SETUP_INCOMING_VARARGS(CUM,MODE,TYPE,PRETEND_SIZE,NO_RTL)      \
-{ if ((CUM).num_args < 6)                              \
-    {                                                  \
-      if (! (NO_RTL))                                  \
-       {                                               \
-         emit_move_insn (gen_rtx_REG (DImode, 1),      \
-                         virtual_incoming_args_rtx);   \
-         emit_insn (gen_arg_home ());                  \
-       }                                               \
-                                                       \
-      PRETEND_SIZE = 7 * UNITS_PER_WORD;               \
-    }                                                  \
-}
+#define DEFAULT_PCC_STRUCT_RETURN 0
 
-/* ABI has stack checking, but it's broken.  */
-#undef STACK_CHECK_BUILTIN
-#define STACK_CHECK_BUILTIN 0
-
-#undef ASM_FILE_START
-#define ASM_FILE_START(FILE)                                   \
-{                                                              \
-  alpha_write_verstamp (FILE);                                 \
-  fprintf (FILE, "\t.set noreorder\n");                                \
-  fprintf (FILE, "\t.set volatile\n");                         \
-  if (TARGET_BWX | TARGET_MAX | TARGET_FIX | TARGET_CIX)       \
-    {                                                          \
-      fprintf (FILE, "\t.arch %s\n",                           \
-               (TARGET_CPU_EV6 ? "ev6"                         \
-                : TARGET_MAX ? "pca56" : "ev56"));             \
-    }                                                          \
-  ASM_OUTPUT_SOURCE_FILENAME (FILE, main_input_filename);      \
-}
+#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 LINK_SECTION_ASM_OP "\t.link"
-#define READONLY_SECTION_ASM_OP "\t.rdata"
-#define LITERALS_SECTION_ASM_OP "\t.literals"
+#define READONLY_DATA_SECTION_ASM_OP "\t.rdata"
 #define CTORS_SECTION_ASM_OP "\t.ctors"
 #define DTORS_SECTION_ASM_OP "\t.dtors"
-
-#undef EXTRA_SECTIONS
-#define EXTRA_SECTIONS in_link, in_rdata, in_literals
-
-#undef EXTRA_SECTION_FUNCTIONS
-#define EXTRA_SECTION_FUNCTIONS                                        \
-void                                                           \
-readonly_section ()                                            \
-{                                                              \
-  if (in_section != in_rdata)                          \
-    {                                                          \
-      fprintf (asm_out_file, "%s\n", READONLY_SECTION_ASM_OP); \
-      in_section = in_rdata;                           \
-    }                                                          \
-}                                                              \
-void                                                           \
-link_section ()                                                        \
-{                                                              \
-  if (in_section != in_link)                                   \
-    {                                                          \
-      fprintf (asm_out_file, "%s\n", LINK_SECTION_ASM_OP);     \
-      in_section = in_link;                                    \
-    }                                                          \
-}                                                               \
-void                                                           \
-literals_section ()                                            \
-{                                                              \
-  if (in_section != in_literals)                               \
-    {                                                          \
-      fprintf (asm_out_file, "%s\n", LITERALS_SECTION_ASM_OP);         \
-      in_section = in_literals;                                        \
-    }                                                          \
-}
-
-extern void readonly_section   PARAMS ((void));
-extern void link_section       PARAMS ((void));
-extern void literals_section   PARAMS ((void));
+#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) abort ()
+#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) gcc_unreachable ()
 
 #undef ASM_OUTPUT_ADDR_VEC_ELT
 #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
   fprintf (FILE, "\t.quad $L%d\n", (VALUE))
 
-#undef READONLY_DATA_SECTION
-#define READONLY_DATA_SECTION readonly_section
-
-#define ASM_FILE_END(FILE) alpha_write_linkage (FILE);
-
 #undef CASE_VECTOR_MODE
 #define CASE_VECTOR_MODE DImode
 #undef CASE_VECTOR_PC_RELATIVE
 
 #undef ASM_OUTPUT_CASE_LABEL
 #define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,TABLEINSN)       \
-{ ASM_OUTPUT_ALIGN (FILE, 3); ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM); }
+{ ASM_OUTPUT_ALIGN (FILE, 3); (*targetm.asm_out.internal_label) (FILE, PREFIX, NUM); }
 
 /* This says how to output assembler code to declare an                
    uninitialized external linkage data object.  */ 
 
 #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), ",%u,%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)
 \f
-/* 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.  */
 
@@ -379,8 +257,8 @@ do {                                                                        \
 #undef MIPS_DEBUGGING_INFO
 #undef DBX_DEBUGGING_INFO
 
-#define DWARF2_DEBUGGING_INFO
-#define VMS_DEBUGGING_INFO
+#define DWARF2_DEBUGGING_INFO 1
+#define VMS_DEBUGGING_INFO 1
 
 #define DWARF2_UNWIND_INFO 1
 
@@ -389,52 +267,65 @@ 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
-#include <libicb.h>
-#include <pdscdef.h>
-
-#define MD_FALLBACK_FRAME_STATE_FOR(CONTEXT, FS, SUCCESS)              \
- do {                                                                  \
-  unsigned long handle;                                                        \
-  PDSCDEF *pv;                                                         \
-  INVO_CONTEXT_BLK invo;                                               \
-                                                                       \
-  memset (&invo, 0, sizeof (INVO_CONTEXT_BLK));                                \
-                                                                       \
-  invo.libicb$q_ireg [29] = *((long long *) (CONTEXT)->reg [29]);      \
-  invo.libicb$q_ireg [30] = (long long) (CONTEXT)->cfa;                        \
-  handle = LIB$GET_INVO_HANDLE (&invo);                                        \
-  LIB$GET_INVO_CONTEXT (handle, &invo);                                        \
-  pv = (PDSCDEF *) invo.libicb$ph_procedure_descriptor;                        \
-                                                                       \
-  if (pv && ((pv->pdsc$w_flags & 0xf) == PDSC$K_KIND_FP_STACK))                \
-    {                                                                  \
-      int i, j;                                                                \
-                                                                       \
-      (FS)->cfa_offset = pv->pdsc$l_size;                              \
-      (FS)->cfa_reg = pv->pdsc$w_flags & PDSC$M_BASE_REG_IS_FP ? 29 : 30; \
-      (FS)->retaddr_column = 26;                                       \
-      (FS)->cfa_how = CFA_REG_OFFSET;                                  \
-      (FS)->regs.reg[27].loc.offset = -pv->pdsc$l_size;                        \
-      (FS)->regs.reg[27].how = REG_SAVED_OFFSET;                       \
-      (FS)->regs.reg[26].loc.offset                                    \
-        = -(pv->pdsc$l_size - pv->pdsc$w_rsa_offset);                  \
-      (FS)->regs.reg[26].how = REG_SAVED_OFFSET;                       \
-                                                                       \
-      for (i = 0, j = 0; i < 32; i++)                                  \
-       if (1<<i & pv->pdsc$l_ireg_mask)                                \
-         {                                                             \
-           (FS)->regs.reg[i].loc.offset                                \
-             = -(pv->pdsc$l_size - pv->pdsc$w_rsa_offset - 8 * ++j);   \
-           (FS)->regs.reg[i].how = REG_SAVED_OFFSET;                   \
-         }                                                             \
-                                                                       \
-      goto SUCCESS;                                                    \
-    }                                                                  \
-} while (0)
+/* 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
    to a multiple of 2**LOG bytes.  */
@@ -447,7 +338,8 @@ do {                                                                        \
 #define TARGET_ASM_NAMED_SECTION vms_asm_named_section
 
 #define ASM_OUTPUT_DEF(FILE,LABEL1,LABEL2)                             \
-  do { literals_section();                                             \
+  do { fprintf ((FILE), "\t.literals\n");                              \
+       in_section = NULL;                                              \
        fprintf ((FILE), "\t");                                         \
        assemble_name (FILE, LABEL1);                                   \
        fprintf (FILE, " = ");                                          \
@@ -458,67 +350,50 @@ do {                                                                      \
 #undef PREFERRED_DEBUGGING_TYPE
 #define PREFERRED_DEBUGGING_TYPE VMS_AND_DWARF2_DEBUG
 
-#undef ASM_FORMAT_PRIVATE_NAME
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 12),   \
-  sprintf ((OUTPUT), "%s___%d", (NAME), (LABELNO)))
+#define ASM_PN_FORMAT "%s___%lu"
 
 /* ??? VMS uses different linkage.  */
-#undef ASM_OUTPUT_MI_THUNK
+#undef TARGET_ASM_OUTPUT_MI_THUNK
 
 #undef ASM_SPEC
 #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
-   VMS link to pull all the dwarf2 debug sections together. */
+   VMS link to pull all the dwarf2 debug sections together.  */
 #undef LINK_SPEC
 #define LINK_SPEC "%{g:-g vms-dwarf2.o%s} %{g0} %{g1:-g1 vms-dwarf2.o%s} \
 %{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}}"
-
-#undef LIB_SPEC
-#define LIB_SPEC "-lc"
-
-/* Define the names of the division and modulus functions.  */
-#define DIVSI3_LIBCALL "OTS$DIV_I"
-#define DIVDI3_LIBCALL "OTS$DIV_L"
-#define UDIVSI3_LIBCALL "OTS$DIV_UI"
-#define UDIVDI3_LIBCALL "OTS$DIV_UL"
-#define MODSI3_LIBCALL "OTS$REM_I"
-#define MODDI3_LIBCALL "OTS$REM_L"
-#define UMODSI3_LIBCALL "OTS$REM_UI"
-#define UMODDI3_LIBCALL "OTS$REM_UL"
+#define STARTFILE_SPEC \
+"%{!shared:%{mvms-return-codes:vcrt0.o%s} %{!mvms-return-codes:pcrt0.o%s} \
+    crtbegin.o%s} \
+ %{!static:%{shared:crtbeginS.o%s}}"
+
+#define ENDFILE_SPEC \
+"%{!shared:crtend.o%s} %{!static:%{shared:crtendS.o%s}}"
 
 #define NAME__MAIN "__gccmain"
 #define SYMBOL__MAIN __gccmain
 
-/* Specify the list of include file directories.  */
-#define INCLUDE_DEFAULTS               \
-{                                      \
-  { "/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