This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFC] OpenVMS: correct generation of routine labels


Here is one of several proposed patches to correctly support the
interaction between gcc and gas under OpenVMS. Two are
actually needed from the gcc side and one from the gas side
which I will submit to the binutils list.

Second patch: routine labels are no more with a 1to1 correspondence
with relative routine numbering. So we must now remember what
where the numbers used at the proloue and epilogue generation time.

2004-04-05  Bernard Giroud  <bgiroud@free.fr>

        * gcc/gcc/vmsdbgout.c (write_rtnbeg, write_rtnend,
           vmsdbgout_end_epilogue,vmsdbgout_begin_function):
           Remember the labels used at prologue and epilogue
           generation to output them correctly at write_rtnend.

--- /home/bg/gcc/gcc/gcc/vmsdbgout.c Fri Dec 13 01:17:22 2002
+++ ./vmsdbgout.c Mon Apr  5 08:51:30 2004
@@ -2,6 +2,7 @@
    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
    1999, 2000, 2001, 2002 Free Software Foundation, Inc.
    Contributed by Douglas B. Rupp (rupp@gnat.com).
+   Updated by Bernard W. Giroud (bgiroud@users.sourceforge.net).

 This file is part of GNU CC.

@@ -99,11 +100,29 @@
    table.  */
 #define FILE_TABLE_INCREMENT 64

-static char **func_table;
+typedef struct vms_func_struct *vms_func_ref;
+
+/* A structure to hold basic information for the VMS end
+   routine.  */
+
+typedef struct vms_func_struct
+{
+  const char *vms_func_name;
+  const char *vms_func_begin;
+  const char *vms_func_current_label;
+  const char *vms_func_end;
+  unsigned funcdef_number;
+}
+vms_func_node;
+
 static unsigned int func_table_allocated;
 static unsigned int func_table_in_use;
 #define FUNC_TABLE_INCREMENT 256

+/* A pointer to the base of a table that contains frame description
+   information for each routine.  */
+static vms_func_ref func_table;
+
 /* Local pointer to the name of the main input file.  Initialized in
    avmdbgout_init.  */
 static const char *primary_filename;
@@ -801,8 +820,9 @@
   char label[MAX_ARTIFICIAL_LABEL_BYTES];
   DST_ROUTINE_BEGIN rtnbeg;
   DST_PROLOG prolog;
+  vms_func_ref fde = &func_table[rtnnum];

-  rtnname = func_table[rtnnum];
+  rtnname = (char *)fde->vms_func_name;
   rtnnamelen = strlen (rtnname);
   rtnentryname = concat (rtnname, "..en", NULL);

@@ -873,7 +893,7 @@
       totsize += write_debug_header (&prolog.dst_a_prolog_header,
"prolog",
          dosizeonly);

-      ASM_GENERATE_INTERNAL_LABEL (label, FUNC_PROLOG_LABEL, rtnnum);
+      ASM_GENERATE_INTERNAL_LABEL (label, FUNC_PROLOG_LABEL,
fde->funcdef_number);
       totsize += write_debug_addr (label, "prolog breakpoint addr",
        dosizeonly);
     }
@@ -893,6 +913,8 @@
   char label1[MAX_ARTIFICIAL_LABEL_BYTES];
   char label2[MAX_ARTIFICIAL_LABEL_BYTES];
   int totsize;
+  vms_func_ref fde = &func_table[rtnnum];
+  int corrected_rtnnum = fde->funcdef_number;

   totsize = 0;

@@ -907,8 +929,8 @@
   totsize += write_debug_data1 (rtnend.dst_b_rtnend_unused, "unused",
     dosizeonly);

-  ASM_GENERATE_INTERNAL_LABEL (label1, FUNC_BEGIN_LABEL, rtnnum);
-  ASM_GENERATE_INTERNAL_LABEL (label2, FUNC_END_LABEL, rtnnum);
+  ASM_GENERATE_INTERNAL_LABEL (label1, FUNC_BEGIN_LABEL,
corrected_rtnnum);
+  ASM_GENERATE_INTERNAL_LABEL (label2, FUNC_END_LABEL,
corrected_rtnnum);
   totsize += write_debug_delta4 (label2, label1, "routine size",
dosizeonly);

   return totsize;
@@ -1332,6 +1354,7 @@
      const char *file;
 {
   char label[MAX_ARTIFICIAL_LABEL_BYTES];
+  vms_func_ref fde;

   if (write_symbols == VMS_AND_DWARF2_DEBUG)
     (*dwarf2_debug_hooks.end_epilogue) (line, file);
@@ -1343,6 +1366,8 @@
       ASM_GENERATE_INTERNAL_LABEL (label, FUNC_END_LABEL,
        current_function_funcdef_no);
       ASM_OUTPUT_LABEL (asm_out_file, label);
+      fde = &func_table[func_table_in_use - 1];
+      fde->vms_func_end = xstrdup (label);

       /* VMS PCA expects every PC range to correlate to some line and
file */
       vmsdbgout_source_line (line, file);
@@ -1400,6 +1425,7 @@
      tree decl;
 {
   const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
+  vms_func_ref fde;

   if (write_symbols == VMS_AND_DWARF2_DEBUG)
     (*dwarf2_debug_hooks.begin_function) (decl);
@@ -1407,12 +1433,18 @@
   if (func_table_in_use == func_table_allocated)
     {
       func_table_allocated += FUNC_TABLE_INCREMENT;
-      func_table = (char **) xrealloc (func_table,
-           func_table_allocated * sizeof (char *));
+      func_table
+        = (vms_func_ref) xrealloc (func_table,
+           func_table_allocated * sizeof (vms_func_node));
     }

   /* Add the new entry to the end of the function name table.  */
-  func_table[func_table_in_use++] = xstrdup (name);
+  fde = &func_table[func_table_in_use++];
+  fde->vms_func_name = xstrdup (name);
+  fde->vms_func_begin = NULL;
+  fde->vms_func_current_label = NULL;
+  fde->vms_func_end = NULL;
+  fde->funcdef_number = current_function_funcdef_no;
 }

 static char fullname_buff [4096];
@@ -1634,7 +1666,7 @@
   /* Skip the first entry - file numbers begin at 1 */
   file_info_table_in_use = 1;

-  func_table = (char **) xcalloc (FUNC_TABLE_INCREMENT, sizeof (char
*));
+  func_table = (vms_func_ref) xcalloc (FUNC_TABLE_INCREMENT, sizeof
(vms_func_node));
   func_table_allocated = FUNC_TABLE_INCREMENT;
   func_table_in_use = 1;



--
Bernard Giroud
Open Source COBOL Tools Developer


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]