OSDN Git Service

PR c++/43621
[pf3gnuchains/gcc-fork.git] / gcc / vmsdbgout.c
index 158661d..44e4dc8 100644 (file)
@@ -1,6 +1,7 @@
 /* Output VMS debug format symbol table information from GCC.
    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
 /* Output VMS debug format symbol table information from GCC.
    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009
+   Free Software Foundation, Inc.
    Contributed by Douglas B. Rupp (rupp@gnat.com).
    Updated by Bernard W. Giroud (bgiroud@users.sourceforge.net).
 
    Contributed by Douglas B. Rupp (rupp@gnat.com).
    Updated by Bernard W. Giroud (bgiroud@users.sourceforge.net).
 
@@ -8,7 +9,7 @@ This file is part of GCC.
 
 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
 
 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) any later
+Software Foundation; either version 3, or (at your option) any later
 version.
 
 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
 version.
 
 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
@@ -17,9 +18,8 @@ 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
 for more details.
 
 You should have received a copy of the GNU General Public License
-along with GCC; 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/>.  */
 
 #include "config.h"
 #include "system.h"
 
 #include "config.h"
 #include "system.h"
@@ -41,6 +41,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 /* Difference in seconds between the VMS Epoch and the Unix Epoch */
 static const long long vms_epoch_offset = 3506716800ll;
 
 /* Difference in seconds between the VMS Epoch and the Unix Epoch */
 static const long long vms_epoch_offset = 3506716800ll;
 
+int vms_file_stats_name (const char *, long long *, long *, char *, int *);
+
 /* NOTE: In the comments in this file, many references are made to "Debug
    Symbol Table".  This term is abbreviated as `DST' throughout the remainder
    of this file.  */
 /* NOTE: In the comments in this file, many references are made to "Debug
    Symbol Table".  This term is abbreviated as `DST' throughout the remainder
    of this file.  */
@@ -125,7 +127,7 @@ static unsigned int func_table_in_use;
 static vms_func_ref func_table;
 
 /* Local pointer to the name of the main input file.  Initialized in
 static vms_func_ref func_table;
 
 /* Local pointer to the name of the main input file.  Initialized in
-   avmdbgout_init.  */
+   vmsdbgout_init.  */
 static const char *primary_filename;
 
 static char *module_producer;
 static const char *primary_filename;
 
 static char *module_producer;
@@ -149,13 +151,13 @@ static char *full_name (const char *);
 static unsigned int lookup_filename (const char *);
 static void addr_const_to_string (char *, rtx);
 static int write_debug_header (DST_HEADER *, const char *, int);
 static unsigned int lookup_filename (const char *);
 static void addr_const_to_string (char *, rtx);
 static int write_debug_header (DST_HEADER *, const char *, int);
-static int write_debug_addr (char *, const char *, int);
+static int write_debug_addr (const char *, const char *, int);
 static int write_debug_data1 (unsigned int, const char *, int);
 static int write_debug_data2 (unsigned int, const char *, int);
 static int write_debug_data4 (unsigned long, const char *, int);
 static int write_debug_data8 (unsigned long long, const char *, int);
 static int write_debug_data1 (unsigned int, const char *, int);
 static int write_debug_data2 (unsigned int, const char *, int);
 static int write_debug_data4 (unsigned long, const char *, int);
 static int write_debug_data8 (unsigned long long, const char *, int);
-static int write_debug_delta4 (char *, char *, const char *, int);
-static int write_debug_string (char *, const char *, int);
+static int write_debug_delta4 (const char *, const char *, const char *, int);
+static int write_debug_string (const char *, const char *, int);
 static int write_modbeg (int);
 static int write_modend (int);
 static int write_rtnbeg (int, int);
 static int write_modbeg (int);
 static int write_modend (int);
 static int write_rtnbeg (int, int);
@@ -166,14 +168,15 @@ static int write_srccorrs (int);
 
 static void vmsdbgout_init (const char *);
 static void vmsdbgout_finish (const char *);
 
 static void vmsdbgout_init (const char *);
 static void vmsdbgout_finish (const char *);
+static void vmsdbgout_assembly_start (void);
 static void vmsdbgout_define (unsigned int, const char *);
 static void vmsdbgout_undef (unsigned int, const char *);
 static void vmsdbgout_start_source_file (unsigned int, const char *);
 static void vmsdbgout_end_source_file (unsigned int);
 static void vmsdbgout_begin_block (unsigned int, unsigned int);
 static void vmsdbgout_end_block (unsigned int, unsigned int);
 static void vmsdbgout_define (unsigned int, const char *);
 static void vmsdbgout_undef (unsigned int, const char *);
 static void vmsdbgout_start_source_file (unsigned int, const char *);
 static void vmsdbgout_end_source_file (unsigned int);
 static void vmsdbgout_begin_block (unsigned int, unsigned int);
 static void vmsdbgout_end_block (unsigned int, unsigned int);
