From 1f9ea4d0a40cca64d60cf4dab152349da7b9dddf Mon Sep 17 00:00:00 2001 From: kan Date: Sat, 19 May 2007 01:19:51 +0000 Subject: GCC 4.2.0 release. --- contrib/gcc/vmsdbgout.c | 82 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 55 insertions(+), 27 deletions(-) (limited to 'contrib/gcc/vmsdbgout.c') 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); -- cgit v1.1