X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fvmsdbgout.c;h=4f7f62d2e976290f84221a8fc84123e3ed221bfa;hb=80c02bec544b4130d6eb5de7dc7188288cbeffa9;hp=5d19c458f45fdfaecba2b1ce0852809ad25607ce;hpb=6c34d0c2c1cdfa7fa0ca97cfe50fffe256aa0dee;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/vmsdbgout.c b/gcc/vmsdbgout.c index 5d19c458f45..4f7f62d2e97 100644 --- a/gcc/vmsdbgout.c +++ b/gcc/vmsdbgout.c @@ -1,9 +1,9 @@ -/* Output VMS debug format symbol table information from the GNU C compiler. +/* Output VMS debug format symbol table information from GCC. Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. Contributed by Douglas B. Rupp (rupp@gnat.com). -This file is part of GNU CC. +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 @@ -21,9 +21,11 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "config.h" +#include "system.h" +#include "coretypes.h" +#include "tm.h" #ifdef VMS_DEBUGGING_INFO -#include "system.h" #include "tree.h" #include "flags.h" #include "rtl.h" @@ -31,6 +33,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "vmsdbg.h" #include "debug.h" #include "langhooks.h" +#include "function.h" +#include "target.h" /* Difference in seconds between the VMS Epoch and the Unix Epoch */ static const long long vms_epoch_offset = 3506716800ll; @@ -83,7 +87,7 @@ dst_file_info_entry; #define PTR_SIZE 4 /* Must be 32 bits for VMS debug info */ #endif -/* Pointer to an structure of filenames referenced by this compilation unit. */ +/* Pointer to a structure of filenames referenced by this compilation unit. */ static dst_file_info_ref file_info_table; /* Total number of entries in the table (i.e. array) pointed to by @@ -123,50 +127,44 @@ static unsigned int line_info_table_in_use; /* Size (in elements) of increments by which we may expand line_info_table. */ #define LINE_INFO_TABLE_INCREMENT 1024 -/* The number of the current function definition for which debugging - information is being generated. These numbers range from 1 up to the - maximum number of function definitions contained within the current - compilation unit. These numbers are used to create unique label id's unique - to each function definition. */ -static unsigned int current_funcdef_number = 0; - /* Forward declarations for functions defined in this file. */ -static char *full_name PARAMS ((const char *)); -static unsigned int lookup_filename PARAMS ((const char *)); -static void addr_const_to_string PARAMS ((char *, rtx)); -static int write_debug_header PARAMS ((DST_HEADER *, const char *, int)); -static int write_debug_addr PARAMS ((char *, const char *, int)); -static int write_debug_data1 PARAMS ((unsigned int, const char *, int)); -static int write_debug_data2 PARAMS ((unsigned int, const char *, int)); -static int write_debug_data4 PARAMS ((unsigned long, const char *, int)); -static int write_debug_data8 PARAMS ((unsigned long long, const char *, - int)); -static int write_debug_delta4 PARAMS ((char *, char *, const char *, int)); -static int write_debug_string PARAMS ((char *, const char *, int)); -static int write_modbeg PARAMS ((int)); -static int write_modend PARAMS ((int)); -static int write_rtnbeg PARAMS ((int, int)); -static int write_rtnend PARAMS ((int, int)); -static int write_pclines PARAMS ((int)); -static int write_srccorr PARAMS ((int, dst_file_info_entry, int)); -static int write_srccorrs PARAMS ((int)); - -static void vmsdbgout_init PARAMS ((const char *)); -static void vmsdbgout_finish PARAMS ((const char *)); -static void vmsdbgout_define PARAMS ((unsigned int, const char *)); -static void vmsdbgout_undef PARAMS ((unsigned int, const char *)); -static void vmsdbgout_start_source_file PARAMS ((unsigned int, const char *)); -static void vmsdbgout_end_source_file PARAMS ((unsigned int)); -static void vmsdbgout_begin_block PARAMS ((unsigned int, unsigned int)); -static void vmsdbgout_end_block PARAMS ((unsigned int, unsigned int)); -static bool vmsdbgout_ignore_block PARAMS ((tree)); -static void vmsdbgout_source_line PARAMS ((unsigned int, const char *)); -static void vmsdbgout_begin_prologue PARAMS ((unsigned int, const char *)); -static void vmsdbgout_end_epilogue PARAMS ((void)); -static void vmsdbgout_begin_function PARAMS ((tree)); -static void vmsdbgout_decl PARAMS ((tree)); -static void vmsdbgout_global_decl PARAMS ((tree)); -static void vmsdbgout_abstract_function PARAMS ((tree)); +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 int write_debug_addr (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_delta4 (char *, char *, const char *, int); +static int write_debug_string (char *, const char *, int); +static int write_modbeg (int); +static int write_modend (int); +static int write_rtnbeg (int, int); +static int write_rtnend (int, int); +static int write_pclines (int); +static int write_srccorr (int, dst_file_info_entry, int); +static int write_srccorrs (int); + +static void vmsdbgout_init (const char *); +static void vmsdbgout_finish (const char *); +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 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_end_epilogue (unsigned int, const char *); +static void vmsdbgout_begin_function (tree); +static void vmsdbgout_decl (tree); +static void vmsdbgout_global_decl (tree); +static void vmsdbgout_abstract_function (tree); /* The debug hooks structure. */ @@ -182,15 +180,16 @@ const struct gcc_debug_hooks vmsdbg_debug_hooks vmsdbgout_ignore_block, vmsdbgout_source_line, vmsdbgout_begin_prologue, - debug_nothing_int, /* end_prologue */ - vmsdbgout_end_epilogue, /* end_epilogue */ - vmsdbgout_begin_function, /* begin_function */ - debug_nothing_int, /* end_function */ + vmsdbgout_end_prologue, + vmsdbgout_end_epilogue, + vmsdbgout_begin_function, + vmsdbgout_end_function, vmsdbgout_decl, vmsdbgout_global_decl, debug_nothing_tree, /* deferred_inline_function */ vmsdbgout_abstract_function, - debug_nothing_rtx /* label */ + debug_nothing_rtx, /* label */ + debug_nothing_int /* handle_pch */ }; /* Definitions of defaults for assembler-dependent names of various @@ -238,11 +237,6 @@ const struct gcc_debug_hooks vmsdbg_debug_hooks : (NUMBYTES(OFFSET) == 2 ? UNALIGNED_SHORT_ASM_OP : ASM_BYTE_OP)) #endif -/* Pseudo-op for defining a new section. */ -#ifndef SECTION_ASM_OP -#define SECTION_ASM_OP ".section" -#endif - /* Definitions of defaults for formats and names of various special (artificial) labels which may be generated within this file (when the -g options is used and VMS_DEBUGGING_INFO is in effect. If necessary, these @@ -358,7 +352,7 @@ static char text_end_label[MAX_ARTIFICIAL_LABEL_BYTES]; #endif /* This is similar to the default ASM_OUTPUT_ASCII, except that no trailing - newline is produced. When flag_verbose_asm is asserted, we add commnetary + newline is produced. When flag_verbose_asm is asserted, we add commentary at the end of the line, so we must avoid output of a newline here. */ #ifndef ASM_OUTPUT_DEBUG_STRING #define ASM_OUTPUT_DEBUG_STRING(FILE,P) \ @@ -387,7 +381,7 @@ static char text_end_label[MAX_ARTIFICIAL_LABEL_BYTES]; macro has the same effect as ASM_OUTPUT_LABELREF, but copies to a string rather than writing to a file. */ #ifndef ASM_NAME_TO_STRING -#define ASM_NAME_TO_STRING(STR, NAME) \ +#define ASM_NAME_TO_STRING(STR, NAME) \ do \ { \ if ((NAME)[0] == '*') \ @@ -408,9 +402,7 @@ static char text_end_label[MAX_ARTIFICIAL_LABEL_BYTES]; directly, because it writes to a file. */ static void -addr_const_to_string (str, x) - char *str; - rtx x; +addr_const_to_string (char *str, rtx x) { char buf1[256]; char buf2[256]; @@ -535,13 +527,10 @@ restart: /* Output the debug header HEADER. Also output COMMENT if flag_verbose_asm is set. Return the header size. Just return the size if DOSIZEONLY is - non-zero. */ + nonzero. */ static int -write_debug_header (header, comment, dosizeonly) - DST_HEADER *header; - const char *comment; - int dosizeonly; +write_debug_header (DST_HEADER *header, const char *comment, int dosizeonly) { if (!dosizeonly) { @@ -567,13 +556,10 @@ write_debug_header (header, comment, dosizeonly) /* Output the address of SYMBOL. Also output COMMENT if flag_verbose_asm is set. Return the address size. Just return the size if DOSIZEONLY is - non-zero. */ + nonzero. */ static int -write_debug_addr (symbol, comment, dosizeonly) - char *symbol; - const char *comment; - int dosizeonly; +write_debug_addr (char *symbol, const char *comment, int dosizeonly) { if (!dosizeonly) { @@ -588,13 +574,10 @@ write_debug_addr (symbol, comment, dosizeonly) /* Output the single byte DATA1. Also output COMMENT if flag_verbose_asm is set. Return the data size. Just return the size if DOSIZEONLY is - non-zero. */ + nonzero. */ static int -write_debug_data1 (data1, comment, dosizeonly) - unsigned int data1; - const char *comment; - int dosizeonly; +write_debug_data1 (unsigned int data1, const char *comment, int dosizeonly) { if (!dosizeonly) { @@ -609,13 +592,10 @@ write_debug_data1 (data1, comment, dosizeonly) /* Output the single word DATA2. Also output COMMENT if flag_verbose_asm is set. Return the data size. Just return the size if DOSIZEONLY is - non-zero. */ + nonzero. */ static int -write_debug_data2 (data2, comment, dosizeonly) - unsigned int data2; - const char *comment; - int dosizeonly; +write_debug_data2 (unsigned int data2, const char *comment, int dosizeonly) { if (!dosizeonly) { @@ -629,13 +609,10 @@ write_debug_data2 (data2, comment, dosizeonly) } /* Output double word DATA4. Also output COMMENT if flag_verbose_asm is set. - Return the data size. Just return the size if DOSIZEONLY is non-zero. */ + Return the data size. Just return the size if DOSIZEONLY is nonzero. */ static int -write_debug_data4 (data4, comment, dosizeonly) - unsigned long data4; - const char *comment; - int dosizeonly; +write_debug_data4 (unsigned long data4, const char *comment, int dosizeonly) { if (!dosizeonly) { @@ -649,13 +626,11 @@ write_debug_data4 (data4, comment, dosizeonly) } /* Output quad word DATA8. Also output COMMENT if flag_verbose_asm is set. - Return the data size. Just return the size if DOSIZEONLY is non-zero. */ + Return the data size. Just return the size if DOSIZEONLY is nonzero. */ static int -write_debug_data8 (data8, comment, dosizeonly) - unsigned long long data8; - const char *comment; - int dosizeonly; +write_debug_data8 (unsigned long long data8, const char *comment, + int dosizeonly) { if (!dosizeonly) { @@ -670,14 +645,11 @@ write_debug_data8 (data8, comment, dosizeonly) /* Output the difference between LABEL1 and LABEL2. Also output COMMENT if flag_verbose_asm is set. Return the data size. Just return the size if - DOSIZEONLY is non-zero. */ + DOSIZEONLY is nonzero. */ static int -write_debug_delta4 (label1, label2, comment, dosizeonly) - char *label1; - char *label2; - const char *comment; - int dosizeonly; +write_debug_delta4 (char *label1, char *label2, const char *comment, + int dosizeonly) { if (!dosizeonly) { @@ -692,13 +664,10 @@ write_debug_delta4 (label1, label2, comment, dosizeonly) /* Output a character string STRING. Also write COMMENT if flag_verbose_asm is set. Return the string length. Just return the length if DOSIZEONLY is - non-zero. */ + nonzero. */ static int -write_debug_string (string, comment, dosizeonly) - char *string; - const char *comment; - int dosizeonly; +write_debug_string (char *string, const char *comment, int dosizeonly) { if (!dosizeonly) { @@ -712,11 +681,10 @@ write_debug_string (string, comment, dosizeonly) } /* Output a module begin header and return the header size. Just return the - size if DOSIZEONLY is non-zero. */ + size if DOSIZEONLY is nonzero. */ static int -write_modbeg (dosizeonly) - int dosizeonly; +write_modbeg (int dosizeonly) { DST_MODULE_BEGIN modbeg; DST_MB_TRLR mb_trlr; @@ -776,11 +744,10 @@ write_modbeg (dosizeonly) } /* Output a module end trailer and return the trailer size. Just return - the size if DOSIZEONLY is non-zero. */ + the size if DOSIZEONLY is nonzero. */ static int -write_modend (dosizeonly) - int dosizeonly; +write_modend (int dosizeonly) { DST_MODULE_END modend; int totsize = 0; @@ -796,15 +763,13 @@ write_modend (dosizeonly) } /* Output a routine begin header routine RTNNUM and return the header size. - Just return the size if DOSIZEONLY is non-zero. */ + Just return the size if DOSIZEONLY is nonzero. */ static int -write_rtnbeg (rtnnum, dosizeonly) - int rtnnum; - int dosizeonly; +write_rtnbeg (int rtnnum, int dosizeonly) { char *rtnname; - int rtnnamelen, rtnentrynamelen; + int rtnnamelen; char *rtnentryname; int totsize = 0; char label[MAX_ARTIFICIAL_LABEL_BYTES]; @@ -813,10 +778,7 @@ write_rtnbeg (rtnnum, dosizeonly) rtnname = func_table[rtnnum]; rtnnamelen = strlen (rtnname); - rtnentrynamelen = rtnnamelen + 4; /* "..en" */ - rtnentryname = (char *) xmalloc (rtnentrynamelen + 1); - strcpy (rtnentryname, rtnname); - strcat (rtnentryname, "..en"); + rtnentryname = concat (rtnname, "..en", NULL); if (!strcmp (rtnname, "main")) { @@ -845,7 +807,7 @@ write_rtnbeg (rtnnum, dosizeonly) totsize += write_debug_string ((char *) go, "main name", dosizeonly); } - /* The header length never includes the length byte */ + /* The header length never includes the length byte. */ rtnbeg.dst_a_rtnbeg_header.dst__header_length.dst_w_length = DST_K_RTNBEG_SIZE + rtnnamelen - 1; rtnbeg.dst_a_rtnbeg_header.dst__header_type.dst_w_type = DST_K_RTNBEG; @@ -894,12 +856,10 @@ write_rtnbeg (rtnnum, dosizeonly) } /* Output a routine end trailer for routine RTNNUM and return the header size. - Just return the size if DOSIZEONLY is non-zero. */ + Just return the size if DOSIZEONLY is nonzero. */ static int -write_rtnend (rtnnum, dosizeonly) - int rtnnum; - int dosizeonly; +write_rtnend (int rtnnum, int dosizeonly) { DST_ROUTINE_END rtnend; char label1[MAX_ARTIFICIAL_LABEL_BYTES]; @@ -938,11 +898,10 @@ write_rtnend (rtnnum, dosizeonly) : (I) < 65536 ? DST_K_INCR_LINUM_W : DST_K_INCR_LINUM_L) /* Output the PC to line number correlations and return the size. Just return - the size if DOSIZEONLY is non-zero */ + the size if DOSIZEONLY is nonzero */ static int -write_pclines (dosizeonly) - int dosizeonly; +write_pclines (int dosizeonly) { unsigned i; int fn; @@ -967,7 +926,7 @@ write_pclines (dosizeonly) linestart = linestart + ((max_line / 10000) + 1) * 10000; } - /* Set starting address to beginning of text section */ + /* Set starting address to beginning of text section. */ line_num.dst_a_line_num_header.dst__header_length.dst_w_length = 8; line_num.dst_a_line_num_header.dst__header_type.dst_w_type = DST_K_LINE_NUM; pcline.dst_b_pcline_command = DST_K_SET_ABS_PC; @@ -998,8 +957,8 @@ write_pclines (dosizeonly) totsize += write_debug_data1 (pcline.dst_b_pcline_command, "line_num (SET LINUM LONG)", dosizeonly); - sprintf (buff, "line_num (%d)", ln - 1); - totsize += write_debug_data4 (ln - 1, buff, dosizeonly); + sprintf (buff, "line_num (%d)", ln ? ln - 1 : 0); + totsize += write_debug_data4 (ln ? ln - 1 : 0, buff, dosizeonly); lastln = ln; strcpy (lastlabel, TEXT_SECTION_ASM_OP); @@ -1069,13 +1028,11 @@ write_pclines (dosizeonly) /* Output a source correlation for file FILEID using information saved in FILE_INFO_ENTRY and return the size. Just return the size if DOSIZEONLY is - non-zero. */ + nonzero. */ static int -write_srccorr (fileid, file_info_entry, dosizeonly) - int fileid; - dst_file_info_entry file_info_entry; - int dosizeonly; +write_srccorr (int fileid, dst_file_info_entry file_info_entry, + int dosizeonly) { int src_command_size; int linesleft = file_info_entry.max_line; @@ -1198,73 +1155,76 @@ write_srccorr (fileid, file_info_entry, dosizeonly) src_header.dst_a_source_corr_header.dst__header_type.dst_w_type = DST_K_SOURCE; - totsize += write_debug_header (&src_header.dst_a_source_corr_header, - "source corr", dosizeonly); - - totsize += write_debug_data1 (src_command_sf.dst_b_src_command, - "source_corr (src setfile)", dosizeonly); - - totsize += write_debug_data2 - (src_command_sf.dst_a_src_cmd_fields.dst_w_src_unsword, - "source_corr (fileid)", dosizeonly); - - totsize += write_debug_data1 (src_command_sr.dst_b_src_command, - "source_corr (setrec)", dosizeonly); - - totsize += write_debug_data2 - (src_command_sr.dst_a_src_cmd_fields.dst_w_src_unsword, - "source_corr (recnum)", dosizeonly); + if (src_command_dl.dst_a_src_cmd_fields.dst_w_src_unsword) + { + totsize += write_debug_header (&src_header.dst_a_source_corr_header, + "source corr", dosizeonly); - totsize += write_debug_data1 (src_command_sl.dst_b_src_command, - "source_corr (setlnum)", dosizeonly); + totsize += write_debug_data1 (src_command_sf.dst_b_src_command, + "source_corr (src setfile)", dosizeonly); - totsize += write_debug_data4 - (src_command_sl.dst_a_src_cmd_fields.dst_l_src_unslong, - "source_corr (linenum)", dosizeonly); - - totsize += write_debug_data1 (src_command_dl.dst_b_src_command, - "source_corr (deflines)", dosizeonly); + totsize += write_debug_data2 + (src_command_sf.dst_a_src_cmd_fields.dst_w_src_unsword, + "source_corr (fileid)", dosizeonly); - sprintf (buff, "source_corr (%d)", - src_command_dl.dst_a_src_cmd_fields.dst_w_src_unsword); - totsize += write_debug_data2 - (src_command_dl.dst_a_src_cmd_fields.dst_w_src_unsword, buff, dosizeonly); + totsize += write_debug_data1 (src_command_sr.dst_b_src_command, + "source_corr (setrec)", dosizeonly); - while (linesleft > 0) - { - src_header.dst_a_source_corr_header.dst__header_length.dst_w_length - = DST_K_SOURCE_CORR_HEADER_SIZE + 3 - 1; - src_header.dst_a_source_corr_header.dst__header_type.dst_w_type - = DST_K_SOURCE; - src_command_dl.dst_b_src_command = DST_K_SRC_DEFLINES_W; + totsize += write_debug_data2 + (src_command_sr.dst_a_src_cmd_fields.dst_w_src_unsword, + "source_corr (recnum)", dosizeonly); - if (linesleft > 65534) - linesleft = linesleft - 65534, linestodo = 65534; - else - linestodo = linesleft, linesleft = 0; + totsize += write_debug_data1 (src_command_sl.dst_b_src_command, + "source_corr (setlnum)", dosizeonly); - src_command_dl.dst_a_src_cmd_fields.dst_w_src_unsword = linestodo; + totsize += write_debug_data4 + (src_command_sl.dst_a_src_cmd_fields.dst_l_src_unslong, + "source_corr (linenum)", dosizeonly); - totsize += write_debug_header (&src_header.dst_a_source_corr_header, - "source corr", dosizeonly); totsize += write_debug_data1 (src_command_dl.dst_b_src_command, "source_corr (deflines)", dosizeonly); + sprintf (buff, "source_corr (%d)", src_command_dl.dst_a_src_cmd_fields.dst_w_src_unsword); totsize += write_debug_data2 (src_command_dl.dst_a_src_cmd_fields.dst_w_src_unsword, buff, dosizeonly); + + while (linesleft > 0) + { + src_header.dst_a_source_corr_header.dst__header_length.dst_w_length + = DST_K_SOURCE_CORR_HEADER_SIZE + 3 - 1; + src_header.dst_a_source_corr_header.dst__header_type.dst_w_type + = DST_K_SOURCE; + src_command_dl.dst_b_src_command = DST_K_SRC_DEFLINES_W; + + if (linesleft > 65534) + linesleft = linesleft - 65534, linestodo = 65534; + else + linestodo = linesleft, linesleft = 0; + + src_command_dl.dst_a_src_cmd_fields.dst_w_src_unsword = linestodo; + + totsize += write_debug_header (&src_header.dst_a_source_corr_header, + "source corr", dosizeonly); + totsize += write_debug_data1 (src_command_dl.dst_b_src_command, + "source_corr (deflines)", dosizeonly); + sprintf (buff, "source_corr (%d)", + src_command_dl.dst_a_src_cmd_fields.dst_w_src_unsword); + totsize += write_debug_data2 + (src_command_dl.dst_a_src_cmd_fields.dst_w_src_unsword, + buff, dosizeonly); + } } return totsize; } /* Output all the source correlation entries and return the size. Just return - the size if DOSIZEONLY is non-zero. */ + the size if DOSIZEONLY is nonzero. */ static int -write_srccorrs (dosizeonly) - int dosizeonly; +write_srccorrs (int dosizeonly) { unsigned int i; int totsize = 0; @@ -1279,9 +1239,7 @@ write_srccorrs (dosizeonly) the prologue. */ static void -vmsdbgout_begin_prologue (line, file) - unsigned int line; - const char *file; +vmsdbgout_begin_prologue (unsigned int line, const char *file) { char label[MAX_ARTIFICIAL_LABEL_BYTES]; @@ -1290,9 +1248,8 @@ vmsdbgout_begin_prologue (line, file) if (debug_info_level > DINFO_LEVEL_NONE) { - current_funcdef_number++; ASM_GENERATE_INTERNAL_LABEL (label, FUNC_BEGIN_LABEL, - current_funcdef_number); + current_function_funcdef_no); ASM_OUTPUT_LABEL (asm_out_file, label); } } @@ -1300,38 +1257,56 @@ vmsdbgout_begin_prologue (line, file) /* Output a marker (i.e. a label) for the beginning of a function, after the prologue. */ -void -vmsdbgout_after_prologue () +static void +vmsdbgout_end_prologue (unsigned int line, const char *file) { char label[MAX_ARTIFICIAL_LABEL_BYTES]; + if (write_symbols == VMS_AND_DWARF2_DEBUG) + (*dwarf2_debug_hooks.end_prologue) (line, file); + if (debug_info_level > DINFO_LEVEL_TERSE) { ASM_GENERATE_INTERNAL_LABEL (label, FUNC_PROLOG_LABEL, - current_funcdef_number); + current_function_funcdef_no); 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); } } +/* No output for VMS debug, but make obligatory call to Dwarf2 debug */ + +static void +vmsdbgout_end_function (unsigned int line) +{ + if (write_symbols == VMS_AND_DWARF2_DEBUG) + (*dwarf2_debug_hooks.end_function) (line); +} + /* Output a marker (i.e. a label) for the absolute end of the generated code for a function definition. This gets called *after* the epilogue code has been generated. */ static void -vmsdbgout_end_epilogue () +vmsdbgout_end_epilogue (unsigned int line, const char *file) { char label[MAX_ARTIFICIAL_LABEL_BYTES]; if (write_symbols == VMS_AND_DWARF2_DEBUG) - (*dwarf2_debug_hooks.end_epilogue) (); + (*dwarf2_debug_hooks.end_epilogue) (line, file); if (debug_info_level > DINFO_LEVEL_NONE) { /* Output a label to mark the endpoint of the code generated for this function. */ ASM_GENERATE_INTERNAL_LABEL (label, FUNC_END_LABEL, - current_funcdef_number); + current_function_funcdef_no); 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); } } @@ -1339,37 +1314,32 @@ vmsdbgout_end_epilogue () a lexical block. */ static void -vmsdbgout_begin_block (line, blocknum) - register unsigned line; - register unsigned blocknum; +vmsdbgout_begin_block (register unsigned line, register unsigned blocknum) { if (write_symbols == VMS_AND_DWARF2_DEBUG) (*dwarf2_debug_hooks.begin_block) (line, blocknum); if (debug_info_level > DINFO_LEVEL_TERSE) - ASM_OUTPUT_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 lexical block. */ static void -vmsdbgout_end_block (line, blocknum) - register unsigned line; - register unsigned blocknum; +vmsdbgout_end_block (register unsigned line, register unsigned blocknum) { if (write_symbols == VMS_AND_DWARF2_DEBUG) (*dwarf2_debug_hooks.end_block) (line, blocknum); if (debug_info_level > DINFO_LEVEL_TERSE) - ASM_OUTPUT_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. */ static bool -vmsdbgout_ignore_block (block) - tree block; +vmsdbgout_ignore_block (tree block) { bool retval = 0; @@ -1382,8 +1352,7 @@ vmsdbgout_ignore_block (block) /* Add an entry for function DECL into the func_table. */ static void -vmsdbgout_begin_function (decl) - tree decl; +vmsdbgout_begin_function (tree decl) { const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0); @@ -1393,8 +1362,8 @@ vmsdbgout_begin_function (decl) 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 = xrealloc (func_table, + func_table_allocated * sizeof (char *)); } /* Add the new entry to the end of the function name table. */ @@ -1407,8 +1376,7 @@ static char fullname_buff [4096]; in VMS syntax in order to be processed by VMS Debug. */ static char * -full_name (filename) - const char *filename; +full_name (const char *filename) { #ifdef VMS FILE *fp = fopen (filename, "r"); @@ -1439,8 +1407,7 @@ full_name (filename) all searches. */ static unsigned int -lookup_filename (file_name) - const char *file_name; +lookup_filename (const char *file_name) { static unsigned int last_file_lookup_index = 0; register char *fn; @@ -1459,17 +1426,17 @@ lookup_filename (file_name) #ifdef VMS struct tm *ts; - /* Adjust for GMT */ + /* Adjust for GMT. */ ts = (struct tm *) localtime (&statbuf.st_ctime); gmtoff = ts->tm_gmtoff; - /* VMS has multiple file format types */ + /* 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 */ + /* Assume stream LF type file. */ rfo = 2; #endif cdt = 10000000 * (statbuf.st_ctime + gmtoff + vms_epoch_offset); @@ -1514,10 +1481,9 @@ lookup_filename (file_name) { file_info_table_allocated += FILE_TABLE_INCREMENT; - file_info_table - = (dst_file_info_ref) xrealloc (file_info_table, - (file_info_table_allocated - * sizeof (dst_file_info_entry))); + file_info_table = xrealloc (file_info_table, + (file_info_table_allocated + * sizeof (dst_file_info_entry))); } /* Add the new entry to the end of the filename table. */ @@ -1538,9 +1504,7 @@ lookup_filename (file_name) 'line_info_table' for later output of the .debug_line section. */ static void -vmsdbgout_source_line (line, filename) - register unsigned line; - register const char *filename; +vmsdbgout_source_line (register unsigned line, register const char *filename) { if (write_symbols == VMS_AND_DWARF2_DEBUG) (*dwarf2_debug_hooks.source_line) (line, filename); @@ -1549,17 +1513,16 @@ vmsdbgout_source_line (line, filename) { dst_line_info_ref line_info; - ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, LINE_CODE_LABEL, + (*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) { line_info_table_allocated += LINE_INFO_TABLE_INCREMENT; - line_info_table - = (dst_line_info_ref) xrealloc (line_info_table, - (line_info_table_allocated - * sizeof (dst_line_info_entry))); + line_info_table = xrealloc (line_info_table, + (line_info_table_allocated + * sizeof (dst_line_info_entry))); } /* Add the new entry at the end of the line_info_table. */ @@ -1575,9 +1538,7 @@ vmsdbgout_source_line (line, filename) At present, unimplemented. */ static void -vmsdbgout_start_source_file (lineno, filename) - unsigned int lineno; - const char *filename; +vmsdbgout_start_source_file (unsigned int lineno, const char *filename) { if (write_symbols == VMS_AND_DWARF2_DEBUG) (*dwarf2_debug_hooks.start_source_file) (lineno, filename); @@ -1587,8 +1548,7 @@ vmsdbgout_start_source_file (lineno, filename) At present, unimplemented. */ static void -vmsdbgout_end_source_file (lineno) - unsigned int lineno ATTRIBUTE_UNUSED; +vmsdbgout_end_source_file (unsigned int lineno ATTRIBUTE_UNUSED) { if (write_symbols == VMS_AND_DWARF2_DEBUG) (*dwarf2_debug_hooks.end_source_file) (lineno); @@ -1597,8 +1557,7 @@ vmsdbgout_end_source_file (lineno) /* Set up for Debug output at the start of compilation. */ static void -vmsdbgout_init (main_input_filename) - const char *main_input_filename; +vmsdbgout_init (const char *main_input_filename) { const char *language_string = lang_hooks.name; @@ -1613,21 +1572,19 @@ vmsdbgout_init (main_input_filename) /* Allocate the initial hunk of the file_info_table. */ file_info_table - = (dst_file_info_ref) xcalloc (FILE_TABLE_INCREMENT, - sizeof (dst_file_info_entry)); + = xcalloc (FILE_TABLE_INCREMENT, sizeof (dst_file_info_entry)); file_info_table_allocated = FILE_TABLE_INCREMENT; /* 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 = xcalloc (FUNC_TABLE_INCREMENT, sizeof (char *)); func_table_allocated = FUNC_TABLE_INCREMENT; func_table_in_use = 1; /* Allocate the initial hunk of the line_info_table. */ line_info_table - = (dst_line_info_ref) xcalloc (LINE_INFO_TABLE_INCREMENT, - sizeof (dst_line_info_entry)); + = xcalloc (LINE_INFO_TABLE_INCREMENT, sizeof (dst_line_info_entry)); line_info_table_allocated = LINE_INFO_TABLE_INCREMENT; /* zero-th entry is allocated, but unused */ line_info_table_in_use = 1; @@ -1645,10 +1602,7 @@ vmsdbgout_init (main_input_filename) else module_language = DST_K_UNKNOWN; - module_producer - = (char *) xmalloc (strlen (language_string) + 1 - + strlen (version_string) + 1); - sprintf (module_producer, "%s %s", language_string, version_string); + module_producer = concat (language_string, " ", version_string, NULL); ASM_GENERATE_INTERNAL_LABEL (text_end_label, TEXT_END_LABEL, 0); @@ -1657,9 +1611,7 @@ vmsdbgout_init (main_input_filename) /* Not implemented in VMS Debug. */ static void -vmsdbgout_define (lineno, buffer) - unsigned int lineno; - const char *buffer; +vmsdbgout_define (unsigned int lineno, const char *buffer) { if (write_symbols == VMS_AND_DWARF2_DEBUG) (*dwarf2_debug_hooks.define) (lineno, buffer); @@ -1668,9 +1620,7 @@ vmsdbgout_define (lineno, buffer) /* Not implemented in VMS Debug. */ static void -vmsdbgout_undef (lineno, buffer) - unsigned int lineno; - const char *buffer; +vmsdbgout_undef (unsigned int lineno, const char *buffer) { if (write_symbols == VMS_AND_DWARF2_DEBUG) (*dwarf2_debug_hooks.undef) (lineno, buffer); @@ -1679,8 +1629,7 @@ vmsdbgout_undef (lineno, buffer) /* Not implemented in VMS Debug. */ static void -vmsdbgout_decl (decl) - tree decl; +vmsdbgout_decl (tree decl) { if (write_symbols == VMS_AND_DWARF2_DEBUG) (*dwarf2_debug_hooks.function_decl) (decl); @@ -1689,8 +1638,7 @@ vmsdbgout_decl (decl) /* Not implemented in VMS Debug. */ static void -vmsdbgout_global_decl (decl) - tree decl; +vmsdbgout_global_decl (tree decl) { if (write_symbols == VMS_AND_DWARF2_DEBUG) (*dwarf2_debug_hooks.global_decl) (decl); @@ -1699,8 +1647,7 @@ vmsdbgout_global_decl (decl) /* Not implemented in VMS Debug. */ static void -vmsdbgout_abstract_function (decl) - tree decl; +vmsdbgout_abstract_function (tree decl) { if (write_symbols == VMS_AND_DWARF2_DEBUG) (*dwarf2_debug_hooks.outlining_inline_function) (decl); @@ -1710,21 +1657,20 @@ vmsdbgout_abstract_function (decl) VMS Debug debugging info. */ static void -vmsdbgout_finish (input_filename) - const char *input_filename ATTRIBUTE_UNUSED; +vmsdbgout_finish (const char *main_input_filename ATTRIBUTE_UNUSED) { unsigned int i; int totsize; if (write_symbols == VMS_AND_DWARF2_DEBUG) - (*dwarf2_debug_hooks.finish) (input_filename); + (*dwarf2_debug_hooks.finish) (main_input_filename); if (debug_info_level == DINFO_LEVEL_NONE) return; /* Output a terminator label for the .text section. */ text_section (); - ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, TEXT_END_LABEL, 0); + (*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