-static bool vmsdbgout_ignore_block (tree);
-static void vmsdbgout_source_line (unsigned int, const char *);
+static bool vmsdbgout_ignore_block (const_tree);
+static void vmsdbgout_source_line (unsigned int, const char *, int, bool);
 static void vmsdbgout_begin_prologue (unsigned int, const char *);
 static void vmsdbgout_end_prologue (unsigned int, const char *);
 static void vmsdbgout_end_function (unsigned int);
 static void vmsdbgout_begin_prologue (unsigned int, const char *);
 static void vmsdbgout_end_prologue (unsigned int, const char *);
 static void vmsdbgout_end_function (unsigned int);
@@ -188,6 +191,7 @@ static void vmsdbgout_abstract_function (tree);
 const struct gcc_debug_hooks vmsdbg_debug_hooks
 = {vmsdbgout_init,
    vmsdbgout_finish,
 const struct gcc_debug_hooks vmsdbg_debug_hooks
 = {vmsdbgout_init,
    vmsdbgout_finish,
+   vmsdbgout_assembly_start,
    vmsdbgout_define,
    vmsdbgout_undef,
    vmsdbgout_start_source_file,
    vmsdbgout_define,
    vmsdbgout_undef,
    vmsdbgout_start_source_file,
@@ -204,12 +208,19 @@ const struct gcc_debug_hooks vmsdbg_debug_hooks
    vmsdbgout_decl,
    vmsdbgout_global_decl,
    debug_nothing_tree_int,       /* type_decl */
    vmsdbgout_decl,
    vmsdbgout_global_decl,
    debug_nothing_tree_int,       /* type_decl */
-   debug_nothing_tree_tree,       /* imported_module_or_decl */
+   debug_nothing_tree_tree_tree_bool, /* imported_module_or_decl */
    debug_nothing_tree,           /* deferred_inline_function */
    vmsdbgout_abstract_function,
    debug_nothing_rtx,            /* label */
    debug_nothing_int,            /* handle_pch */
    debug_nothing_tree,           /* deferred_inline_function */
    vmsdbgout_abstract_function,
    debug_nothing_rtx,            /* label */
    debug_nothing_int,            /* handle_pch */
-   debug_nothing_rtx             /* var_location */
+   debug_nothing_rtx,            /* var_location */
+   debug_nothing_void,            /* switch_text_section */
+   debug_nothing_tree,           /* direct_call */
+   debug_nothing_tree_int,       /* virtual_call_token */
+   debug_nothing_rtx_rtx,        /* copy_call_info */
+   debug_nothing_uid,            /* virtual_call */
+   debug_nothing_tree_tree,      /* set_name */
+   0                              /* start_end_main_source_file */
 };
 
 /* Definitions of defaults for assembler-dependent names of various
 };
 
 /* Definitions of defaults for assembler-dependent names of various
@@ -340,34 +351,34 @@ static char text_end_label[MAX_ARTIFICIAL_LABEL_BYTES];
 
 #ifndef ASM_OUTPUT_DEBUG_DATA1
 #define ASM_OUTPUT_DEBUG_DATA1(FILE,VALUE) \
 
 #ifndef ASM_OUTPUT_DEBUG_DATA1
 #define ASM_OUTPUT_DEBUG_DATA1(FILE,VALUE) \
-  fprintf ((FILE), "\t%s\t0x%x", ASM_BYTE_OP, (unsigned char) VALUE)
+  fprintf ((FILE), "\t%s\t%#x", ASM_BYTE_OP, (unsigned char) VALUE)
 #endif
 
 #ifndef ASM_OUTPUT_DEBUG_DATA2
 #define ASM_OUTPUT_DEBUG_DATA2(FILE,VALUE) \
 #endif
 
 #ifndef ASM_OUTPUT_DEBUG_DATA2
 #define ASM_OUTPUT_DEBUG_DATA2(FILE,VALUE) \
-  fprintf ((FILE), "\t%s\t0x%x", UNALIGNED_SHORT_ASM_OP, \
+  fprintf ((FILE), "\t%s\t%#x", UNALIGNED_SHORT_ASM_OP, \
           (unsigned short) VALUE)
 #endif
 
 #ifndef ASM_OUTPUT_DEBUG_DATA4
 #define ASM_OUTPUT_DEBUG_DATA4(FILE,VALUE) \
           (unsigned short) VALUE)
 #endif
 
 #ifndef ASM_OUTPUT_DEBUG_DATA4
 #define ASM_OUTPUT_DEBUG_DATA4(FILE,VALUE) \
-  fprintf ((FILE), "\t%s\t0x%lx", UNALIGNED_INT_ASM_OP, (unsigned long) VALUE)
+  fprintf ((FILE), "\t%s\t%#lx", UNALIGNED_INT_ASM_OP, (unsigned long) VALUE)
 #endif
 
 #ifndef ASM_OUTPUT_DEBUG_DATA
 #define ASM_OUTPUT_DEBUG_DATA(FILE,VALUE) \
 #endif
 
 #ifndef ASM_OUTPUT_DEBUG_DATA
 #define ASM_OUTPUT_DEBUG_DATA(FILE,VALUE) \
-  fprintf ((FILE), "\t%s\t0x%lx", UNALIGNED_OFFSET_ASM_OP(VALUE), VALUE)
+  fprintf ((FILE), "\t%s\t%#lx", UNALIGNED_OFFSET_ASM_OP(VALUE), VALUE)
 #endif
 
 #ifndef ASM_OUTPUT_DEBUG_ADDR_DATA
 #define ASM_OUTPUT_DEBUG_ADDR_DATA(FILE,VALUE) \
 #endif
 
 #ifndef ASM_OUTPUT_DEBUG_ADDR_DATA
 #define ASM_OUTPUT_DEBUG_ADDR_DATA(FILE,VALUE) \
-  fprintf ((FILE), "\t%s\t0x%lx", UNALIGNED_PTR_ASM_OP, \
+  fprintf ((FILE), "\t%s\t%#lx", UNALIGNED_PTR_ASM_OP, \
           (unsigned long) VALUE)
 #endif
 
 #ifndef ASM_OUTPUT_DEBUG_DATA8
 #define ASM_OUTPUT_DEBUG_DATA8(FILE,VALUE) \
           (unsigned long) VALUE)
 #endif
 
 #ifndef ASM_OUTPUT_DEBUG_DATA8
 #define ASM_OUTPUT_DEBUG_DATA8(FILE,VALUE) \
-  fprintf ((FILE), "\t%s\t0x%llx", UNALIGNED_DOUBLE_INT_ASM_OP, \
+  fprintf ((FILE), "\t%s\t%#llx", UNALIGNED_DOUBLE_INT_ASM_OP, \
                                  (unsigned long long) VALUE)
 #endif
 
                                  (unsigned long long) VALUE)
 #endif
 
@@ -379,7 +390,7 @@ static char text_end_label[MAX_ARTIFICIAL_LABEL_BYTES];
   do                                           \
     {                                          \
       register int slen = strlen(P);           \
   do                                           \
     {                                          \
       register int slen = strlen(P);           \
-      register char *p = (P);                  \
+      register const char *p = (P);            \
       register int i;                          \
       fprintf (FILE, "\t.ascii \"");           \
       for (i = 0; i < slen; i++)               \
       register int i;                          \
       fprintf (FILE, "\t.ascii \"");           \
       for (i = 0; i < slen; i++)               \
@@ -487,7 +498,7 @@ addr_const_to_string (char *str, rtx x)
 
     case PLUS:
       /* Some assemblers need integer constants to appear last (eg masm).  */
 
     case PLUS:
       /* Some assemblers need integer constants to appear last (eg masm).  */
-      if (GET_CODE (XEXP (x, 0)) == CONST_INT)
+      if (CONST_INT_P (XEXP (x, 0)))
        {
          addr_const_to_string (buf1, XEXP (x, 1));
          strcat (str, buf1);
        {
          addr_const_to_string (buf1, XEXP (x, 1));
          strcat (str, buf1);
@@ -517,7 +528,7 @@ addr_const_to_string (char *str, rtx x)
       addr_const_to_string (buf1, XEXP (x, 0));
       strcat (str, buf1);
       strcat (str, "-");
       addr_const_to_string (buf1, XEXP (x, 0));
       strcat (str, buf1);
       strcat (str, "-");
-      if (GET_CODE (XEXP (x, 1)) == CONST_INT
+      if (CONST_INT_P (XEXP (x, 1))
          && INTVAL (XEXP (x, 1)) < 0)
        {
          strcat (str, "(");
          && INTVAL (XEXP (x, 1)) < 0)
        {
          strcat (str, "(");
@@ -577,7 +588,7 @@ write_debug_header (DST_HEADER *header, const char *comment, int dosizeonly)
    nonzero.  */
 
 static int
    nonzero.  */
 
 static int
-write_debug_addr (char *symbol, const char *comment, int dosizeonly)
+write_debug_addr (const char *symbol, const char *comment, int dosizeonly)
 {
   if (!dosizeonly)
     {
 {
   if (!dosizeonly)
     {
@@ -666,8 +677,8 @@ write_debug_data8 (unsigned long long data8, const char *comment,
    DOSIZEONLY is nonzero.  */
 
 static int
    DOSIZEONLY is nonzero.  */
 
 static int
-write_debug_delta4 (char *label1, char *label2, const char *comment,
-                   int dosizeonly)
+write_debug_delta4 (const char *label1, const char *label2,
+                   const char *comment, int dosizeonly)
 {
   if (!dosizeonly)
     {
 {
   if (!dosizeonly)
     {
@@ -685,7 +696,7 @@ write_debug_delta4 (char *label1, char *label2, const char *comment,
    nonzero.  */
 
 static int
    nonzero.  */
 
 static int
-write_debug_string (char *string, const char *comment, int dosizeonly)
+write_debug_string (const char *string, const char *comment, int dosizeonly)
 {
   if (!dosizeonly)
     {
 {
   if (!dosizeonly)
     {
@@ -713,7 +724,7 @@ write_modbeg (int dosizeonly)
   int totsize = 0;
 
   /* Assumes primary filename has Unix syntax file spec.  */
   int totsize = 0;
 
   /* Assumes primary filename has Unix syntax file spec.  */
-  module_name = xstrdup (basename ((char *) primary_filename));
+  module_name = xstrdup (lbasename (primary_filename));
 
   m = strrchr (module_name, '.');
   if (m)
 
   m = strrchr (module_name, '.');
   if (m)
@@ -786,7 +797,7 @@ write_modend (int dosizeonly)
 static int
 write_rtnbeg (int rtnnum, int dosizeonly)
 {
 static int
 write_rtnbeg (int rtnnum, int dosizeonly)
 {
-  char *rtnname;
+  const char *rtnname;
   int rtnnamelen;
   char *rtnentryname;
   int totsize = 0;
   int rtnnamelen;
   char *rtnentryname;
   int totsize = 0;
@@ -795,7 +806,7 @@ write_rtnbeg (int rtnnum, int dosizeonly)
   DST_PROLOG prolog;
   vms_func_ref fde = &func_table[rtnnum];
 
   DST_PROLOG prolog;
   vms_func_ref fde = &func_table[rtnnum];
 
-  rtnname = (char *)fde->vms_func_name;
+  rtnname = fde->vms_func_name;
   rtnnamelen = strlen (rtnname);
   rtnentryname = concat (rtnname, "..en", NULL);
 
   rtnnamelen = strlen (rtnname);
   rtnentryname = concat (rtnname, "..en", NULL);
 
@@ -823,7 +834,7 @@ write_rtnbeg (int rtnnum, int dosizeonly)
                                   dosizeonly);
       totsize += write_debug_data1 (strlen (go), "length of main_name",
                                    dosizeonly);
                                   dosizeonly);
       totsize += write_debug_data1 (strlen (go), "length of main_name",
                                    dosizeonly);
-      totsize += write_debug_string ((char *) go, "main name", dosizeonly);
+      totsize += write_debug_string (go, "main name", dosizeonly);
     }
 
   /* The header length never includes the length byte.  */
     }
 
   /* The header length never includes the length byte.  */
@@ -1148,7 +1159,8 @@ write_srccorr (int fileid, dst_file_info_entry file_info_entry,
     (src_command.dst_a_src_cmd_fields.dst_a_src_decl_src.dst_b_src_df_filename,
      "source_corr (filename length)", dosizeonly);
 
     (src_command.dst_a_src_cmd_fields.dst_a_src_decl_src.dst_b_src_df_filename,
      "source_corr (filename length)", dosizeonly);
 
-  totsize += write_debug_string (file_info_entry.file_name,
+  totsize += write_debug_string (remap_debug_filename (
+                                   file_info_entry.file_name),
                                 "source file name", dosizeonly);
   totsize += write_debug_data1 (src_cmdtrlr.dst_b_src_df_libmodname,
                                "source_corr (libmodname)", dosizeonly);
                                 "source file name", dosizeonly);
   totsize += write_debug_data1 (src_cmdtrlr.dst_b_src_df_libmodname,
                                "source_corr (libmodname)", dosizeonly);
@@ -1293,7 +1305,7 @@ vmsdbgout_end_prologue (unsigned int line, const char *file)
       ASM_OUTPUT_LABEL (asm_out_file, label);
 
       /* VMS PCA expects every PC range to correlate to some line and file.  */
       ASM_OUTPUT_LABEL (asm_out_file, label);
 
       /* VMS PCA expects every PC range to correlate to some line and file.  */
-      vmsdbgout_source_line (line, file);
+      vmsdbgout_source_line (line, file, 0, true);
     }
 }
 
     }
 }
 
@@ -1327,7 +1339,7 @@ vmsdbgout_end_epilogue (unsigned int line, const char *file)
       ASM_OUTPUT_LABEL (asm_out_file, label);
 
       /* VMS PCA expects every PC range to correlate to some line and file.  */
       ASM_OUTPUT_LABEL (asm_out_file, label);
 
       /* VMS PCA expects every PC range to correlate to some line and file.  */
-      vmsdbgout_source_line (line, file);
+      vmsdbgout_source_line (line, file, 0, true);
     }
 }
 
     }
 }
 
@@ -1360,7 +1372,7 @@ vmsdbgout_end_block (register unsigned line, register unsigned blocknum)
 /* Not implemented in VMS Debug.  */
 
 static bool
 /* Not implemented in VMS Debug.  */
 
 static bool
-vmsdbgout_ignore_block (tree block)
+vmsdbgout_ignore_block (const_tree block)
 {
   bool retval = 0;
 
 {
   bool retval = 0;
 
@@ -1438,48 +1450,17 @@ lookup_filename (const char *file_name)
   static unsigned int last_file_lookup_index = 0;
   register char *fn;
   register unsigned i;
   static unsigned int last_file_lookup_index = 0;
   register char *fn;
   register unsigned i;
-  char *fnam;
-  long long cdt;
-  long ebk;
-  short ffb;
-  char rfo;
+  const char *fnam;
   char flen;
   char flen;
-  struct stat statbuf;
+  long long cdt = 0;
+  long ebk = 0;
+  short ffb = 0;
+  char rfo = 0;
+  long siz = 0;
+  int ver = 0;
 
 
-  if (stat (file_name, &statbuf) == 0)
-    {
-      long gmtoff;
-#ifdef VMS
-      struct tm *ts;
-
-      /* Adjust for GMT.  */
-      ts = (struct tm *) localtime (&statbuf.st_ctime);
-      gmtoff = ts->tm_gmtoff;
-
-      /* VMS has multiple file format types.  */
-      rfo = statbuf.st_fab_rfm;
-#else
-      /* Is GMT adjustment an issue with a cross-compiler? */
-      gmtoff = 0;
-
-      /* Assume stream LF type file.  */
-      rfo = 2;
-#endif
-      cdt = 10000000 * (statbuf.st_ctime + gmtoff + vms_epoch_offset);
-      ebk = statbuf.st_size / 512 + 1;
-      ffb = statbuf.st_size - ((statbuf.st_size / 512) * 512);
-      fnam = full_name (file_name);
-      flen = strlen (fnam);
-    }
-  else
-    {
-      cdt = 0;
-      ebk = 0;
-      ffb = 0;
-      rfo = 0;
-      fnam = (char *) "";
-      flen = 0;
-    }
+  fnam = full_name (file_name);
+  flen = strlen (fnam);
 
   /* Check to see if the file name that was searched on the previous call
      matches this file name. If so, return the index.  */
 
   /* Check to see if the file name that was searched on the previous call
      matches this file name. If so, return the index.  */
@@ -1507,9 +1488,14 @@ lookup_filename (const char *file_name)
     {
 
       file_info_table_allocated += FILE_TABLE_INCREMENT;
     {
 
       file_info_table_allocated += FILE_TABLE_INCREMENT;
-      file_info_table = xrealloc (file_info_table,
-                                 (file_info_table_allocated
-                                  * sizeof (dst_file_info_entry)));
+      file_info_table = XRESIZEVEC (dst_file_info_entry, file_info_table,
+                                   file_info_table_allocated);
+    }
+
+  if (vms_file_stats_name (file_name, &cdt, &siz, &rfo, &ver) == 0)
+    {
+      ebk = siz / 512 + 1;
+      ffb = siz - ((siz / 512) * 512);
     }
 
   /* Add the new entry to the end of the filename table.  */
     }
 
   /* Add the new entry to the end of the filename table.  */
@@ -1530,10 +1516,11 @@ lookup_filename (const char *file_name)
    'line_info_table' for later output of the .debug_line section.  */
 
 static void
    'line_info_table' for later output of the .debug_line section.  */
 
 static void
-vmsdbgout_source_line (register unsigned line, register const char *filename)
+vmsdbgout_source_line (register unsigned line, register const char *filename,
+                       int discriminator, bool is_stmt)
 {
   if (write_symbols == VMS_AND_DWARF2_DEBUG)
 {
   if (write_symbols == VMS_AND_DWARF2_DEBUG)
-    (*dwarf2_debug_hooks.source_line) (line, filename);
+    (*dwarf2_debug_hooks.source_line) (line, filename, discriminator, is_stmt);
 
   if (debug_info_level >= DINFO_LEVEL_TERSE)
     {
 
   if (debug_info_level >= DINFO_LEVEL_TERSE)
     {
@@ -1546,9 +1533,8 @@ vmsdbgout_source_line (register unsigned line, register const char *filename)
       if (line_info_table_in_use == line_info_table_allocated)
        {
          line_info_table_allocated += LINE_INFO_TABLE_INCREMENT;
       if (line_info_table_in_use == line_info_table_allocated)
        {
          line_info_table_allocated += LINE_INFO_TABLE_INCREMENT;
-         line_info_table = xrealloc (line_info_table,
-                                     (line_info_table_allocated
-                                      * sizeof (dst_line_info_entry)));
+         line_info_table = XRESIZEVEC (dst_line_info_entry, line_info_table,
+                                       line_info_table_allocated);
        }
 
       /* Add the new entry at the end of the line_info_table.  */
        }
 
       /* Add the new entry at the end of the line_info_table.  */
@@ -1597,8 +1583,7 @@ vmsdbgout_init (const char *main_input_filename)
   primary_filename = main_input_filename;
 
   /* Allocate the initial hunk of the file_info_table.  */
   primary_filename = main_input_filename;
 
   /* Allocate the initial hunk of the file_info_table.  */
-  file_info_table
-    = xcalloc (FILE_TABLE_INCREMENT, sizeof (dst_file_info_entry));
+  file_info_table = XCNEWVEC (dst_file_info_entry, FILE_TABLE_INCREMENT);
   file_info_table_allocated = FILE_TABLE_INCREMENT;
 
   /* Skip the first entry - file numbers begin at 1 */
   file_info_table_allocated = FILE_TABLE_INCREMENT;
 
   /* Skip the first entry - file numbers begin at 1 */
@@ -1609,8 +1594,7 @@ vmsdbgout_init (const char *main_input_filename)
   func_table_in_use = 1;
 
   /* Allocate the initial hunk of the line_info_table.  */
   func_table_in_use = 1;
 
   /* Allocate the initial hunk of the line_info_table.  */
-  line_info_table
-    = xcalloc (LINE_INFO_TABLE_INCREMENT, sizeof (dst_line_info_entry));
+  line_info_table = XCNEWVEC (dst_line_info_entry, LINE_INFO_TABLE_INCREMENT);
   line_info_table_allocated = LINE_INFO_TABLE_INCREMENT;
   /* zero-th entry is allocated, but unused */
   line_info_table_in_use = 1;
   line_info_table_allocated = LINE_INFO_TABLE_INCREMENT;
   /* zero-th entry is allocated, but unused */
   line_info_table_in_use = 1;
@@ -1637,6 +1621,15 @@ vmsdbgout_init (const char *main_input_filename)
 /* Not implemented in VMS Debug.  */
 
 static void
 /* Not implemented in VMS Debug.  */
 
 static void
+vmsdbgout_assembly_start (void)
+{
+  if (write_symbols == VMS_AND_DWARF2_DEBUG)
+    (*dwarf2_debug_hooks.assembly_start) ();
+}
+
+/* Not implemented in VMS Debug.  */
+
+static void
 vmsdbgout_define (unsigned int lineno, const char *buffer)
 {
   if (write_symbols == VMS_AND_DWARF2_DEBUG)
 vmsdbgout_define (unsigned int lineno, const char *buffer)
 {
   if (write_symbols == VMS_AND_DWARF2_DEBUG)
@@ -1695,13 +1688,13 @@ vmsdbgout_finish (const char *main_input_filename ATTRIBUTE_UNUSED)
     return;
 
   /* Output a terminator label for the .text section.  */
     return;
 
   /* Output a terminator label for the .text section.  */
-  text_section ();
+  switch_to_section (text_section);
   targetm.asm_out.internal_label (asm_out_file, TEXT_END_LABEL, 0);
 
   /* Output debugging information.
      Warning! Do not change the name of the .vmsdebug section without
      changing it in the assembler also.  */
   targetm.asm_out.internal_label (asm_out_file, TEXT_END_LABEL, 0);
 
   /* Output debugging information.
      Warning! Do not change the name of the .vmsdebug section without
      changing it in the assembler also.  */
-  named_section (NULL_TREE, ".vmsdebug", 0);
+  switch_to_section (get_named_section (NULL, ".vmsdebug", 0));
   ASM_OUTPUT_ALIGN (asm_out_file, 0);
 
   totsize = write_modbeg (1);
   ASM_OUTPUT_ALIGN (asm_out_file, 0);
 
   totsize = write_modbeg (1);
@@ -1729,4 +1722,237 @@ vmsdbgout_finish (const char *main_input_filename ATTRIBUTE_UNUSED)
   totsize = write_modend (1);
   write_modend (0);
 }
   totsize = write_modend (1);
   write_modend (0);
 }
-#endif /* VMS_DEBUGGING_INFO */
+
+/* Need for both Dwarf2 on IVMS and VMS Debug on AVMS */
+
+#ifdef VMS
+#define __NEW_STARLET 1
+#include <vms/rms.h>
+#include <vms/atrdef.h>
+#include <vms/fibdef.h>
+#include <vms/stsdef.h>
+#include <vms/iodef.h>
+#include <vms/fatdef.h>
+#include <errno.h>
+#include <vms/descrip.h>
+#include <string.h>
+#include <unixlib.h>
+
+#define MAXPATH 256
+
+/* descrip.h doesn't have everything ...  */
+typedef struct fibdef* __fibdef_ptr32 __attribute__ (( mode (SI) ));
+struct dsc$descriptor_fib
+{
+  unsigned int fib$l_len;
+  __fibdef_ptr32 fib$l_addr;
+};
+
+/* I/O Status Block.  */
+struct IOSB
+{
+  unsigned short status, count;
+  unsigned int devdep;
+};
+
+static char *tryfile;
+
+/* Variable length string.  */
+struct vstring
+{
+  short length;
+  char string[NAM$C_MAXRSS+1];
+};
+
+static char filename_buff [MAXPATH];
+static char vms_filespec [MAXPATH];
+
+/* Callback function for filespec style conversion.  */
+
+static int
+translate_unix (char *name, int type ATTRIBUTE_UNUSED)
+{
+  strncpy (filename_buff, name, MAXPATH);
+  filename_buff [MAXPATH - 1] = (char) 0;
+  return 0;
+}
+
+/* Wrapper for DECC function that converts a Unix filespec
+   to VMS style filespec.  */
+
+static char *
+to_vms_file_spec (char *filespec)
+{
+  strncpy (vms_filespec, "", MAXPATH);
+  decc$to_vms (filespec, translate_unix, 1, 1);
+  strncpy (vms_filespec, filename_buff, MAXPATH);
+
+  vms_filespec [MAXPATH - 1] = (char) 0;
+
+  return vms_filespec;
+}
+
+#else
+#define VMS_EPOCH_OFFSET 35067168000000000
+#define VMS_GRANULARITY_FACTOR 10000000
+#endif
+
+/* Return VMS file date, size, format, version given a name.  */
+
+int
+vms_file_stats_name (const char *filename, long long *cdt, long *siz, char *rfo,
+                    int *ver)
+{
+#ifdef VMS
+  struct FAB fab;
+  struct NAM nam;
+
+  unsigned long long create;
+  FAT recattr;
+  char ascnamebuff [256];
+
+  ATRDEF atrlst[]
+    = {
+      { ATR$S_CREDATE,  ATR$C_CREDATE,  &create },
+      { ATR$S_RECATTR,  ATR$C_RECATTR,  &recattr },
+      { ATR$S_ASCNAME,  ATR$C_ASCNAME,  &ascnamebuff },
+      { 0, 0, 0}
+    };
+
+  FIBDEF fib;
+  struct dsc$descriptor_fib fibdsc = {sizeof (fib), (void *) &fib};
+
+  struct IOSB iosb;
+
+  long status;
+  unsigned short chan;
+
+  struct vstring file;
+  struct dsc$descriptor_s filedsc
+    = {NAM$C_MAXRSS, DSC$K_DTYPE_T, DSC$K_CLASS_S, (void *) file.string};
+  struct vstring device;
+  struct dsc$descriptor_s devicedsc
+    = {NAM$C_MAXRSS, DSC$K_DTYPE_T, DSC$K_CLASS_S, (void *) device.string};
+  struct vstring result;
+  struct dsc$descriptor_s resultdsc
+    = {NAM$C_MAXRSS, DSC$K_DTYPE_VT, DSC$K_CLASS_VS, (void *) result.string};
+
+  if (strcmp (filename, "<internal>") == 0
+      || strcmp (filename, "<built-in>") == 0)
+    {
+      if (cdt)
+       *cdt = 0;
+
+      if (siz)
+       *siz = 0;
+
+      if (rfo)
+       *rfo = 0;
+
+      if (ver)
+        *ver = 0;
+
+      return 0;
+    }
+
+  tryfile = to_vms_file_spec (filename);
+
+  /* Allocate and initialize a FAB and NAM structures.  */
+  fab = cc$rms_fab;
+  nam = cc$rms_nam;
+
+  nam.nam$l_esa = file.string;
+  nam.nam$b_ess = NAM$C_MAXRSS;
+  nam.nam$l_rsa = result.string;
+  nam.nam$b_rss = NAM$C_MAXRSS;
+  fab.fab$l_fna = tryfile;
+  fab.fab$b_fns = strlen (tryfile);
+  fab.fab$l_nam = &nam;
+
+  /* Validate filespec syntax and device existence.  */
+  status = SYS$PARSE (&fab, 0, 0);
+  if ((status & 1) != 1)
+    return 1;
+
+  file.string[nam.nam$b_esl] = 0;
+
+  /* Find matching filespec.  */
+  status = SYS$SEARCH (&fab, 0, 0);
+  if ((status & 1) != 1)
+    return 1;
+
+  file.string[nam.nam$b_esl] = 0;
+  result.string[result.length=nam.nam$b_rsl] = 0;
+
+  /* Get the device name and assign an IO channel.  */
+  strncpy (device.string, nam.nam$l_dev, nam.nam$b_dev);
+  devicedsc.dsc$w_length  = nam.nam$b_dev;
+  chan = 0;
+  status = SYS$ASSIGN (&devicedsc, &chan, 0, 0, 0);
+  if ((status & 1) != 1)
+    return 1;
+
+  /* Initialize the FIB and fill in the directory id field.  */
+  memset (&fib, 0, sizeof (fib));
+  fib.fib$w_did[0]  = nam.nam$w_did[0];
+  fib.fib$w_did[1]  = nam.nam$w_did[1];
+  fib.fib$w_did[2]  = nam.nam$w_did[2];
+  fib.fib$l_acctl = 0;
+  fib.fib$l_wcc = 0;
+  strcpy (file.string, (strrchr (result.string, ']') + 1));
+  filedsc.dsc$w_length = strlen (file.string);
+  result.string[result.length = 0] = 0;
+
+  /* Open and close the file to fill in the attributes.  */
+  status
+    = SYS$QIOW (0, chan, IO$_ACCESS|IO$M_ACCESS, &iosb, 0, 0,
+               &fibdsc, &filedsc, &result.length, &resultdsc, &atrlst, 0);
+  if ((status & 1) != 1)
+    return 1;
+  if ((iosb.status & 1) != 1)
+    return 1;
+
+  result.string[result.length] = 0;
+  status = SYS$QIOW (0, chan, IO$_DEACCESS, &iosb, 0, 0, &fibdsc, 0, 0, 0,
+                    &atrlst, 0);
+  if ((status & 1) != 1)
+    return 1;
+  if ((iosb.status & 1) != 1)
+    return 1;
+
+  /* Deassign the channel and exit.  */
+  status = SYS$DASSGN (chan);
+  if ((status & 1) != 1)
+    return 1;
+
+  if (cdt) *cdt = create;
+  if (siz) *siz = (512 * 65536 * recattr.fat$w_efblkh) +
+                  (512 * (recattr.fat$w_efblkl - 1)) +
+                  recattr.fat$w_ffbyte;
+  if (rfo) *rfo = recattr.fat$v_rtype;
+  if (ver) *ver = strtol (strrchr (ascnamebuff, ';')+1, 0, 10);
+
+  return 0;
+#else
+  struct stat buff;
+
+  if ((stat (filename, &buff)) != 0)
+     return 1;
+
+  if (cdt)
+    *cdt = (long long) (buff.st_mtime * VMS_GRANULARITY_FACTOR)
+                        + VMS_EPOCH_OFFSET;
+
+  if (siz)
+    *siz = buff.st_size;
+
+  if (rfo)
+    *rfo = 2; /* Stream LF format */
+
+  if (ver)
+    *ver = 1;
+
+  return 0;
+#endif
+}
+#endif