mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-27 06:17:47 +08:00
Wed Jan 27 13:20:25 1999 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
* hp-psymtab-read.c: reformatted comments, updated copyright.
This commit is contained in:
@ -1,3 +1,7 @@
|
|||||||
|
Wed Jan 27 13:20:25 1999 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
|
||||||
|
|
||||||
|
* hp-psymtab-read.c: reformatted comments, updated copyright.
|
||||||
|
|
||||||
start-sanitize-carp start-sanitize-vr4xxx
|
start-sanitize-carp start-sanitize-vr4xxx
|
||||||
Wed Jan 27 15:09:22 1999 Andrew Cagney <cagney@chook.cygnus.com>
|
Wed Jan 27 15:09:22 1999 Andrew Cagney <cagney@chook.cygnus.com>
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Read hp debug symbols and convert to internal format, for GDB.
|
/* Read hp debug symbols and convert to internal format, for GDB.
|
||||||
Copyright 1993, 1996 Free Software Foundation, Inc.
|
Copyright 1993, 1996, 1998, 1999 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GDB.
|
This file is part of GDB.
|
||||||
|
|
||||||
@ -21,22 +21,18 @@
|
|||||||
and by Cygnus Support. */
|
and by Cygnus Support. */
|
||||||
|
|
||||||
/* Common include file for hp_symtab_read.c and hp_psymtab_read.c.
|
/* Common include file for hp_symtab_read.c and hp_psymtab_read.c.
|
||||||
* This has nested includes of a bunch of stuff.
|
This has nested includes of a bunch of stuff. */
|
||||||
*/
|
|
||||||
#include "hpread.h"
|
#include "hpread.h"
|
||||||
#include "demangle.h"
|
#include "demangle.h"
|
||||||
|
|
||||||
/* To generate dumping code, uncomment this define. The dumping
|
/* To generate dumping code, uncomment this define. The dumping
|
||||||
* itself is controlled by routine-local statics called "dumping".
|
itself is controlled by routine-local statics called "dumping". */
|
||||||
*/
|
|
||||||
/* #define DUMPING 1 */
|
/* #define DUMPING 1 */
|
||||||
|
|
||||||
/* To use the quick look-up tables, uncomment this define.
|
/* To use the quick look-up tables, uncomment this define. */
|
||||||
*/
|
|
||||||
#define QUICK_LOOK_UP 0
|
#define QUICK_LOOK_UP 0
|
||||||
|
|
||||||
/* To call PXDB to process un-processed files, uncomment this define.
|
/* To call PXDB to process un-processed files, uncomment this define. */
|
||||||
*/
|
|
||||||
#define USE_PXDB 1
|
#define USE_PXDB 1
|
||||||
|
|
||||||
/* Forward procedure declarations */
|
/* Forward procedure declarations */
|
||||||
@ -68,10 +64,7 @@ static struct partial_symtab *hpread_end_psymtab
|
|||||||
|
|
||||||
#ifdef USE_PXDB
|
#ifdef USE_PXDB
|
||||||
|
|
||||||
/**************************************************
|
/* NOTE use of system files! May not be portable. */
|
||||||
*
|
|
||||||
* NOTE use of system files! May not be portable.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define PXDB_SVR4 "/opt/langtools/bin/pxdb"
|
#define PXDB_SVR4 "/opt/langtools/bin/pxdb"
|
||||||
#define PXDB_BSD "/usr/bin/pxdb"
|
#define PXDB_BSD "/usr/bin/pxdb"
|
||||||
@ -281,13 +274,10 @@ hpread_pxdb_needed (sym_bfd)
|
|||||||
|
|
||||||
#ifdef QUICK_LOOK_UP
|
#ifdef QUICK_LOOK_UP
|
||||||
|
|
||||||
/********************
|
/* This flag can be set to zero to use the old
|
||||||
*
|
style psymtab (build from a scan of the LNTT)
|
||||||
* This flag can be set to zero to use the old
|
or to one to try to use the quick look-up
|
||||||
* style psymtab (build from a scan of the LNTT)
|
tables. */
|
||||||
* or to one to try to use the quick look-up
|
|
||||||
* tables.
|
|
||||||
*/
|
|
||||||
int psym_new_style = 1;
|
int psym_new_style = 1;
|
||||||
|
|
||||||
|
|
||||||
@ -401,7 +391,6 @@ record_pst_syms (start_sym, end_sym)
|
|||||||
we don't care about overlaps, etc.
|
we don't care about overlaps, etc.
|
||||||
|
|
||||||
Return 0 => not found */
|
Return 0 => not found */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
find_next_pst_start (index)
|
find_next_pst_start (index)
|
||||||
int index;
|
int index;
|
||||||
@ -428,7 +417,6 @@ find_next_pst_start (index)
|
|||||||
PXDB_HEADER_P as in hpread_quick_traverse (to allow macros to work).
|
PXDB_HEADER_P as in hpread_quick_traverse (to allow macros to work).
|
||||||
|
|
||||||
Return 0 => not found */
|
Return 0 => not found */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
find_next_file_isym (index, qFD, curr_fd, pxdb_header_p)
|
find_next_file_isym (index, qFD, curr_fd, pxdb_header_p)
|
||||||
int index;
|
int index;
|
||||||
@ -450,7 +438,6 @@ find_next_file_isym (index, qFD, curr_fd, pxdb_header_p)
|
|||||||
PXDB_HEADER_P as in hpread_quick_traverse (to allow macros to work).
|
PXDB_HEADER_P as in hpread_quick_traverse (to allow macros to work).
|
||||||
|
|
||||||
Return 0 => not found */
|
Return 0 => not found */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
find_next_proc_isym (index, qPD, curr_pd, pxdb_header_p)
|
find_next_proc_isym (index, qPD, curr_pd, pxdb_header_p)
|
||||||
int index;
|
int index;
|
||||||
@ -472,7 +459,6 @@ find_next_proc_isym (index, qPD, curr_pd, pxdb_header_p)
|
|||||||
PXDB_HEADER_P as in hpread_quick_traverse (to allow macros to work).
|
PXDB_HEADER_P as in hpread_quick_traverse (to allow macros to work).
|
||||||
|
|
||||||
Return 0 => not found */
|
Return 0 => not found */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
find_next_module_isym (index, qMD, curr_md, pxdb_header_p)
|
find_next_module_isym (index, qMD, curr_md, pxdb_header_p)
|
||||||
int index;
|
int index;
|
||||||
@ -563,15 +549,13 @@ scan_procs (curr_pd_p, qPD, max_procs, start_adr, end_adr, pst, vt_bits, objfile
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* I asked for this in the hope it would fix bug CHFts22228, but
|
/* I asked for this in the hope it would fix bug CHFts22228, but
|
||||||
* later decided it's not the right fix. I'm leaving the code
|
later decided it's not the right fix. I'm leaving the code
|
||||||
* commented out for now in case we decide we actually want to do this.
|
commented out for now in case we decide we actually want to do this.
|
||||||
* - RT
|
- RT */
|
||||||
*/
|
|
||||||
#if 0
|
#if 0
|
||||||
/* Check this routine--if it's a class member function,
|
/* Check this routine--if it's a class member function,
|
||||||
* add the class to the psymtab. We only need to add
|
add the class to the psymtab. We only need to add
|
||||||
* the class once in each module, so check.
|
the class once in each module, so check. */
|
||||||
*/
|
|
||||||
if( qPD[curr_pd].member ) {
|
if( qPD[curr_pd].member ) {
|
||||||
|
|
||||||
class = qPD[curr_pd].icd;
|
class = qPD[curr_pd].icd;
|
||||||
@ -607,15 +591,14 @@ scan_procs (curr_pd_p, qPD, max_procs, start_adr, end_adr, pst, vt_bits, objfile
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Add this routine symbol to the list in the objfile. */
|
/* Add this routine symbol to the list in the objfile.
|
||||||
/* Unfortunately we have to go to the LNTT to determine the
|
Unfortunately we have to go to the LNTT to determine the
|
||||||
* correct list to put it on. An alternative (which the
|
correct list to put it on. An alternative (which the
|
||||||
* code used to do) would be to not check and always throw
|
code used to do) would be to not check and always throw
|
||||||
* it on the "static" list. But if we go that route, then
|
it on the "static" list. But if we go that route, then
|
||||||
* symbol_lookup() needs to be tweaked a bit to account
|
symbol_lookup() needs to be tweaked a bit to account
|
||||||
* for the fact that the function might not be found on
|
for the fact that the function might not be found on
|
||||||
* the correct list in the psymtab. - RT
|
the correct list in the psymtab. - RT */
|
||||||
*/
|
|
||||||
dn_bufp = hpread_get_lntt (qPD[curr_pd].isym, objfile);
|
dn_bufp = hpread_get_lntt (qPD[curr_pd].isym, objfile);
|
||||||
if (dn_bufp->dfunc.global)
|
if (dn_bufp->dfunc.global)
|
||||||
add_psymbol_with_dem_name_to_list (
|
add_psymbol_with_dem_name_to_list (
|
||||||
@ -662,15 +645,14 @@ scan_procs (curr_pd_p, qPD, max_procs, start_adr, end_adr, pst, vt_bits, objfile
|
|||||||
|
|
||||||
|
|
||||||
/* Traverse the quick look-up tables, building a set of psymtabs.
|
/* Traverse the quick look-up tables, building a set of psymtabs.
|
||||||
*
|
|
||||||
* This constructs a psymtab for modules and files in the quick lookup
|
This constructs a psymtab for modules and files in the quick lookup
|
||||||
* tables.
|
tables.
|
||||||
*
|
|
||||||
* Mostly, modules correspond to compilation units, so we try to
|
Mostly, modules correspond to compilation units, so we try to
|
||||||
* create psymtabs that correspond to modules; however, in some cases
|
create psymtabs that correspond to modules; however, in some cases
|
||||||
* a file can result in a compiled object which does not have a module
|
a file can result in a compiled object which does not have a module
|
||||||
* entry for it, so in such cases we create a psymtab for the file.
|
entry for it, so in such cases we create a psymtab for the file. */
|
||||||
*/
|
|
||||||
|
|
||||||
int
|
int
|
||||||
hpread_quick_traverse(
|
hpread_quick_traverse(
|
||||||
@ -734,7 +716,7 @@ hpread_quick_traverse(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* First we need to find the starting points of the quick
|
/* First we need to find the starting points of the quick
|
||||||
* look-up tables in the GNTT. */
|
look-up tables in the GNTT. */
|
||||||
|
|
||||||
addr = gntt_bits;
|
addr = gntt_bits;
|
||||||
|
|
||||||
@ -797,23 +779,21 @@ hpread_quick_traverse(
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* We need this index only while hp-symtab-read.c expects
|
/* We need this index only while hp-symtab-read.c expects
|
||||||
* a byte offset to the end of the LNTT entries for a given
|
a byte offset to the end of the LNTT entries for a given
|
||||||
* psymtab. Thus the need for it should go away someday.
|
psymtab. Thus the need for it should go away someday.
|
||||||
*
|
|
||||||
* When it goes away, then we won't have any need to load the
|
When it goes away, then we won't have any need to load the
|
||||||
* LNTT from the objfile at psymtab-time, and start-up will be
|
LNTT from the objfile at psymtab-time, and start-up will be
|
||||||
* faster. To make that work, we'll need some way to create
|
faster. To make that work, we'll need some way to create
|
||||||
* a null pst for the "globals" pseudo-module.
|
a null pst for the "globals" pseudo-module. */
|
||||||
*/
|
|
||||||
max_LNTT_sym_index = LNTT_SYMCOUNT (objfile);
|
max_LNTT_sym_index = LNTT_SYMCOUNT (objfile);
|
||||||
|
|
||||||
/* Scan the module descriptors and make a psymtab for each.
|
/* Scan the module descriptors and make a psymtab for each.
|
||||||
*
|
|
||||||
* We know the MDs, FDs and the PDs are in order by starting
|
We know the MDs, FDs and the PDs are in order by starting
|
||||||
* address. We use that fact to traverse all three arrays in
|
address. We use that fact to traverse all three arrays in
|
||||||
* parallel, knowing when the next PD is in a new file
|
parallel, knowing when the next PD is in a new file
|
||||||
* and we need to create a new psymtab.
|
and we need to create a new psymtab. */
|
||||||
*/
|
|
||||||
curr_pd = 0; /* Current procedure entry */
|
curr_pd = 0; /* Current procedure entry */
|
||||||
curr_fd = 0; /* Current file entry */
|
curr_fd = 0; /* Current file entry */
|
||||||
curr_md = 0; /* Current module entry */
|
curr_md = 0; /* Current module entry */
|
||||||
@ -827,8 +807,7 @@ hpread_quick_traverse(
|
|||||||
syms_in_pst = 0; /* Symbol count for psymtab */
|
syms_in_pst = 0; /* Symbol count for psymtab */
|
||||||
|
|
||||||
/* Psts actually just have pointers into the objfile's
|
/* Psts actually just have pointers into the objfile's
|
||||||
* symbol table, not their own symbol tables.
|
symbol table, not their own symbol tables. */
|
||||||
*/
|
|
||||||
global_syms = objfile -> global_psymbols.list;
|
global_syms = objfile -> global_psymbols.list;
|
||||||
static_syms = objfile -> static_psymbols.list;
|
static_syms = objfile -> static_psymbols.list;
|
||||||
|
|
||||||
@ -840,8 +819,7 @@ hpread_quick_traverse(
|
|||||||
Returning false from this function will make the caller
|
Returning false from this function will make the caller
|
||||||
(build_psymbols) scan the table from the beginning and
|
(build_psymbols) scan the table from the beginning and
|
||||||
not use the quick lookup tables.
|
not use the quick lookup tables.
|
||||||
F90 has modules so this poses no porblem.
|
F90 has modules so this poses no problem. */
|
||||||
*/
|
|
||||||
if (!strcmp (&vt_bits[(long)qMD[0].sbMod], "end.c"))
|
if (!strcmp (&vt_bits[(long)qMD[0].sbMod], "end.c"))
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
@ -881,9 +859,9 @@ hpread_quick_traverse(
|
|||||||
char *full_name_string;
|
char *full_name_string;
|
||||||
|
|
||||||
/* First check for modules like "version.c", which have no code
|
/* First check for modules like "version.c", which have no code
|
||||||
* in them but still have qMD entries. They also have no qFD or
|
in them but still have qMD entries. They also have no qFD or
|
||||||
* qPD entries. Their start address is -1 and their end address
|
qPD entries. Their start address is -1 and their end address
|
||||||
* is 0. */
|
is 0. */
|
||||||
if(VALID_CURR_MODULE && (CURR_MODULE_START == -1) && (CURR_MODULE_END == NULL)) {
|
if(VALID_CURR_MODULE && (CURR_MODULE_START == -1) && (CURR_MODULE_END == NULL)) {
|
||||||
|
|
||||||
mod_name_string = &vt_bits[(long) qMD[curr_md].sbMod];
|
mod_name_string = &vt_bits[(long) qMD[curr_md].sbMod];
|
||||||
@ -894,9 +872,9 @@ hpread_quick_traverse(
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* We'll skip the rest (it makes error-checking easier), and
|
/* We'll skip the rest (it makes error-checking easier), and
|
||||||
* just make an empty pst. Right now empty psts are not put
|
just make an empty pst. Right now empty psts are not put
|
||||||
* in the pst chain, so all this is for naught, but later it
|
in the pst chain, so all this is for naught, but later it
|
||||||
* might help. */
|
might help. */
|
||||||
|
|
||||||
pst = hpread_start_psymtab( objfile,
|
pst = hpread_start_psymtab( objfile,
|
||||||
section_offsets, /* ?? */
|
section_offsets, /* ?? */
|
||||||
@ -986,14 +964,14 @@ hpread_quick_traverse(
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/* Create the basic psymtab, connecting it in the list
|
/* Create the basic psymtab, connecting it in the list
|
||||||
* for this objfile and pointing its symbol entries
|
for this objfile and pointing its symbol entries
|
||||||
* to the current end of the symbol areas in the objfile.
|
to the current end of the symbol areas in the objfile.
|
||||||
*
|
|
||||||
* The "ldsymoff" parameter is the byte offset in the LNTT
|
The "ldsymoff" parameter is the byte offset in the LNTT
|
||||||
* of the first symbol in this file. Some day we should
|
of the first symbol in this file. Some day we should
|
||||||
* turn this into an index (fix in hp-symtab-read.c as well).
|
turn this into an index (fix in hp-symtab-read.c as well).
|
||||||
* And it's not even the right byte offset, as we're using
|
And it's not even the right byte offset, as we're using
|
||||||
* the size of a union! FIXME! */
|
the size of a union! FIXME! */
|
||||||
pst = hpread_start_psymtab( objfile,
|
pst = hpread_start_psymtab( objfile,
|
||||||
section_offsets, /* ?? */
|
section_offsets, /* ?? */
|
||||||
full_name_string,
|
full_name_string,
|
||||||
@ -1008,7 +986,7 @@ hpread_quick_traverse(
|
|||||||
B_CLRALL( class_entered, pxdb_header_p->cd_entries );
|
B_CLRALL( class_entered, pxdb_header_p->cd_entries );
|
||||||
|
|
||||||
/* Scan the procedure descriptors for procedures in the current
|
/* Scan the procedure descriptors for procedures in the current
|
||||||
* file, based on the starting addresses. */
|
file, based on the starting addresses. */
|
||||||
|
|
||||||
syms_in_pst = scan_procs (&curr_pd, qPD, pxdb_header_p->pd_entries,
|
syms_in_pst = scan_procs (&curr_pd, qPD, pxdb_header_p->pd_entries,
|
||||||
start_adr, end_adr,
|
start_adr, end_adr,
|
||||||
@ -1076,8 +1054,7 @@ hpread_quick_traverse(
|
|||||||
full_name_string, start_adr, end_adr, CURR_FILE_ISYM, end_sym);
|
full_name_string, start_adr, end_adr, CURR_FILE_ISYM, end_sym);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/* Prepare for the next psymtab.
|
/* Prepare for the next psymtab. */
|
||||||
*/
|
|
||||||
global_syms = objfile->global_psymbols.next;
|
global_syms = objfile->global_psymbols.next;
|
||||||
static_syms = objfile->static_psymbols.next;
|
static_syms = objfile->static_psymbols.next;
|
||||||
free( class_entered );
|
free( class_entered );
|
||||||
@ -1112,7 +1089,8 @@ hpread_quick_traverse(
|
|||||||
|
|
||||||
/* For the end address, we scan through the files till we find one
|
/* For the end address, we scan through the files till we find one
|
||||||
that overlaps the current module but ends beyond it; if no such file exists we
|
that overlaps the current module but ends beyond it; if no such file exists we
|
||||||
simply use the module's start address. (Note, if file entries themselves overlap
|
simply use the module's start address.
|
||||||
|
(Note, if file entries themselves overlap
|
||||||
we take the longest overlapping extension beyond the end of the module...)
|
we take the longest overlapping extension beyond the end of the module...)
|
||||||
We assume that modules never overlap. */
|
We assume that modules never overlap. */
|
||||||
|
|
||||||
@ -1156,23 +1134,23 @@ hpread_quick_traverse(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Use one file to get the full name for the module. This
|
/* Use one file to get the full name for the module. This
|
||||||
* situation can arise if there is executable code in a #include
|
situation can arise if there is executable code in a #include
|
||||||
* file. Each file with code in it gets a qFD. Files which don't
|
file. Each file with code in it gets a qFD. Files which don't
|
||||||
* contribute code don't get a qFD, even if they include files
|
contribute code don't get a qFD, even if they include files
|
||||||
* which do, e.g.:
|
which do, e.g.:
|
||||||
*
|
|
||||||
* body.c: rtn.h:
|
body.c: rtn.h:
|
||||||
* int x; int main() {
|
int x; int main() {
|
||||||
* #include "rtn.h" return x;
|
#include "rtn.h" return x;
|
||||||
* }
|
}
|
||||||
*
|
|
||||||
* There will a qFD for "rtn.h",and a qMD for "body.c",
|
There will a qFD for "rtn.h",and a qMD for "body.c",
|
||||||
* but no qMD for "rtn.h" or qFD for "body.c"!
|
but no qMD for "rtn.h" or qFD for "body.c"!
|
||||||
*
|
|
||||||
* We pick the name of the last file to overlap with this
|
We pick the name of the last file to overlap with this
|
||||||
* module. C convention is to put include files first. In a
|
module. C convention is to put include files first. In a
|
||||||
* perfect world, we could check names and use the file whose full
|
perfect world, we could check names and use the file whose full
|
||||||
* path name ends with the module name. */
|
path name ends with the module name. */
|
||||||
|
|
||||||
if (VALID_CURR_FILE)
|
if (VALID_CURR_FILE)
|
||||||
full_name_string = &vt_bits[ (long) qFD[curr_fd].sbFile ];
|
full_name_string = &vt_bits[ (long) qFD[curr_fd].sbFile ];
|
||||||
@ -1201,14 +1179,14 @@ hpread_quick_traverse(
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/* Create the basic psymtab, connecting it in the list
|
/* Create the basic psymtab, connecting it in the list
|
||||||
* for this objfile and pointing its symbol entries
|
for this objfile and pointing its symbol entries
|
||||||
* to the current end of the symbol areas in the objfile.
|
to the current end of the symbol areas in the objfile.
|
||||||
*
|
|
||||||
* The "ldsymoff" parameter is the byte offset in the LNTT
|
The "ldsymoff" parameter is the byte offset in the LNTT
|
||||||
* of the first symbol in this file. Some day we should
|
of the first symbol in this file. Some day we should
|
||||||
* turn this into an index (fix in hp-symtab-read.c as well).
|
turn this into an index (fix in hp-symtab-read.c as well).
|
||||||
* And it's not even the right byte offset, as we're using
|
And it's not even the right byte offset, as we're using
|
||||||
* the size of a union! FIXME! */
|
the size of a union! FIXME! */
|
||||||
pst = hpread_start_psymtab( objfile,
|
pst = hpread_start_psymtab( objfile,
|
||||||
section_offsets, /* ?? */
|
section_offsets, /* ?? */
|
||||||
full_name_string,
|
full_name_string,
|
||||||
@ -1223,7 +1201,7 @@ hpread_quick_traverse(
|
|||||||
B_CLRALL( class_entered, pxdb_header_p->cd_entries );
|
B_CLRALL( class_entered, pxdb_header_p->cd_entries );
|
||||||
|
|
||||||
/* Scan the procedure descriptors for procedures in the current
|
/* Scan the procedure descriptors for procedures in the current
|
||||||
* module, based on the starting addresses. */
|
module, based on the starting addresses. */
|
||||||
|
|
||||||
syms_in_pst = scan_procs (&curr_pd, qPD, pxdb_header_p->pd_entries,
|
syms_in_pst = scan_procs (&curr_pd, qPD, pxdb_header_p->pd_entries,
|
||||||
start_adr, end_adr,
|
start_adr, end_adr,
|
||||||
@ -1292,8 +1270,7 @@ hpread_quick_traverse(
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Prepare for the next psymtab.
|
/* Prepare for the next psymtab. */
|
||||||
*/
|
|
||||||
global_syms = objfile->global_psymbols.next;
|
global_syms = objfile->global_psymbols.next;
|
||||||
static_syms = objfile->static_psymbols.next;
|
static_syms = objfile->static_psymbols.next;
|
||||||
free( class_entered );
|
free( class_entered );
|
||||||
@ -1345,11 +1322,10 @@ hpread_quick_traverse(
|
|||||||
|
|
||||||
#ifdef NEVER_NEVER
|
#ifdef NEVER_NEVER
|
||||||
/* Now build psts for non-module things (in the tail of
|
/* Now build psts for non-module things (in the tail of
|
||||||
* the LNTT, after the last END MODULE entry).
|
the LNTT, after the last END MODULE entry).
|
||||||
*
|
|
||||||
* If null psts were kept on the chain, this would be
|
If null psts were kept on the chain, this would be
|
||||||
* a solution. FIXME
|
a solution. FIXME */
|
||||||
*/
|
|
||||||
pst = hpread_start_psymtab( objfile,
|
pst = hpread_start_psymtab( objfile,
|
||||||
section_offsets,
|
section_offsets,
|
||||||
"globals",
|
"globals",
|
||||||
@ -1369,7 +1345,7 @@ hpread_quick_traverse(
|
|||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
} /* End of hpread_quick_traverse. */
|
} /* End of hpread_quick_traverse. */
|
||||||
|
|
||||||
|
|
||||||
/* Get appropriate header, based on pxdb type.
|
/* Get appropriate header, based on pxdb type.
|
||||||
@ -1382,19 +1358,17 @@ hpread_get_header( objfile, pxdb_header_p )
|
|||||||
asection *pinfo_section, *debug_section, *header_section;
|
asection *pinfo_section, *debug_section, *header_section;
|
||||||
|
|
||||||
#ifdef DUMPING
|
#ifdef DUMPING
|
||||||
/* Turn on for debugging information
|
/* Turn on for debugging information */
|
||||||
*/
|
|
||||||
static int dumping = 0;
|
static int dumping = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
header_section = bfd_get_section_by_name (objfile->obfd, "$HEADER$");
|
header_section = bfd_get_section_by_name (objfile->obfd, "$HEADER$");
|
||||||
if( !header_section ) {
|
if( !header_section ) {
|
||||||
/* We don't have either PINFO or DEBUG sections. But
|
/* We don't have either PINFO or DEBUG sections. But
|
||||||
* stuff like "libc.sl" has no debug info. There's no
|
stuff like "libc.sl" has no debug info. There's no
|
||||||
* need to warn the user of this, as it may be ok. The
|
need to warn the user of this, as it may be ok. The
|
||||||
* caller will figure it out and issue any needed
|
caller will figure it out and issue any needed
|
||||||
* messages.
|
messages. */
|
||||||
*/
|
|
||||||
#ifdef DUMPING
|
#ifdef DUMPING
|
||||||
if( dumping )
|
if( dumping )
|
||||||
printf( "==No debug info at all for %s.\n", objfile->name );
|
printf( "==No debug info at all for %s.\n", objfile->name );
|
||||||
@ -1404,29 +1378,25 @@ hpread_get_header( objfile, pxdb_header_p )
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* We would like either a $DEBUG$ or $PINFO$ section.
|
/* We would like either a $DEBUG$ or $PINFO$ section.
|
||||||
* Once we know which, we can understand the header
|
Once we know which, we can understand the header
|
||||||
* data (which we have defined to suit the more common
|
data (which we have defined to suit the more common
|
||||||
* $DEBUG$ case).
|
$DEBUG$ case). */
|
||||||
*/
|
|
||||||
debug_section = bfd_get_section_by_name (objfile->obfd, "$DEBUG$" );
|
debug_section = bfd_get_section_by_name (objfile->obfd, "$DEBUG$" );
|
||||||
pinfo_section = bfd_get_section_by_name (objfile->obfd, "$PINFO$" );
|
pinfo_section = bfd_get_section_by_name (objfile->obfd, "$PINFO$" );
|
||||||
if( debug_section ) {
|
if( debug_section ) {
|
||||||
/* The expected case: normal pxdb header.
|
/* The expected case: normal pxdb header. */
|
||||||
*/
|
|
||||||
bfd_get_section_contents( objfile->obfd, header_section,
|
bfd_get_section_contents( objfile->obfd, header_section,
|
||||||
pxdb_header_p, 0, sizeof( PXDB_header ));
|
pxdb_header_p, 0, sizeof( PXDB_header ));
|
||||||
|
|
||||||
if( !pxdb_header_p->pxdbed ) {
|
if( !pxdb_header_p->pxdbed ) {
|
||||||
/* This shouldn't happen if we check in "symfile.c".
|
/* This shouldn't happen if we check in "symfile.c". */
|
||||||
*/
|
|
||||||
return 0;
|
return 0;
|
||||||
} /* DEBUG section */
|
} /* DEBUG section */
|
||||||
}
|
}
|
||||||
|
|
||||||
else if( pinfo_section ) {
|
else if( pinfo_section ) {
|
||||||
/* The DOC case; we need to translate this into a
|
/* The DOC case; we need to translate this into a
|
||||||
* regular header.
|
regular header. */
|
||||||
*/
|
|
||||||
DOC_info_PXDB_header doc_header;
|
DOC_info_PXDB_header doc_header;
|
||||||
|
|
||||||
#ifdef DUMPING
|
#ifdef DUMPING
|
||||||
@ -1441,14 +1411,12 @@ hpread_get_header( objfile, pxdb_header_p )
|
|||||||
sizeof( DOC_info_PXDB_header ));
|
sizeof( DOC_info_PXDB_header ));
|
||||||
|
|
||||||
if( !doc_header.pxdbed ) {
|
if( !doc_header.pxdbed ) {
|
||||||
/* This shouldn't happen if we check in "symfile.c".
|
/* This shouldn't happen if we check in "symfile.c". */
|
||||||
*/
|
|
||||||
warning ("File \"%s\" not processed by pxdb!", objfile->name);
|
warning ("File \"%s\" not processed by pxdb!", objfile->name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copy relevent fields to standard header passed in.
|
/* Copy relevent fields to standard header passed in. */
|
||||||
*/
|
|
||||||
pxdb_header_p->pd_entries = doc_header.pd_entries;
|
pxdb_header_p->pd_entries = doc_header.pd_entries;
|
||||||
pxdb_header_p->fd_entries = doc_header.fd_entries;
|
pxdb_header_p->fd_entries = doc_header.fd_entries;
|
||||||
pxdb_header_p->md_entries = doc_header.md_entries;
|
pxdb_header_p->md_entries = doc_header.md_entries;
|
||||||
@ -1495,8 +1463,7 @@ hpread_get_header( objfile, pxdb_header_p )
|
|||||||
be called on a file without native HP C debugging symbols.
|
be called on a file without native HP C debugging symbols.
|
||||||
|
|
||||||
FIXME, there should be a cleaner peephole into the BFD environment
|
FIXME, there should be a cleaner peephole into the BFD environment
|
||||||
here.
|
here. */
|
||||||
*/
|
|
||||||
void
|
void
|
||||||
hpread_symfile_init (objfile)
|
hpread_symfile_init (objfile)
|
||||||
struct objfile *objfile;
|
struct objfile *objfile;
|
||||||
@ -1528,13 +1495,12 @@ hpread_symfile_init (objfile)
|
|||||||
/ sizeof (struct dntt_type_block);
|
/ sizeof (struct dntt_type_block);
|
||||||
|
|
||||||
/* Read in data from the $LNTT$ subspace. Also keep track of the number
|
/* Read in data from the $LNTT$ subspace. Also keep track of the number
|
||||||
* of LNTT symbols.
|
of LNTT symbols.
|
||||||
*
|
|
||||||
* FIXME: this could be moved into the psymtab-to-symtab expansion
|
FIXME: this could be moved into the psymtab-to-symtab expansion
|
||||||
* code, and save startup time. At the moment this data is
|
code, and save startup time. At the moment this data is
|
||||||
* still used, though. We'd need a way to tell hp-symtab-read.c
|
still used, though. We'd need a way to tell hp-symtab-read.c
|
||||||
* whether or not to load the LNTT.
|
whether or not to load the LNTT. */
|
||||||
*/
|
|
||||||
lntt_section = bfd_get_section_by_name (objfile->obfd, "$LNTT$");
|
lntt_section = bfd_get_section_by_name (objfile->obfd, "$LNTT$");
|
||||||
if (!lntt_section)
|
if (!lntt_section)
|
||||||
return;
|
return;
|
||||||
@ -1580,24 +1546,23 @@ hpread_symfile_init (objfile)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Scan and build partial symbols for a symbol file.
|
/* Scan and build partial symbols for a symbol file.
|
||||||
*
|
|
||||||
* The minimal symbol table (either SOM or HP a.out) has already been
|
The minimal symbol table (either SOM or HP a.out) has already been
|
||||||
* read in; all we need to do is setup partial symbols based on the
|
read in; all we need to do is setup partial symbols based on the
|
||||||
* native debugging information.
|
native debugging information.
|
||||||
*
|
|
||||||
* Note that the minimal table is produced by the linker, and has
|
Note that the minimal table is produced by the linker, and has
|
||||||
* only global routines in it; the psymtab is based on compiler-
|
only global routines in it; the psymtab is based on compiler-
|
||||||
* generated debug information and has non-global
|
generated debug information and has non-global
|
||||||
* routines in it as well as files and class information.
|
routines in it as well as files and class information.
|
||||||
*
|
|
||||||
* We assume hpread_symfile_init has been called to initialize the
|
We assume hpread_symfile_init has been called to initialize the
|
||||||
* symbol reader's private data structures.
|
symbol reader's private data structures.
|
||||||
*
|
|
||||||
* SECTION_OFFSETS contains offsets relative to which the symbols in the
|
SECTION_OFFSETS contains offsets relative to which the symbols in the
|
||||||
* various sections are (depending where the sections were actually loaded).
|
various sections are (depending where the sections were actually loaded).
|
||||||
* MAINLINE is true if we are reading the main symbol table (as
|
MAINLINE is true if we are reading the main symbol table (as
|
||||||
* opposed to a shared lib or dynamically loaded file).
|
opposed to a shared lib or dynamically loaded file). */
|
||||||
*/
|
|
||||||
void
|
void
|
||||||
hpread_build_psymtabs (objfile, section_offsets, mainline)
|
hpread_build_psymtabs (objfile, section_offsets, mainline)
|
||||||
struct objfile *objfile;
|
struct objfile *objfile;
|
||||||
@ -1606,8 +1571,7 @@ hpread_build_psymtabs (objfile, section_offsets, mainline)
|
|||||||
{
|
{
|
||||||
|
|
||||||
#ifdef DUMPING
|
#ifdef DUMPING
|
||||||
/* Turn this on to get debugging output.
|
/* Turn this on to get debugging output. */
|
||||||
*/
|
|
||||||
static int dumping = 0;
|
static int dumping = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1663,15 +1627,13 @@ hpread_build_psymtabs (objfile, section_offsets, mainline)
|
|||||||
|
|
||||||
#ifdef QUICK_LOOK_UP
|
#ifdef QUICK_LOOK_UP
|
||||||
{
|
{
|
||||||
/* Begin code for new-style loading of quick look-up tables.
|
/* Begin code for new-style loading of quick look-up tables. */
|
||||||
*/
|
|
||||||
|
|
||||||
/* elz: this checks whether the file has beeen processed by pxdb.
|
/* elz: this checks whether the file has beeen processed by pxdb.
|
||||||
If not we would like to try to read the psymbols in
|
If not we would like to try to read the psymbols in
|
||||||
anyway, but it turns out to be not so easy. So this could
|
anyway, but it turns out to be not so easy. So this could
|
||||||
actually be commented out, but I leave it in, just in case
|
actually be commented out, but I leave it in, just in case
|
||||||
we decide to add support for non-pxdb-ed stuff in the future.
|
we decide to add support for non-pxdb-ed stuff in the future. */
|
||||||
*/
|
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
abfd = symfile_bfd_open (objfile->name);
|
abfd = symfile_bfd_open (objfile->name);
|
||||||
if (!hpread_pxdb_needed(abfd))
|
if (!hpread_pxdb_needed(abfd))
|
||||||
@ -1682,8 +1644,7 @@ hpread_build_psymtabs (objfile, section_offsets, mainline)
|
|||||||
|
|
||||||
if( hpread_get_header( objfile, &pxdb_header )) {
|
if( hpread_get_header( objfile, &pxdb_header )) {
|
||||||
/* Build a minimal table. No types, no global variables,
|
/* Build a minimal table. No types, no global variables,
|
||||||
* no include files....
|
no include files.... */
|
||||||
*/
|
|
||||||
#ifdef DUMPING
|
#ifdef DUMPING
|
||||||
if( dumping )
|
if( dumping )
|
||||||
printf( "\nNew method for %s\n", objfile->name );
|
printf( "\nNew method for %s\n", objfile->name );
|
||||||
@ -1701,8 +1662,7 @@ hpread_build_psymtabs (objfile, section_offsets, mainline)
|
|||||||
have modules, and the quick method still works.
|
have modules, and the quick method still works.
|
||||||
So, if modules (other than those in end.c) are
|
So, if modules (other than those in end.c) are
|
||||||
not found we give up on the quick table stuff,
|
not found we give up on the quick table stuff,
|
||||||
and fall back on the slower method
|
and fall back on the slower method */
|
||||||
*/
|
|
||||||
found_modules_in_program = hpread_quick_traverse(
|
found_modules_in_program = hpread_quick_traverse(
|
||||||
objfile,
|
objfile,
|
||||||
section_offsets,
|
section_offsets,
|
||||||
@ -1713,16 +1673,15 @@ hpread_build_psymtabs (objfile, section_offsets, mainline)
|
|||||||
discard_cleanups (old_chain);
|
discard_cleanups (old_chain);
|
||||||
|
|
||||||
/* Set up to scan the global section of the LNTT.
|
/* Set up to scan the global section of the LNTT.
|
||||||
*
|
|
||||||
* This field is not always correct: if there are
|
This field is not always correct: if there are
|
||||||
* no globals, it will point to the last record in
|
no globals, it will point to the last record in
|
||||||
* the regular LNTT, which is usually an END MODULE.
|
the regular LNTT, which is usually an END MODULE.
|
||||||
*
|
|
||||||
* Since it might happen that there could be a file
|
Since it might happen that there could be a file
|
||||||
* with just one global record, there's no way to
|
with just one global record, there's no way to
|
||||||
* tell other than by looking at the record, so that's
|
tell other than by looking at the record, so that's
|
||||||
* done below.
|
done below. */
|
||||||
*/
|
|
||||||
if (found_modules_in_program)
|
if (found_modules_in_program)
|
||||||
scan_start = pxdb_header.globals;
|
scan_start = pxdb_header.globals;
|
||||||
else
|
else
|
||||||
@ -1738,30 +1697,27 @@ hpread_build_psymtabs (objfile, section_offsets, mainline)
|
|||||||
|
|
||||||
} /* End of new method code */
|
} /* End of new method code */
|
||||||
} /* end of if pxdb exists */
|
} /* end of if pxdb exists */
|
||||||
/*
|
/* elz: if pxdb does not exists on the system, then scan the whole debug info
|
||||||
* elz: if pxdb does not exists on the system, then scan the whole debug info
|
Actually this will never be reached because we error out in case there
|
||||||
* Actually this will never be reached because we error out in case there
|
is no pxdb on the system. It turns out that the debug info cannot be
|
||||||
* is no pxdb on the system. It turns out that the debug info cannot be
|
handled the same way as after bxdb has been run, and gdb gets very
|
||||||
* handled the same way as after bxdb has been run, and gdb gets very
|
very confused. Ileave this in anyway, in case one day we want to
|
||||||
* very confused. Ileave this in anyway, in case one day we want to
|
support non pxdb-ed files. */
|
||||||
* support non pxdb-ed files.
|
|
||||||
*/
|
|
||||||
else scan_start = 0;
|
else scan_start = 0;
|
||||||
|
|
||||||
bfd_close(abfd); /*close the bfd we opened to check for pxdb*/
|
bfd_close(abfd); /* close the bfd we opened to check for pxdb */
|
||||||
|
|
||||||
} /*end of ifdef QUICK_LOOK_UP*/
|
} /* end of ifdef QUICK_LOOK_UP */
|
||||||
#else
|
#else
|
||||||
scan_start = 0; /* if we don't want quick lookup tables start
|
scan_start = 0; /* if we don't want quick lookup tables start
|
||||||
from the beginning */
|
from the beginning */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Make two passes, one over the GNTT symbols, the other for the
|
/* Make two passes, one over the GNTT symbols, the other for the
|
||||||
* LNTT symbols.
|
LNTT symbols.
|
||||||
*
|
|
||||||
* JB comment: above isn't true--they only make one pass, over
|
JB comment: above isn't true--they only make one pass, over
|
||||||
* the LNTT.
|
the LNTT. */
|
||||||
*/
|
|
||||||
for (i = 0; i < 1; i++)
|
for (i = 0; i < 1; i++)
|
||||||
{
|
{
|
||||||
int within_function = 0;
|
int within_function = 0;
|
||||||
@ -1792,13 +1748,11 @@ hpread_build_psymtabs (objfile, section_offsets, mainline)
|
|||||||
#ifdef QUICK_LOOK_UP
|
#ifdef QUICK_LOOK_UP
|
||||||
if (scan_start == hp_symnum
|
if (scan_start == hp_symnum
|
||||||
&& symcount == hp_symnum + 1) {
|
&& symcount == hp_symnum + 1) {
|
||||||
/*
|
/* If there are NO globals in an executable,
|
||||||
* If there are NO globals in an executable,
|
PXDB's index to the globals will point to
|
||||||
* PXDB's index to the globals will point to
|
the last record in the file, which
|
||||||
* the last record in the file, which
|
could be this record. (this happened for F77 libraries)
|
||||||
* could be this record. (this happened for F77 libraries)
|
ignore it and be done! */
|
||||||
* ignore it and be done!
|
|
||||||
*/
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -1979,13 +1933,11 @@ hpread_build_psymtabs (objfile, section_offsets, mainline)
|
|||||||
#ifdef QUICK_LOOK_UP
|
#ifdef QUICK_LOOK_UP
|
||||||
if (scan_start == hp_symnum
|
if (scan_start == hp_symnum
|
||||||
&& symcount == hp_symnum + 1) {
|
&& symcount == hp_symnum + 1) {
|
||||||
/*
|
/* If there are NO globals in an executable,
|
||||||
* If there are NO globals in an executable,
|
PXDB's index to the globals will point to
|
||||||
* PXDB's index to the globals will point to
|
the last record in the file, which is
|
||||||
* the last record in the file, which is
|
probably an END MODULE, i.e. this record.
|
||||||
* probably an END MODULE, i.e. this record.
|
ignore it and be done! */
|
||||||
* ignore it and be done!
|
|
||||||
*/
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -2046,11 +1998,10 @@ hpread_build_psymtabs (objfile, section_offsets, mainline)
|
|||||||
valu += ANOFFSET (section_offsets, SECT_OFF_DATA);
|
valu += ANOFFSET (section_offsets, SECT_OFF_DATA);
|
||||||
|
|
||||||
/* Luckily, dvar, svar, typedef, and tagdef all
|
/* Luckily, dvar, svar, typedef, and tagdef all
|
||||||
* have their "global" bit in the same place, so it works
|
have their "global" bit in the same place, so it works
|
||||||
* (though it's bad programming practice) to reference
|
(though it's bad programming practice) to reference
|
||||||
* "dsvar.global" even though we may be looking at
|
"dsvar.global" even though we may be looking at
|
||||||
* any of the above four types.
|
any of the above four types. */
|
||||||
*/
|
|
||||||
if (dn_bufp->dsvar.global)
|
if (dn_bufp->dsvar.global)
|
||||||
{
|
{
|
||||||
add_psymbol_to_list (namestring, strlen (namestring),
|
add_psymbol_to_list (namestring, strlen (namestring),
|
||||||
@ -2069,17 +2020,16 @@ hpread_build_psymtabs (objfile, section_offsets, mainline)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* For TAGDEF's, the above code added the tagname to the
|
/* For TAGDEF's, the above code added the tagname to the
|
||||||
* struct namespace. This will cause tag "t" to be found
|
struct namespace. This will cause tag "t" to be found
|
||||||
* on a reference of the form "(struct t) x". But for
|
on a reference of the form "(struct t) x". But for
|
||||||
* C++ classes, "t" will also be a typename, which we
|
C++ classes, "t" will also be a typename, which we
|
||||||
* want to find on a reference of the form "ptype t".
|
want to find on a reference of the form "ptype t".
|
||||||
* Therefore, we also add "t" to the var namespace.
|
Therefore, we also add "t" to the var namespace.
|
||||||
* Do the same for enum's due to the way aCC generates
|
Do the same for enum's due to the way aCC generates
|
||||||
* debug info for these (see more extended comment
|
debug info for these (see more extended comment
|
||||||
* in hp-symtab-read.c).
|
in hp-symtab-read.c).
|
||||||
* We do the same for templates, so that "ptype t"
|
We do the same for templates, so that "ptype t"
|
||||||
* where "t" is a template also works.
|
where "t" is a template also works. */
|
||||||
*/
|
|
||||||
if (dn_bufp->dblock.kind == DNTT_TYPE_TAGDEF &&
|
if (dn_bufp->dblock.kind == DNTT_TYPE_TAGDEF &&
|
||||||
dn_bufp->dtype.type.dnttp.index < LNTT_SYMCOUNT (objfile)) {
|
dn_bufp->dtype.type.dnttp.index < LNTT_SYMCOUNT (objfile)) {
|
||||||
int global = dn_bufp->dtag.global;
|
int global = dn_bufp->dtag.global;
|
||||||
@ -2136,8 +2086,7 @@ hpread_build_psymtabs (objfile, section_offsets, mainline)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End any pending partial symbol table.
|
/* End any pending partial symbol table. */
|
||||||
*/
|
|
||||||
if (pst)
|
if (pst)
|
||||||
{
|
{
|
||||||
hpread_end_psymtab (pst, psymtab_include_list, includes_used,
|
hpread_end_psymtab (pst, psymtab_include_list, includes_used,
|
||||||
@ -2306,8 +2255,7 @@ hpread_end_psymtab (pst, include_list, num_includes, capping_symbol_offset,
|
|||||||
int offset = ANOFFSET (pst->section_offsets, SECT_OFF_TEXT);
|
int offset = ANOFFSET (pst->section_offsets, SECT_OFF_TEXT);
|
||||||
|
|
||||||
#ifdef DUMPING
|
#ifdef DUMPING
|
||||||
/* Turn on to see what kind of a psymtab we've built.
|
/* Turn on to see what kind of a psymtab we've built. */
|
||||||
*/
|
|
||||||
static int dumping = 0;
|
static int dumping = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -2392,17 +2340,15 @@ hpread_end_psymtab (pst, include_list, num_includes, capping_symbol_offset,
|
|||||||
&& pst->n_static_syms == 0)
|
&& pst->n_static_syms == 0)
|
||||||
{
|
{
|
||||||
/* Throw away this psymtab, it's empty. We can't deallocate it, since
|
/* Throw away this psymtab, it's empty. We can't deallocate it, since
|
||||||
it is on the obstack, but we can forget to chain it on the list. */
|
it is on the obstack, but we can forget to chain it on the list.
|
||||||
/* Empty psymtabs happen as a result of header files which don't have
|
Empty psymtabs happen as a result of header files which don't have
|
||||||
any symbols in them. There can be a lot of them. But this check
|
any symbols in them. There can be a lot of them. But this check
|
||||||
is wrong, in that a psymtab with N_SLINE entries but nothing else
|
is wrong, in that a psymtab with N_SLINE entries but nothing else
|
||||||
is not empty, but we don't realize that. Fixing that without slowing
|
is not empty, but we don't realize that. Fixing that without slowing
|
||||||
things down might be tricky.
|
things down might be tricky.
|
||||||
*
|
It's also wrong if we're using the quick look-up tables, as
|
||||||
* It's also wrong if we're using the quick look-up tables, as
|
we can get empty psymtabs from modules with no routines in
|
||||||
* we can get empty psymtabs from modules with no routines in
|
them. */
|
||||||
* them.
|
|
||||||
*/
|
|
||||||
|
|
||||||
discard_psymtab (pst);
|
discard_psymtab (pst);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user