diff options
author | rupp <rupp@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-07-29 17:35:32 +0000 |
---|---|---|
committer | rupp <rupp@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-07-29 17:35:32 +0000 |
commit | d5440449e704ad81609e24cf090fc19d02e4058c (patch) | |
tree | 1d89fc9b2c81940cff19eef19fa55e5bd9d3c26b /gcc | |
parent | 296db1d1352c448ad503a4be634f31cc8d784055 (diff) | |
download | ppe42-gcc-d5440449e704ad81609e24cf090fc19d02e4058c.tar.gz ppe42-gcc-d5440449e704ad81609e24cf090fc19d02e4058c.zip |
* dwarf2out.c (output_file_names): Output VMS style file name, size,
date, version info if VMS_DEBUGGING_INFO defined.
* vmsdgbout.c (vms_file_stats_name): New functon. VMS style file name,
size, date calculating code moved here.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@150219 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 39 | ||||
-rw-r--r-- | gcc/vmsdbgout.c | 292 |
3 files changed, 297 insertions, 41 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c2f972e4834..0e3a8d08971 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2009-07-29 Douglas B Rupp <rupp@gnat.com> + + * dwarf2out.c (output_file_names): Output VMS style file name, size, + date, version info if VMS_DEBUGGING_INFO defined. + * vmsdgbout.c (vms_file_stats_name): New functon. VMS style file name, + size, date calculating code moved here. + 2009-07-29 Paul Brook <paul@codesourcery.com> * config/arm/lib1funcs.asm (clear_cache): Use ARM_FUNC_START and diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 488439fcfbe..58a257d3b71 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -97,6 +97,8 @@ static rtx last_var_location_insn; #endif #ifdef VMS_DEBUGGING_INFO +int vms_file_stats_name (const char *, long long *, long *, char *, int *); + /* Define this macro to be a nonzero value if the directory specifications which are output in the debug info should end with a separator. */ #define DWARF2_DIR_SHOULD_END_WITH_SEPARATOR 1 @@ -9636,6 +9638,42 @@ output_file_names (void) int file_idx = backmap[i]; int dir_idx = dirs[files[file_idx].dir_idx].dir_idx; +#ifdef VMS_DEBUGGING_INFO +#define MAX_VMS_VERSION_LEN 6 /* ";32768" */ + + /* Setting these fields can lead to debugger miscomparisons, + but VMS Debug requires them to be set correctly. */ + + int ver; + long long cdt; + long siz; + int maxfilelen = strlen (files[file_idx].path) + + dirs[dir_idx].length + + MAX_VMS_VERSION_LEN + 1; + char *filebuf = XALLOCAVEC (char, maxfilelen); + + vms_file_stats_name (files[file_idx].path, 0, 0, 0, &ver); + snprintf (filebuf, maxfilelen, "%s;%d", + files[file_idx].path + dirs[dir_idx].length, ver); + + dw2_asm_output_nstring + (filebuf, -1, "File Entry: 0x%x", (unsigned) i + 1); + + /* Include directory index. */ + dw2_asm_output_data_uleb128 (dir_idx + idx_offset, NULL); + + /* Modification time. */ + dw2_asm_output_data_uleb128 + ((vms_file_stats_name (files[file_idx].path, &cdt, 0, 0, 0) == 0) + ? cdt : 0, + NULL); + + /* File length in bytes. */ + dw2_asm_output_data_uleb128 + ((vms_file_stats_name (files[file_idx].path, 0, &siz, 0, 0) == 0) + ? siz : 0, + NULL); +#else dw2_asm_output_nstring (files[file_idx].path + dirs[dir_idx].length, -1, "File Entry: 0x%x", (unsigned) i + 1); @@ -9647,6 +9685,7 @@ output_file_names (void) /* File length in bytes. */ dw2_asm_output_data_uleb128 (0, NULL); +#endif } dw2_asm_output_data (1, 0, "End file name table"); diff --git a/gcc/vmsdbgout.c b/gcc/vmsdbgout.c index d133a777bda..f7cca03d051 100644 --- a/gcc/vmsdbgout.c +++ b/gcc/vmsdbgout.c @@ -1,6 +1,6 @@ /* 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, 2007, 2008 + 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). @@ -41,6 +41,8 @@ along with GCC; see the file COPYING3. If not see /* 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. */ @@ -1443,47 +1445,16 @@ lookup_filename (const char *file_name) register char *fn; register unsigned i; const char *fnam; - long long cdt; - long ebk; - short ffb; - char rfo; 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 = ""; - 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. */ @@ -1515,6 +1486,12 @@ lookup_filename (const char *file_name) 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. */ file_info_table[file_info_table_in_use].file_name = xstrdup (fnam); file_info_table[file_info_table_in_use].max_line = 0; @@ -1730,4 +1707,237 @@ vmsdbgout_finish (const char *main_input_filename ATTRIBUTE_UNUSED) 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 |