summaryrefslogtreecommitdiffstats
path: root/contrib/gcc/vmsdbgout.c
diff options
context:
space:
mode:
authorkan <kan@FreeBSD.org>2007-05-19 01:19:51 +0000
committerkan <kan@FreeBSD.org>2007-05-19 01:19:51 +0000
commit1f9ea4d0a40cca64d60cf4dab152349da7b9dddf (patch)
tree0cb530c9c38af219e6dda2994c078b6b2b9ad853 /contrib/gcc/vmsdbgout.c
parent4895159b2b4f648051c1f139faa7b6dc50c2bfcb (diff)
downloadFreeBSD-src-1f9ea4d0a40cca64d60cf4dab152349da7b9dddf.zip
FreeBSD-src-1f9ea4d0a40cca64d60cf4dab152349da7b9dddf.tar.gz
GCC 4.2.0 release.
Diffstat (limited to 'contrib/gcc/vmsdbgout.c')
-rw-r--r--contrib/gcc/vmsdbgout.c82
1 files changed, 55 insertions, 27 deletions
diff --git a/contrib/gcc/vmsdbgout.c b/contrib/gcc/vmsdbgout.c
index 4f7f62d..d8ed683 100644
--- a/contrib/gcc/vmsdbgout.c
+++ b/contrib/gcc/vmsdbgout.c
@@ -1,7 +1,8 @@
/* 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 Free Software Foundation, Inc.
+ 1999, 2000, 2001, 2002, 2003, 2004, 2005 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 GCC.
@@ -17,8 +18,8 @@ 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. */
+Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301, USA. */
#include "config.h"
#include "system.h"
@@ -27,6 +28,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#ifdef VMS_DEBUGGING_INFO
#include "tree.h"
+#include "version.h"
#include "flags.h"
#include "rtl.h"
#include "output.h"
@@ -102,11 +104,26 @@ static unsigned int file_info_table_in_use;
table. */
#define FILE_TABLE_INCREMENT 64
-static char **func_table;
+/* A structure to hold basic information for the VMS end
+ routine. */
+
+typedef struct vms_func_struct
+{
+ const char *vms_func_name;
+ unsigned funcdef_number;
+}
+vms_func_node;
+
+typedef struct vms_func_struct *vms_func_ref;
+
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;
@@ -186,10 +203,15 @@ const struct gcc_debug_hooks vmsdbg_debug_hooks
vmsdbgout_end_function,
vmsdbgout_decl,
vmsdbgout_global_decl,
- debug_nothing_tree, /* deferred_inline_function */
+ debug_nothing_tree_int, /* type_decl */
+ debug_nothing_tree_tree, /* imported_module_or_decl */
+ debug_nothing_tree, /* deferred_inline_function */
vmsdbgout_abstract_function,
- debug_nothing_rtx, /* label */
- debug_nothing_int /* handle_pch */
+ debug_nothing_rtx, /* label */
+ debug_nothing_int, /* handle_pch */
+ debug_nothing_rtx, /* var_location */
+ debug_nothing_void, /* switch_text_section */
+ 0 /* start_end_main_source_file */
};
/* Definitions of defaults for assembler-dependent names of various
@@ -407,15 +429,13 @@ addr_const_to_string (char *str, rtx x)
char buf1[256];
char buf2[256];
-restart:
+ restart:
str[0] = '\0';
switch (GET_CODE (x))
{
case PC:
- if (flag_pic)
- strcat (str, ",");
- else
- abort ();
+ gcc_assert (flag_pic);
+ strcat (str, ",");
break;
case SYMBOL_REF:
@@ -775,8 +795,9 @@ write_rtnbeg (int rtnnum, int dosizeonly)
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);
@@ -847,7 +868,7 @@ write_rtnbeg (int rtnnum, int dosizeonly)
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);
}
@@ -865,6 +886,8 @@ write_rtnend (int rtnnum, int dosizeonly)
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;
@@ -879,8 +902,8 @@ write_rtnend (int rtnnum, int dosizeonly)
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;
@@ -1320,7 +1343,7 @@ vmsdbgout_begin_block (register unsigned line, register unsigned blocknum)
(*dwarf2_debug_hooks.begin_block) (line, blocknum);
if (debug_info_level > DINFO_LEVEL_TERSE)
- (*targetm.asm_out.internal_label) (asm_out_file, BLOCK_BEGIN_LABEL, blocknum);
+ targetm.asm_out.internal_label (asm_out_file, BLOCK_BEGIN_LABEL, blocknum);
}
/* Output a marker (i.e. a label) for the end of the generated code for a
@@ -1333,7 +1356,7 @@ vmsdbgout_end_block (register unsigned line, register unsigned blocknum)
(*dwarf2_debug_hooks.end_block) (line, blocknum);
if (debug_info_level > DINFO_LEVEL_TERSE)
- (*targetm.asm_out.internal_label) (asm_out_file, BLOCK_END_LABEL, blocknum);
+ targetm.asm_out.internal_label (asm_out_file, BLOCK_END_LABEL, blocknum);
}
/* Not implemented in VMS Debug. */
@@ -1355,6 +1378,7 @@ static void
vmsdbgout_begin_function (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);
@@ -1362,12 +1386,16 @@ vmsdbgout_begin_function (tree decl)
if (func_table_in_use == func_table_allocated)
{
func_table_allocated += FUNC_TABLE_INCREMENT;
- func_table = 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->funcdef_number = current_function_funcdef_no;
+
}
static char fullname_buff [4096];
@@ -1513,8 +1541,8 @@ vmsdbgout_source_line (register unsigned line, register const char *filename)
{
dst_line_info_ref line_info;
- (*targetm.asm_out.internal_label) (asm_out_file, LINE_CODE_LABEL,
- line_info_table_in_use);
+ targetm.asm_out.internal_label (asm_out_file, LINE_CODE_LABEL,
+ line_info_table_in_use);
/* Expand the line info table if necessary. */
if (line_info_table_in_use == line_info_table_allocated)
@@ -1578,7 +1606,7 @@ vmsdbgout_init (const char *main_input_filename)
/* Skip the first entry - file numbers begin at 1 */
file_info_table_in_use = 1;
- func_table = 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;
@@ -1669,13 +1697,13 @@ vmsdbgout_finish (const char *main_input_filename ATTRIBUTE_UNUSED)
return;
/* Output a terminator label for the .text section. */
- text_section ();
- (*targetm.asm_out.internal_label) (asm_out_file, TEXT_END_LABEL, 0);
+ 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. */
- 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);
OpenPOWER on IntegriCloud