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:
parent
33215bb37f
commit
c2cffdc880
@ -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
|
||||
|
@ -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");
|
||||
|
292
gcc/vmsdbgout.c
292
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
|
||||
|
Loading…
Reference in New Issue
Block a user