dwarf2out.c (output_file_names): Output VMS style file name, size, date, version info if VMS_DEBUGGING_INFO defined.

* 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.

From-SVN: r150219
This commit is contained in:
Douglas B Rupp 2009-07-29 17:35:32 +00:00 committed by Douglas Rupp
parent 33215bb37f
commit c2cffdc880
3 changed files with 297 additions and 41 deletions

View File

@ -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

View File

@ -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");

View File

@ -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