#include "defs.h"
#include "bfd.h"
#include "gdb_string.h"
#include "hp-symtab.h"
#include "syms.h"
#include "symtab.h"
#include "symfile.h"
#include "objfiles.h"
#include "buildsym.h"
#include "complaints.h"
#include "gdb-stabs.h"
#include "gdbtypes.h"
#include "demangle.h"
struct hpread_symfile_info
{
char *gntt;
char *lntt;
char *slt;
char *vt;
unsigned int vt_size;
unsigned int lntt_symcount;
unsigned int gntt_symcount;
struct type **type_vector;
int type_vector_length;
sltpointer sl_index;
int within_function;
unsigned int current_function_value;
};
#define HPUX_SYMFILE_INFO(o) \
((struct hpread_symfile_info *)((o)->sym_private))
#define GNTT(o) (HPUX_SYMFILE_INFO(o)->gntt)
#define LNTT(o) (HPUX_SYMFILE_INFO(o)->lntt)
#define SLT(o) (HPUX_SYMFILE_INFO(o)->slt)
#define VT(o) (HPUX_SYMFILE_INFO(o)->vt)
#define VT_SIZE(o) (HPUX_SYMFILE_INFO(o)->vt_size)
#define LNTT_SYMCOUNT(o) (HPUX_SYMFILE_INFO(o)->lntt_symcount)
#define GNTT_SYMCOUNT(o) (HPUX_SYMFILE_INFO(o)->gntt_symcount)
#define TYPE_VECTOR(o) (HPUX_SYMFILE_INFO(o)->type_vector)
#define TYPE_VECTOR_LENGTH(o) (HPUX_SYMFILE_INFO(o)->type_vector_length)
#define SL_INDEX(o) (HPUX_SYMFILE_INFO(o)->sl_index)
#define WITHIN_FUNCTION(o) (HPUX_SYMFILE_INFO(o)->within_function)
#define CURRENT_FUNCTION_VALUE(o) (HPUX_SYMFILE_INFO(o)->current_function_value)
#define SET_NAMESTRING(SYM, NAMEP, OBJFILE) \
if (! hpread_has_name ((SYM)->dblock.kind)) \
*NAMEP = ""; \
else if (((unsigned)(SYM)->dsfile.name) >= VT_SIZE (OBJFILE)) \
{ \
complain (&string_table_offset_complaint, (char *) symnum); \
*NAMEP = ""; \
} \
else \
*NAMEP = (SYM)->dsfile.name + VT (OBJFILE)
struct symloc
{
int ldsymoff;
int ldsymlen;
};
#define LDSYMOFF(p) (((struct symloc *)((p)->read_symtab_private))->ldsymoff)
#define LDSYMLEN(p) (((struct symloc *)((p)->read_symtab_private))->ldsymlen)
#define SYMLOC(p) ((struct symloc *)((p)->read_symtab_private))
extern int info_verbose;
extern struct complaint string_table_offset_complaint;
extern struct complaint lbrac_unmatched_complaint;
extern struct complaint lbrac_mismatch_complaint;
void hpread_symfile_init (struct objfile *);
static struct type *hpread_read_array_type (dnttpointer, union dnttentry *,
struct objfile *);
static struct type *hpread_alloc_type (dnttpointer, struct objfile *);
static struct type **hpread_lookup_type (dnttpointer, struct objfile *);
static struct type *hpread_read_enum_type
(dnttpointer, union dnttentry *, struct objfile *);
static struct type *hpread_read_set_type
(dnttpointer, union dnttentry *, struct objfile *);
static struct type *hpread_read_subrange_type
(dnttpointer, union dnttentry *, struct objfile *);
static struct type *hpread_read_struct_type
(dnttpointer, union dnttentry *, struct objfile *);
void hpread_build_psymtabs (struct objfile *, int);
void hpread_symfile_finish (struct objfile *);
static struct partial_symtab *hpread_start_psymtab
(struct objfile *, char *, CORE_ADDR, int,
struct partial_symbol **, struct partial_symbol **);
static struct partial_symtab *hpread_end_psymtab
(struct partial_symtab *, char **, int, int, CORE_ADDR,
struct partial_symtab **, int);
static struct symtab *hpread_expand_symtab
(struct objfile *, int, int, CORE_ADDR, int,
struct section_offsets *, char *);
static void hpread_process_one_debug_symbol
(union dnttentry *, char *, struct section_offsets *,
struct objfile *, CORE_ADDR, int, char *, int);
static sltpointer hpread_record_lines
(struct subfile *, sltpointer, sltpointer, struct objfile *, CORE_ADDR);
static struct type *hpread_read_function_type
(dnttpointer, union dnttentry *, struct objfile *);
static struct type *hpread_type_lookup (dnttpointer, struct objfile *);
static unsigned long hpread_get_depth (sltpointer, struct objfile *);
static unsigned long hpread_get_line (sltpointer, struct objfile *);
static CORE_ADDR hpread_get_location (sltpointer, struct objfile *);
static int hpread_type_translate (dnttpointer);
static unsigned long hpread_get_textlow (int, int, struct objfile *);
static union dnttentry *hpread_get_gntt (int, struct objfile *);
static union dnttentry *hpread_get_lntt (int, struct objfile *);
static union sltentry *hpread_get_slt (int, struct objfile *);
static void hpread_psymtab_to_symtab (struct partial_symtab *);
static void hpread_psymtab_to_symtab_1 (struct partial_symtab *);
static int hpread_has_name (enum dntt_entry_type);
void
hpread_symfile_init (struct objfile *objfile)
{
asection *vt_section, *slt_section, *lntt_section, *gntt_section;
objfile->sym_private = (PTR)
xmmalloc (objfile->md, sizeof (struct hpread_symfile_info));
memset (objfile->sym_private, 0, sizeof (struct hpread_symfile_info));
TYPE_VECTOR (objfile) = 0;
gntt_section = bfd_get_section_by_name (objfile->obfd, "$GNTT$");
if (!gntt_section)
return;
GNTT (objfile)
= obstack_alloc (&objfile->symbol_obstack,
bfd_section_size (objfile->obfd, gntt_section));
bfd_get_section_contents (objfile->obfd, gntt_section, GNTT (objfile),
0, bfd_section_size (objfile->obfd, gntt_section));
GNTT_SYMCOUNT (objfile)
= bfd_section_size (objfile->obfd, gntt_section)
/ sizeof (struct dntt_type_block);
lntt_section = bfd_get_section_by_name (objfile->obfd, "$LNTT$");
if (!lntt_section)
return;
LNTT (objfile)
= obstack_alloc (&objfile->symbol_obstack,
bfd_section_size (objfile->obfd, lntt_section));
bfd_get_section_contents (objfile->obfd, lntt_section, LNTT (objfile),
0, bfd_section_size (objfile->obfd, lntt_section));
LNTT_SYMCOUNT (objfile)
= bfd_section_size (objfile->obfd, lntt_section)
/ sizeof (struct dntt_type_block);
slt_section = bfd_get_section_by_name (objfile->obfd, "$SLT$");
if (!slt_section)
return;
SLT (objfile) =
obstack_alloc (&objfile->symbol_obstack,
bfd_section_size (objfile->obfd, slt_section));
bfd_get_section_contents (objfile->obfd, slt_section, SLT (objfile),
0, bfd_section_size (objfile->obfd, slt_section));
vt_section = bfd_get_section_by_name (objfile->obfd, "$VT$");
if (!vt_section)
return;
VT_SIZE (objfile) = bfd_section_size (objfile->obfd, vt_section);
VT (objfile) =
(char *) obstack_alloc (&objfile->symbol_obstack,
VT_SIZE (objfile));
bfd_get_section_contents (objfile->obfd, vt_section, VT (objfile),
0, VT_SIZE (objfile));
}
void
hpread_build_psymtabs (struct objfile *objfile, int mainline)
{
char *namestring;
int past_first_source_file = 0;
struct cleanup *old_chain;
int hp_symnum, symcount, i;
union dnttentry *dn_bufp;
unsigned long valu;
char *p;
int texthigh = 0;
int have_name = 0;
struct partial_symtab *pst;
char **psymtab_include_list;
int includes_allocated;
int includes_used;
struct partial_symtab **dependency_list;
int dependencies_used, dependencies_allocated;
free_pending_blocks ();
make_cleanup (really_free_pendings, 0);
pst = (struct partial_symtab *) 0;
includes_allocated = 30;
includes_used = 0;
psymtab_include_list = (char **) alloca (includes_allocated *
sizeof (char *));
dependencies_allocated = 30;
dependencies_used = 0;
dependency_list =
(struct partial_symtab **) alloca (dependencies_allocated *
sizeof (struct partial_symtab *));
old_chain = make_cleanup_free_objfile (objfile);
last_source_file = 0;
for (i = 0; i < 1; i++)
{
int within_function = 0;
if (i)
symcount = GNTT_SYMCOUNT (objfile);
else
symcount = LNTT_SYMCOUNT (objfile);
for (hp_symnum = 0; hp_symnum < symcount; hp_symnum++)
{
QUIT;
if (i)
dn_bufp = hpread_get_gntt (hp_symnum, objfile);
else
dn_bufp = hpread_get_lntt (hp_symnum, objfile);
if (dn_bufp->dblock.extension)
continue;
switch (dn_bufp->dblock.kind)
{
case DNTT_TYPE_SRCFILE:
{
SET_NAMESTRING (dn_bufp, &namestring, objfile);
if (pst && !strcmp (namestring, pst->filename))
continue;
p = strrchr (namestring, '.');
if (!strcmp (p, ".h"))
{
int j, found;
found = 0;
for (j = 0; j < includes_used; j++)
if (!strcmp (namestring, psymtab_include_list[j]))
{
found = 1;
break;
}
if (found)
continue;
psymtab_include_list[includes_used++] = namestring;
if (includes_used >= includes_allocated)
{
char **orig = psymtab_include_list;
psymtab_include_list = (char **)
alloca ((includes_allocated *= 2) *
sizeof (char *));
memcpy ((PTR) psymtab_include_list, (PTR) orig,
includes_used * sizeof (char *));
}
continue;
}
if (pst)
{
if (!have_name)
{
pst->filename = (char *)
obstack_alloc (&pst->objfile->psymbol_obstack,
strlen (namestring) + 1);
strcpy (pst->filename, namestring);
have_name = 1;
continue;
}
continue;
}
if (pst && past_first_source_file)
{
hpread_end_psymtab (pst, psymtab_include_list,
includes_used,
(hp_symnum
* sizeof (struct dntt_type_block)),
texthigh,
dependency_list, dependencies_used);
pst = (struct partial_symtab *) 0;
includes_used = 0;
dependencies_used = 0;
}
else
past_first_source_file = 1;
valu = hpread_get_textlow (i, hp_symnum, objfile);
valu += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
pst = hpread_start_psymtab (objfile,
namestring, valu,
(hp_symnum
* sizeof (struct dntt_type_block)),
objfile->global_psymbols.next,
objfile->static_psymbols.next);
texthigh = valu;
have_name = 1;
continue;
}
case DNTT_TYPE_MODULE:
SET_NAMESTRING (dn_bufp, &namestring, objfile);
valu = hpread_get_textlow (i, hp_symnum, objfile);
valu += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
if (!pst)
{
pst = hpread_start_psymtab (objfile,
namestring, valu,
(hp_symnum
* sizeof (struct dntt_type_block)),
objfile->global_psymbols.next,
objfile->static_psymbols.next);
texthigh = valu;
have_name = 0;
}
continue;
case DNTT_TYPE_FUNCTION:
case DNTT_TYPE_ENTRY:
valu = dn_bufp->dfunc.hiaddr + ANOFFSET (objfile->section_offsets,
SECT_OFF_TEXT (objfile));
if (valu > texthigh)
texthigh = valu;
valu = dn_bufp->dfunc.lowaddr +
ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
SET_NAMESTRING (dn_bufp, &namestring, objfile);
add_psymbol_to_list (namestring, strlen (namestring),
VAR_NAMESPACE, LOC_BLOCK,
&objfile->static_psymbols, valu,
0, language_unknown, objfile);
within_function = 1;
continue;
case DNTT_TYPE_BEGIN:
case DNTT_TYPE_END:
if (dn_bufp->dend.endkind == DNTT_TYPE_MODULE)
{
hpread_end_psymtab (pst, psymtab_include_list, includes_used,
(hp_symnum
* sizeof (struct dntt_type_block)),
texthigh,
dependency_list, dependencies_used);
pst = (struct partial_symtab *) 0;
includes_used = 0;
dependencies_used = 0;
have_name = 0;
}
if (dn_bufp->dend.endkind == DNTT_TYPE_FUNCTION)
within_function = 0;
continue;
case DNTT_TYPE_SVAR:
case DNTT_TYPE_DVAR:
case DNTT_TYPE_TYPEDEF:
case DNTT_TYPE_TAGDEF:
{
enum address_class storage;
namespace_enum namespace;
if (within_function
&& (dn_bufp->dblock.kind == DNTT_TYPE_SVAR
|| dn_bufp->dblock.kind == DNTT_TYPE_DVAR))
continue;
if (dn_bufp->dblock.kind == DNTT_TYPE_TAGDEF)
namespace = STRUCT_NAMESPACE;
else
namespace = VAR_NAMESPACE;
if (dn_bufp->dblock.kind == DNTT_TYPE_SVAR)
storage = LOC_STATIC;
else if (dn_bufp->dblock.kind == DNTT_TYPE_DVAR
&& dn_bufp->ddvar.regvar)
storage = LOC_REGISTER;
else if (dn_bufp->dblock.kind == DNTT_TYPE_DVAR)
storage = LOC_LOCAL;
else
storage = LOC_UNDEF;
SET_NAMESTRING (dn_bufp, &namestring, objfile);
if (!pst)
{
pst = hpread_start_psymtab (objfile,
"globals", 0,
(hp_symnum
* sizeof (struct dntt_type_block)),
objfile->global_psymbols.next,
objfile->static_psymbols.next);
}
if (dn_bufp->dsvar.global)
{
add_psymbol_to_list (namestring, strlen (namestring),
namespace, storage,
&objfile->global_psymbols,
dn_bufp->dsvar.location,
0, language_unknown, objfile);
}
else
{
add_psymbol_to_list (namestring, strlen (namestring),
namespace, storage,
&objfile->static_psymbols,
dn_bufp->dsvar.location,
0, language_unknown, objfile);
}
continue;
}
case DNTT_TYPE_MEMENUM:
case DNTT_TYPE_CONST:
SET_NAMESTRING (dn_bufp, &namestring, objfile);
if (!pst)
{
pst = hpread_start_psymtab (objfile,
"globals", 0,
(hp_symnum
* sizeof (struct dntt_type_block)),
objfile->global_psymbols.next,
objfile->static_psymbols.next);
}
add_psymbol_to_list (namestring, strlen (namestring),
VAR_NAMESPACE, LOC_CONST,
&objfile->static_psymbols, 0,
0, language_unknown, objfile);
continue;
default:
continue;
}
}
}
if (pst)
{
hpread_end_psymtab (pst, psymtab_include_list, includes_used,
hp_symnum * sizeof (struct dntt_type_block),
0, dependency_list, dependencies_used);
}
discard_cleanups (old_chain);
}
void
hpread_symfile_finish (struct objfile *objfile)
{
if (objfile->sym_private != NULL)
{
mfree (objfile->md, objfile->sym_private);
}
}
static union dnttentry *
hpread_get_lntt (int index, struct objfile *objfile)
{
return (union dnttentry *)
&(LNTT (objfile)[(index * sizeof (struct dntt_type_block))]);
}
static union dnttentry *
hpread_get_gntt (int index, struct objfile *objfile)
{
return (union dnttentry *)
&(GNTT (objfile)[(index * sizeof (struct dntt_type_block))]);
}
static union sltentry *
hpread_get_slt (int index, struct objfile *objfile)
{
return (union sltentry *) &(SLT (objfile)[index * sizeof (union sltentry)]);
}
static unsigned long
hpread_get_textlow (int global, int index, struct objfile *objfile)
{
union dnttentry *dn_bufp;
struct minimal_symbol *msymbol;
do
{
if (global)
dn_bufp = hpread_get_gntt (index++, objfile);
else
dn_bufp = hpread_get_lntt (index++, objfile);
}
while (dn_bufp->dblock.kind != DNTT_TYPE_FUNCTION
&& dn_bufp->dblock.kind != DNTT_TYPE_END);
if (dn_bufp->dblock.kind == DNTT_TYPE_END)
return 0;
msymbol = lookup_minimal_symbol (dn_bufp->dfunc.name + VT (objfile), NULL,
objfile);
if (msymbol)
return SYMBOL_VALUE_ADDRESS (msymbol);
else
return dn_bufp->dfunc.lowaddr;
}
static unsigned long
hpread_get_depth (sltpointer index, struct objfile *objfile)
{
union sltentry *sl_bufp;
sl_bufp = hpread_get_slt (index, objfile);
return sl_bufp->sspec.backptr.dnttp.index;
}
static unsigned long
hpread_get_line (sltpointer index, struct objfile *objfile)
{
union sltentry *sl_bufp;
sl_bufp = hpread_get_slt (index, objfile);
return sl_bufp->snorm.line;
}
static CORE_ADDR
hpread_get_location (sltpointer index, struct objfile *objfile)
{
union sltentry *sl_bufp;
int i;
sl_bufp = hpread_get_slt (index, objfile);
if (sl_bufp->snorm.sltdesc == SLT_END)
{
for (i = 0; ((sl_bufp->snorm.sltdesc != SLT_NORMAL) &&
(sl_bufp->snorm.sltdesc != SLT_EXIT)); i++)
sl_bufp = hpread_get_slt (index - i, objfile);
return sl_bufp->snorm.address;
}
for (i = 0; ((sl_bufp->snorm.sltdesc != SLT_NORMAL) &&
(sl_bufp->snorm.sltdesc != SLT_EXIT)); i++)
sl_bufp = hpread_get_slt (index + i, objfile);
return sl_bufp->snorm.address;
}
static int
hpread_has_name (enum dntt_entry_type kind)
{
switch (kind)
{
case DNTT_TYPE_SRCFILE:
case DNTT_TYPE_MODULE:
case DNTT_TYPE_FUNCTION:
case DNTT_TYPE_ENTRY:
case DNTT_TYPE_IMPORT:
case DNTT_TYPE_LABEL:
case DNTT_TYPE_FPARAM:
case DNTT_TYPE_SVAR:
case DNTT_TYPE_DVAR:
case DNTT_TYPE_CONST:
case DNTT_TYPE_TYPEDEF:
case DNTT_TYPE_TAGDEF:
case DNTT_TYPE_MEMENUM:
case DNTT_TYPE_FIELD:
case DNTT_TYPE_SA:
return 1;
case DNTT_TYPE_BEGIN:
case DNTT_TYPE_END:
case DNTT_TYPE_WITH:
case DNTT_TYPE_COMMON:
case DNTT_TYPE_POINTER:
case DNTT_TYPE_ENUM:
case DNTT_TYPE_SET:
case DNTT_TYPE_SUBRANGE:
case DNTT_TYPE_ARRAY:
case DNTT_TYPE_STRUCT:
case DNTT_TYPE_UNION:
case DNTT_TYPE_VARIANT:
case DNTT_TYPE_FILE:
case DNTT_TYPE_FUNCTYPE:
case DNTT_TYPE_COBSTRUCT:
case DNTT_TYPE_XREF:
case DNTT_TYPE_MACRO:
default:
return 0;
}
}
static struct partial_symtab *
hpread_start_psymtab (struct objfile *objfile, char *filename,
CORE_ADDR textlow, int ldsymoff,
struct partial_symbol **global_syms,
struct partial_symbol **static_syms)
{
struct partial_symtab *result =
start_psymtab_common (objfile, section_offsets,
filename, textlow, global_syms, static_syms);
result->read_symtab_private = (char *)
obstack_alloc (&objfile->psymbol_obstack, sizeof (struct symloc));
LDSYMOFF (result) = ldsymoff;
result->read_symtab = hpread_psymtab_to_symtab;
return result;
}
static struct partial_symtab *
hpread_end_psymtab (struct partial_symtab *pst, char **include_list,
int num_includes, int capping_symbol_offset,
CORE_ADDR capping_text,
struct partial_symtab **dependency_list,
int number_dependencies)
{
int i;
struct objfile *objfile = pst->objfile;
if (capping_symbol_offset != -1)
LDSYMLEN (pst) = capping_symbol_offset - LDSYMOFF (pst);
pst->texthigh = capping_text;
pst->n_global_syms =
objfile->global_psymbols.next - (objfile->global_psymbols.list + pst->globals_offset);
pst->n_static_syms =
objfile->static_psymbols.next - (objfile->static_psymbols.list + pst->statics_offset);
pst->number_of_dependencies = number_dependencies;
if (number_dependencies)
{
pst->dependencies = (struct partial_symtab **)
obstack_alloc (&objfile->psymbol_obstack,
number_dependencies * sizeof (struct partial_symtab *));
memcpy (pst->dependencies, dependency_list,
number_dependencies * sizeof (struct partial_symtab *));
}
else
pst->dependencies = 0;
for (i = 0; i < num_includes; i++)
{
struct partial_symtab *subpst =
allocate_psymtab (include_list[i], objfile);
subpst->section_offsets = pst->section_offsets;
subpst->read_symtab_private =
(char *) obstack_alloc (&objfile->psymbol_obstack,
sizeof (struct symloc));
LDSYMOFF (subpst) =
LDSYMLEN (subpst) =
subpst->textlow =
subpst->texthigh = 0;
subpst->dependencies = (struct partial_symtab **)
obstack_alloc (&objfile->psymbol_obstack,
sizeof (struct partial_symtab *));
subpst->dependencies[0] = pst;
subpst->number_of_dependencies = 1;
subpst->globals_offset =
subpst->n_global_syms =
subpst->statics_offset =
subpst->n_static_syms = 0;
subpst->readin = 0;
subpst->symtab = 0;
subpst->read_symtab = pst->read_symtab;
}
sort_pst_symbols (pst);
free_named_symtabs (pst->filename);
if (num_includes == 0
&& number_dependencies == 0
&& pst->n_global_syms == 0
&& pst->n_static_syms == 0)
{
discard_psymtab (pst);
pst = (struct partial_symtab *) NULL;
}
return pst;
}
static void
hpread_psymtab_to_symtab_1 (struct partial_symtab *pst)
{
struct cleanup *old_chain;
int i;
if (!pst)
return;
if (pst->readin)
{
fprintf (stderr, "Psymtab for %s already read in. Shouldn't happen.\n",
pst->filename);
return;
}
for (i = 0; i < pst->number_of_dependencies; i++)
if (!pst->dependencies[i]->readin)
{
if (info_verbose)
{
fputs_filtered (" ", gdb_stdout);
wrap_here ("");
fputs_filtered ("and ", gdb_stdout);
wrap_here ("");
printf_filtered ("%s...", pst->dependencies[i]->filename);
wrap_here ("");
gdb_flush (gdb_stdout);
}
hpread_psymtab_to_symtab_1 (pst->dependencies[i]);
}
if (LDSYMLEN (pst))
{
buildsym_init ();
old_chain = make_cleanup (really_free_pendings, 0);
pst->symtab =
hpread_expand_symtab (pst->objfile, LDSYMOFF (pst), LDSYMLEN (pst),
pst->textlow, pst->texthigh - pst->textlow,
pst->section_offsets, pst->filename);
sort_symtab_syms (pst->symtab);
do_cleanups (old_chain);
}
pst->readin = 1;
}
static void
hpread_psymtab_to_symtab (struct partial_symtab *pst)
{
if (!pst)
return;
if (pst->readin)
{
fprintf (stderr, "Psymtab for %s already read in. Shouldn't happen.\n",
pst->filename);
return;
}
if (LDSYMLEN (pst) || pst->number_of_dependencies)
{
if (info_verbose)
{
printf_filtered ("Reading in symbols for %s...", pst->filename);
gdb_flush (gdb_stdout);
}
hpread_psymtab_to_symtab_1 (pst);
scan_file_globals (pst->objfile);
if (info_verbose)
printf_filtered ("done.\n");
}
}
static struct symtab *
hpread_expand_symtab (struct objfile *objfile, int sym_offset, int sym_size,
CORE_ADDR text_offset, int text_size,
struct section_offsets *section_offsets, char *filename)
{
char *namestring;
union dnttentry *dn_bufp;
unsigned max_symnum;
int sym_index = sym_offset / sizeof (struct dntt_type_block);
current_objfile = objfile;
subfile_stack = 0;
last_source_file = 0;
dn_bufp = hpread_get_lntt (sym_index, objfile);
if (!((dn_bufp->dblock.kind == (unsigned char) DNTT_TYPE_SRCFILE) ||
(dn_bufp->dblock.kind == (unsigned char) DNTT_TYPE_MODULE)))
{
start_symtab ("globals", NULL, 0);
record_debugformat ("HP");
}
max_symnum = sym_size / sizeof (struct dntt_type_block);
for (symnum = 0;
symnum < max_symnum;
symnum++)
{
QUIT;
dn_bufp = hpread_get_lntt (sym_index + symnum, objfile);
if (dn_bufp->dblock.extension)
continue;
SET_NAMESTRING (dn_bufp, &namestring, objfile);
hpread_process_one_debug_symbol (dn_bufp, namestring, section_offsets,
objfile, text_offset, text_size,
filename, symnum + sym_index);
}
current_objfile = NULL;
return end_symtab (text_offset + text_size, objfile, SECT_OFF_TEXT (objfile));
}
static int
hpread_type_translate (dnttpointer typep)
{
if (!typep.dntti.immediate)
abort ();
switch (typep.dntti.type)
{
case HP_TYPE_BOOLEAN:
case HP_TYPE_BOOLEAN_S300_COMPAT:
case HP_TYPE_BOOLEAN_VAX_COMPAT:
return FT_BOOLEAN;
case HP_TYPE_CHAR:
case HP_TYPE_WIDE_CHAR:
return FT_CHAR;
case HP_TYPE_INT:
if (typep.dntti.bitlength <= 8)
return FT_CHAR;
if (typep.dntti.bitlength <= 16)
return FT_SHORT;
if (typep.dntti.bitlength <= 32)
return FT_INTEGER;
return FT_LONG_LONG;
case HP_TYPE_LONG:
return FT_LONG;
case HP_TYPE_UNSIGNED_LONG:
if (typep.dntti.bitlength <= 8)
return FT_UNSIGNED_CHAR;
if (typep.dntti.bitlength <= 16)
return FT_UNSIGNED_SHORT;
if (typep.dntti.bitlength <= 32)
return FT_UNSIGNED_LONG;
return FT_UNSIGNED_LONG_LONG;
case HP_TYPE_UNSIGNED_INT:
if (typep.dntti.bitlength <= 8)
return FT_UNSIGNED_CHAR;
if (typep.dntti.bitlength <= 16)
return FT_UNSIGNED_SHORT;
if (typep.dntti.bitlength <= 32)
return FT_UNSIGNED_INTEGER;
return FT_UNSIGNED_LONG_LONG;
case HP_TYPE_REAL:
case HP_TYPE_REAL_3000:
case HP_TYPE_DOUBLE:
if (typep.dntti.bitlength == 64)
return FT_DBL_PREC_FLOAT;
if (typep.dntti.bitlength == 128)
return FT_EXT_PREC_FLOAT;
return FT_FLOAT;
case HP_TYPE_COMPLEX:
case HP_TYPE_COMPLEXS3000:
if (typep.dntti.bitlength == 128)
return FT_DBL_PREC_COMPLEX;
if (typep.dntti.bitlength == 192)
return FT_EXT_PREC_COMPLEX;
return FT_COMPLEX;
case HP_TYPE_STRING200:
case HP_TYPE_LONGSTRING200:
case HP_TYPE_FTN_STRING_SPEC:
case HP_TYPE_MOD_STRING_SPEC:
case HP_TYPE_MOD_STRING_3000:
case HP_TYPE_FTN_STRING_S300_COMPAT:
case HP_TYPE_FTN_STRING_VAX_COMPAT:
return FT_STRING;
default:
abort ();
}
}
static struct type **
hpread_lookup_type (dnttpointer hp_type, struct objfile *objfile)
{
unsigned old_len;
int index = hp_type.dnttp.index;
if (hp_type.dntti.immediate)
return NULL;
if (index < LNTT_SYMCOUNT (objfile))
{
if (index >= TYPE_VECTOR_LENGTH (objfile))
{
old_len = TYPE_VECTOR_LENGTH (objfile);
if (old_len == 0)
{
TYPE_VECTOR_LENGTH (objfile) = 100;
TYPE_VECTOR (objfile) = (struct type **)
xmmalloc (objfile->md,
TYPE_VECTOR_LENGTH (objfile) * sizeof (struct type *));
}
while (index >= TYPE_VECTOR_LENGTH (objfile))
TYPE_VECTOR_LENGTH (objfile) *= 2;
TYPE_VECTOR (objfile) = (struct type **)
xmrealloc (objfile->md,
(char *) TYPE_VECTOR (objfile),
(TYPE_VECTOR_LENGTH (objfile) * sizeof (struct type *)));
memset (&TYPE_VECTOR (objfile)[old_len], 0,
(TYPE_VECTOR_LENGTH (objfile) - old_len) *
sizeof (struct type *));
}
return &TYPE_VECTOR (objfile)[index];
}
else
return NULL;
}
static struct type *
hpread_alloc_type (dnttpointer hp_type, struct objfile *objfile)
{
struct type **type_addr;
type_addr = hpread_lookup_type (hp_type, objfile);
if (*type_addr == 0)
*type_addr = alloc_type (objfile);
TYPE_CPLUS_SPECIFIC (*type_addr)
= (struct cplus_struct_type *) &cplus_struct_default;
return *type_addr;
}
static struct type *
hpread_read_enum_type (dnttpointer hp_type, union dnttentry *dn_bufp,
struct objfile *objfile)
{
struct type *type;
struct pending **symlist, *osyms, *syms;
int o_nsyms, nsyms = 0;
dnttpointer mem;
union dnttentry *memp;
char *name;
long n;
struct symbol *sym;
type = hpread_alloc_type (hp_type, objfile);
TYPE_LENGTH (type) = 4;
symlist = &file_symbols;
osyms = *symlist;
o_nsyms = osyms ? osyms->nsyms : 0;
mem = dn_bufp->denum.firstmem;
while (mem.dnttp.extension && mem.word != DNTTNIL)
{
memp = hpread_get_lntt (mem.dnttp.index, objfile);
name = VT (objfile) + memp->dmember.name;
sym = (struct symbol *) obstack_alloc (&objfile->symbol_obstack,
sizeof (struct symbol));
memset (sym, 0, sizeof (struct symbol));
SYMBOL_NAME (sym) = obsavestring (name, strlen (name),
&objfile->symbol_obstack);
SYMBOL_CLASS (sym) = LOC_CONST;
SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
SYMBOL_VALUE (sym) = memp->dmember.value;
add_symbol_to_list (sym, symlist);
nsyms++;
mem = memp->dmember.nextmem;
}
TYPE_CODE (type) = TYPE_CODE_ENUM;
TYPE_FLAGS (type) &= ~TYPE_FLAG_STUB;
TYPE_NFIELDS (type) = nsyms;
TYPE_FIELDS (type) = (struct field *)
obstack_alloc (&objfile->type_obstack, sizeof (struct field) * nsyms);
for (syms = *symlist, n = 0; syms; syms = syms->next)
{
int j = 0;
if (syms == osyms)
j = o_nsyms;
for (; j < syms->nsyms; j++, n++)
{
struct symbol *xsym = syms->symbol[j];
SYMBOL_TYPE (xsym) = type;
TYPE_FIELD_NAME (type, n) = SYMBOL_NAME (xsym);
TYPE_FIELD_BITPOS (type, n) = SYMBOL_VALUE (xsym);
TYPE_FIELD_BITSIZE (type, n) = 0;
}
if (syms == osyms)
break;
}
return type;
}
static struct type *
hpread_read_function_type (dnttpointer hp_type, union dnttentry *dn_bufp,
struct objfile *objfile)
{
struct type *type, *type1;
struct pending **symlist, *osyms, *syms;
int o_nsyms, nsyms = 0;
dnttpointer param;
union dnttentry *paramp;
char *name;
long n;
struct symbol *sym;
param = dn_bufp->dfunc.firstparam;
type = hpread_alloc_type (hp_type, objfile);
if (TYPE_CODE (type) == TYPE_CODE_FUNC)
return type;
type1 = lookup_function_type (hpread_type_lookup (dn_bufp->dfunc.retval,
objfile));
memcpy ((char *) type, (char *) type1, sizeof (struct type));
symlist = &local_symbols;
osyms = *symlist;
o_nsyms = osyms ? osyms->nsyms : 0;
while (param.word && param.word != DNTTNIL)
{
paramp = hpread_get_lntt (param.dnttp.index, objfile);
nsyms++;
param = paramp->dfparam.nextparam;
name = VT (objfile) + paramp->dfparam.name;
sym = (struct symbol *) obstack_alloc (&objfile->symbol_obstack,
sizeof (struct symbol));
(void) memset (sym, 0, sizeof (struct symbol));
SYMBOL_NAME (sym) = obsavestring (name, strlen (name),
&objfile->symbol_obstack);
if (paramp->dfparam.regparam)
SYMBOL_CLASS (sym) = LOC_REGPARM;
else if (paramp->dfparam.indirect)
SYMBOL_CLASS (sym) = LOC_REF_ARG;
else
SYMBOL_CLASS (sym) = LOC_ARG;
SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
if (paramp->dfparam.copyparam)
{
SYMBOL_VALUE (sym) = paramp->dfparam.location;
#ifdef HPREAD_ADJUST_STACK_ADDRESS
SYMBOL_VALUE (sym)
+= HPREAD_ADJUST_STACK_ADDRESS (CURRENT_FUNCTION_VALUE (objfile));
#endif
SYMBOL_CLASS (sym) = LOC_REGPARM_ADDR;
}
else
SYMBOL_VALUE (sym) = paramp->dfparam.location;
SYMBOL_TYPE (sym) = hpread_type_lookup (paramp->dfparam.type, objfile);
add_symbol_to_list (sym, symlist);
}
TYPE_NFIELDS (type) = nsyms;
TYPE_FIELDS (type) = (struct field *)
obstack_alloc (&objfile->type_obstack,
sizeof (struct field) * nsyms);
for (syms = *symlist, n = 0; syms; syms = syms->next)
{
int j = 0;
if (syms == osyms)
j = o_nsyms;
for (; j < syms->nsyms; j++, n++)
{
struct symbol *xsym = syms->symbol[j];
TYPE_FIELD_NAME (type, n) = SYMBOL_NAME (xsym);
TYPE_FIELD_TYPE (type, n) = SYMBOL_TYPE (xsym);
TYPE_FIELD_BITPOS (type, n) = n;
TYPE_FIELD_BITSIZE (type, n) = 0;
}
if (syms == osyms)
break;
}
return type;
}
static struct type *
hpread_read_struct_type (dnttpointer hp_type, union dnttentry *dn_bufp,
struct objfile *objfile)
{
struct nextfield
{
struct nextfield *next;
struct field field;
};
struct type *type;
struct nextfield *list = 0;
struct nextfield *new;
int n, nfields = 0;
dnttpointer field;
union dnttentry *fieldp;
type = hpread_alloc_type (hp_type, objfile);
if ((TYPE_CODE (type) == TYPE_CODE_STRUCT) ||
(TYPE_CODE (type) == TYPE_CODE_UNION))
return type;
if (dn_bufp->dblock.kind == DNTT_TYPE_STRUCT)
{
TYPE_CODE (type) = TYPE_CODE_STRUCT;
TYPE_LENGTH (type) = dn_bufp->dstruct.bitlength / 8;
}
else if (dn_bufp->dblock.kind == DNTT_TYPE_UNION)
{
TYPE_CODE (type) = TYPE_CODE_UNION;
TYPE_LENGTH (type) = dn_bufp->dunion.bitlength / 8;
}
else
return type;
TYPE_FLAGS (type) &= ~TYPE_FLAG_STUB;
field = dn_bufp->dstruct.firstfield;
while (field.word != DNTTNIL && field.dnttp.extension)
{
fieldp = hpread_get_lntt (field.dnttp.index, objfile);
new = (struct nextfield *) alloca (sizeof (struct nextfield));
new->next = list;
list = new;
list->field.name = VT (objfile) + fieldp->dfield.name;
FIELD_BITPOS (list->field) = fieldp->dfield.bitoffset;
if (fieldp->dfield.bitlength % 8)
FIELD_BITSIZE (list->field) = fieldp->dfield.bitlength;
else
FIELD_BITSIZE (list->field) = 0;
nfields++;
field = fieldp->dfield.nextfield;
FIELD_TYPE (list->field) = hpread_type_lookup (fieldp->dfield.type,
objfile);
}
TYPE_NFIELDS (type) = nfields;
TYPE_FIELDS (type) = (struct field *)
obstack_alloc (&objfile->type_obstack, sizeof (struct field) * nfields);
for (n = nfields; list; list = list->next)
{
n -= 1;
TYPE_FIELD (type, n) = list->field;
}
return type;
}
static struct type *
hpread_read_set_type (dnttpointer hp_type, union dnttentry *dn_bufp,
struct objfile *objfile)
{
struct type *type;
type = hpread_alloc_type (hp_type, objfile);
if (TYPE_CODE (type) == TYPE_CODE_SET)
return type;
TYPE_CODE (type) = TYPE_CODE_SET;
TYPE_LENGTH (type) = dn_bufp->dset.bitlength / 8;
TYPE_NFIELDS (type) = 0;
TYPE_TARGET_TYPE (type) = hpread_type_lookup (dn_bufp->dset.subtype,
objfile);
return type;
}
static struct type *
hpread_read_array_type (dnttpointer hp_type, union dnttentry *dn_bufp,
struct objfile *objfile)
{
struct type *type;
union dnttentry save;
save = *dn_bufp;
type = hpread_alloc_type (hp_type, objfile);
TYPE_CODE (type) = TYPE_CODE_ARRAY;
if (!((dn_bufp->darray.arrayisbytes && dn_bufp->darray.elemisbytes)
|| (!dn_bufp->darray.arrayisbytes && !dn_bufp->darray.elemisbytes)))
abort ();
else if (dn_bufp->darray.arraylength == 0x7fffffff)
{
TYPE_LENGTH (type) = 0;
}
else
TYPE_LENGTH (type) = dn_bufp->darray.arraylength / 8;
TYPE_NFIELDS (type) = 1;
TYPE_TARGET_TYPE (type) = hpread_type_lookup (dn_bufp->darray.elemtype,
objfile);
dn_bufp = &save;
TYPE_FIELDS (type) = (struct field *)
obstack_alloc (&objfile->type_obstack, sizeof (struct field));
TYPE_FIELD_TYPE (type, 0) = hpread_type_lookup (dn_bufp->darray.indextype,
objfile);
return type;
}
static struct type *
hpread_read_subrange_type (dnttpointer hp_type, union dnttentry *dn_bufp,
struct objfile *objfile)
{
struct type *type;
type = hpread_alloc_type (hp_type, objfile);
if (TYPE_CODE (type) == TYPE_CODE_RANGE)
return type;
TYPE_CODE (type) = TYPE_CODE_RANGE;
TYPE_LENGTH (type) = dn_bufp->dsubr.bitlength / 8;
TYPE_NFIELDS (type) = 2;
TYPE_FIELDS (type)
= (struct field *) obstack_alloc (&objfile->type_obstack,
2 * sizeof (struct field));
if (dn_bufp->dsubr.dyn_low)
TYPE_FIELD_BITPOS (type, 0) = 0;
else
TYPE_FIELD_BITPOS (type, 0) = dn_bufp->dsubr.lowbound;
if (dn_bufp->dsubr.dyn_high)
TYPE_FIELD_BITPOS (type, 1) = -1;
else
TYPE_FIELD_BITPOS (type, 1) = dn_bufp->dsubr.highbound;
TYPE_TARGET_TYPE (type) = hpread_type_lookup (dn_bufp->dsubr.subtype,
objfile);
return type;
}
static struct type *
hpread_type_lookup (dnttpointer hp_type, struct objfile *objfile)
{
union dnttentry *dn_bufp;
if (hp_type.dntti.immediate)
return lookup_fundamental_type (objfile, hpread_type_translate (hp_type));
if (hp_type.dnttp.index < LNTT_SYMCOUNT (objfile))
dn_bufp = hpread_get_lntt (hp_type.dnttp.index, objfile);
else
return lookup_fundamental_type (objfile, FT_VOID);
switch (dn_bufp->dblock.kind)
{
case DNTT_TYPE_SRCFILE:
case DNTT_TYPE_MODULE:
case DNTT_TYPE_FUNCTION:
case DNTT_TYPE_ENTRY:
case DNTT_TYPE_BEGIN:
case DNTT_TYPE_END:
case DNTT_TYPE_IMPORT:
case DNTT_TYPE_LABEL:
case DNTT_TYPE_WITH:
case DNTT_TYPE_COMMON:
case DNTT_TYPE_FPARAM:
case DNTT_TYPE_SVAR:
case DNTT_TYPE_DVAR:
case DNTT_TYPE_CONST:
return lookup_fundamental_type (objfile, FT_VOID);
case DNTT_TYPE_TYPEDEF:
{
struct type *structtype = hpread_type_lookup (dn_bufp->dtype.type,
objfile);
char *suffix;
suffix = VT (objfile) + dn_bufp->dtype.name;
TYPE_CPLUS_SPECIFIC (structtype)
= (struct cplus_struct_type *) &cplus_struct_default;
TYPE_NAME (structtype) = suffix;
return structtype;
}
case DNTT_TYPE_TAGDEF:
{
struct type *structtype = hpread_type_lookup (dn_bufp->dtype.type,
objfile);
char *prefix, *suffix;
suffix = VT (objfile) + dn_bufp->dtype.name;
if (dn_bufp->dtype.type.dnttp.index < LNTT_SYMCOUNT (objfile))
dn_bufp = hpread_get_lntt (dn_bufp->dtype.type.dnttp.index, objfile);
else
abort ();
if (dn_bufp->dblock.kind == DNTT_TYPE_STRUCT)
prefix = "struct ";
else if (dn_bufp->dblock.kind == DNTT_TYPE_UNION)
prefix = "union ";
else
prefix = "enum ";
structtype->name
= (char *) obstack_alloc (&objfile->type_obstack,
strlen (prefix) + strlen (suffix) + 1);
TYPE_NAME (structtype) = strcpy (TYPE_NAME (structtype), prefix);
TYPE_NAME (structtype) = strcat (TYPE_NAME (structtype), suffix);
TYPE_TAG_NAME (structtype) = suffix;
TYPE_CPLUS_SPECIFIC (structtype)
= (struct cplus_struct_type *) &cplus_struct_default;
return structtype;
}
case DNTT_TYPE_POINTER:
return lookup_pointer_type (hpread_type_lookup (dn_bufp->dptr.pointsto,
objfile));
case DNTT_TYPE_ENUM:
return hpread_read_enum_type (hp_type, dn_bufp, objfile);
case DNTT_TYPE_MEMENUM:
return lookup_fundamental_type (objfile, FT_VOID);
case DNTT_TYPE_SET:
return hpread_read_set_type (hp_type, dn_bufp, objfile);
case DNTT_TYPE_SUBRANGE:
return hpread_read_subrange_type (hp_type, dn_bufp, objfile);
case DNTT_TYPE_ARRAY:
return hpread_read_array_type (hp_type, dn_bufp, objfile);
case DNTT_TYPE_STRUCT:
case DNTT_TYPE_UNION:
return hpread_read_struct_type (hp_type, dn_bufp, objfile);
case DNTT_TYPE_FIELD:
return hpread_type_lookup (dn_bufp->dfield.type, objfile);
case DNTT_TYPE_VARIANT:
case DNTT_TYPE_FILE:
return lookup_fundamental_type (objfile, FT_VOID);
case DNTT_TYPE_FUNCTYPE:
return lookup_function_type (hpread_type_lookup (dn_bufp->dfunctype.retval,
objfile));
case DNTT_TYPE_COBSTRUCT:
case DNTT_TYPE_XREF:
case DNTT_TYPE_SA:
case DNTT_TYPE_MACRO:
default:
return lookup_fundamental_type (objfile, FT_VOID);
}
}
static sltpointer
hpread_record_lines (struct subfile *subfile, sltpointer s_idx,
sltpointer e_idx, struct objfile *objfile,
CORE_ADDR offset)
{
union sltentry *sl_bufp;
while (s_idx <= e_idx)
{
sl_bufp = hpread_get_slt (s_idx, objfile);
if (sl_bufp->snorm.sltdesc == SLT_NORMAL
|| sl_bufp->snorm.sltdesc == SLT_EXIT)
record_line (subfile, sl_bufp->snorm.line,
sl_bufp->snorm.address + offset);
s_idx++;
}
return e_idx;
}
static void
hpread_process_one_debug_symbol (union dnttentry *dn_bufp, char *name,
struct section_offsets *section_offsets,
struct objfile *objfile, CORE_ADDR text_offset,
int text_size, char *filename, int index)
{
unsigned long desc;
int type;
CORE_ADDR valu;
int offset = ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
union dnttentry *dn_temp;
dnttpointer hp_type;
struct symbol *sym;
struct context_stack *new;
sym = (struct symbol *) obstack_alloc (&objfile->symbol_obstack,
sizeof (struct symbol));
memset (sym, 0, sizeof (struct symbol));
SYMBOL_NAME (sym) = obsavestring (name, strlen (name), &objfile->symbol_obstack);
SYMBOL_LANGUAGE (sym) = language_auto;
SYMBOL_INIT_DEMANGLED_NAME (sym, &objfile->symbol_obstack);
SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
SYMBOL_LINE (sym) = 0;
SYMBOL_VALUE (sym) = 0;
SYMBOL_CLASS (sym) = LOC_TYPEDEF;
hp_type.dnttp.extension = 1;
hp_type.dnttp.immediate = 0;
hp_type.dnttp.global = 0;
hp_type.dnttp.index = index;
type = dn_bufp->dblock.kind;
switch (type)
{
case DNTT_TYPE_SRCFILE:
valu = text_offset;
if (!last_source_file)
{
start_symtab (name, NULL, valu);
record_debugformat ("HP");
SL_INDEX (objfile) = dn_bufp->dsfile.address;
}
else
{
SL_INDEX (objfile) = hpread_record_lines (current_subfile,
SL_INDEX (objfile),
dn_bufp->dsfile.address,
objfile, offset);
}
start_subfile (name, NULL);
break;
case DNTT_TYPE_MODULE:
break;
case DNTT_TYPE_FUNCTION:
case DNTT_TYPE_ENTRY:
valu = dn_bufp->dfunc.lowaddr + offset;
SL_INDEX (objfile) = hpread_record_lines (current_subfile,
SL_INDEX (objfile),
dn_bufp->dfunc.address,
objfile, offset);
WITHIN_FUNCTION (objfile) = 1;
CURRENT_FUNCTION_VALUE (objfile) = valu;
if (context_stack_depth != 0)
complain (&lbrac_unmatched_complaint, (char *) symnum);
new = push_context (0, valu);
SYMBOL_CLASS (sym) = LOC_BLOCK;
SYMBOL_TYPE (sym) = hpread_read_function_type (hp_type, dn_bufp, objfile);
if (dn_bufp->dfunc.global)
add_symbol_to_list (sym, &global_symbols);
else
add_symbol_to_list (sym, &file_symbols);
new->name = sym;
while (dn_bufp->dblock.kind != DNTT_TYPE_BEGIN)
{
dn_bufp = hpread_get_lntt (++index, objfile);
if (dn_bufp->dblock.extension)
continue;
}
SL_INDEX (objfile) = hpread_record_lines (current_subfile,
SL_INDEX (objfile),
dn_bufp->dbegin.address,
objfile, offset);
SYMBOL_LINE (sym) = hpread_get_line (dn_bufp->dbegin.address, objfile);
record_line (current_subfile, SYMBOL_LINE (sym), valu);
break;
case DNTT_TYPE_BEGIN:
SL_INDEX (objfile) = hpread_record_lines (current_subfile,
SL_INDEX (objfile),
dn_bufp->dbegin.address,
objfile, offset);
valu = hpread_get_location (dn_bufp->dbegin.address, objfile);
valu += offset;
desc = hpread_get_depth (dn_bufp->dbegin.address, objfile);
new = push_context (desc, valu);
break;
case DNTT_TYPE_END:
SL_INDEX (objfile) = hpread_record_lines (current_subfile,
SL_INDEX (objfile),
dn_bufp->dend.address + 1,
objfile, offset);
switch (dn_bufp->dend.endkind)
{
case DNTT_TYPE_MODULE:
valu = text_offset + text_size + offset;
(void) end_symtab (valu, objfile, SECT_OFF_TEXT (objfile));
break;
case DNTT_TYPE_FUNCTION:
dn_temp = hpread_get_lntt (dn_bufp->dend.beginscope.dnttp.index,
objfile);
valu = dn_temp->dfunc.hiaddr + offset;
new = pop_context ();
finish_block (new->name, &local_symbols, new->old_blocks,
new->start_addr, valu, objfile);
WITHIN_FUNCTION (objfile) = 0;
break;
case DNTT_TYPE_BEGIN:
valu = hpread_get_location (dn_bufp->dend.address, objfile);
valu += offset + 9;
new = pop_context ();
desc = dn_bufp->dend.beginscope.dnttp.index;
if (desc != new->depth)
complain (&lbrac_mismatch_complaint, (char *) symnum);
finish_block (new->name, &local_symbols, new->old_blocks,
new->start_addr, valu, objfile);
local_symbols = new->locals;
break;
}
break;
case DNTT_TYPE_LABEL:
SYMBOL_NAMESPACE (sym) = LABEL_NAMESPACE;
break;
case DNTT_TYPE_FPARAM:
if (dn_bufp->dfparam.regparam)
SYMBOL_CLASS (sym) = LOC_REGISTER;
else
SYMBOL_CLASS (sym) = LOC_LOCAL;
if (dn_bufp->dfparam.copyparam)
{
SYMBOL_VALUE (sym) = dn_bufp->dfparam.location;
#ifdef HPREAD_ADJUST_STACK_ADDRESS
SYMBOL_VALUE (sym)
+= HPREAD_ADJUST_STACK_ADDRESS (CURRENT_FUNCTION_VALUE (objfile));
#endif
}
else
SYMBOL_VALUE (sym) = dn_bufp->dfparam.location;
SYMBOL_TYPE (sym) = hpread_type_lookup (dn_bufp->dfparam.type, objfile);
add_symbol_to_list (sym, &local_symbols);
break;
case DNTT_TYPE_SVAR:
SYMBOL_CLASS (sym) = LOC_STATIC;
SYMBOL_VALUE_ADDRESS (sym) = dn_bufp->dsvar.location;
SYMBOL_TYPE (sym) = hpread_type_lookup (dn_bufp->dsvar.type, objfile);
if (dn_bufp->dsvar.global)
add_symbol_to_list (sym, &global_symbols);
else if (WITHIN_FUNCTION (objfile))
add_symbol_to_list (sym, &local_symbols);
else
add_symbol_to_list (sym, &file_symbols);
break;
case DNTT_TYPE_DVAR:
if (dn_bufp->ddvar.regvar)
SYMBOL_CLASS (sym) = LOC_REGISTER;
else
SYMBOL_CLASS (sym) = LOC_LOCAL;
SYMBOL_VALUE (sym) = dn_bufp->ddvar.location;
#ifdef HPREAD_ADJUST_STACK_ADDRESS
SYMBOL_VALUE (sym)
+= HPREAD_ADJUST_STACK_ADDRESS (CURRENT_FUNCTION_VALUE (objfile));
#endif
SYMBOL_TYPE (sym) = hpread_type_lookup (dn_bufp->ddvar.type, objfile);
if (dn_bufp->ddvar.global)
add_symbol_to_list (sym, &global_symbols);
else if (WITHIN_FUNCTION (objfile))
add_symbol_to_list (sym, &local_symbols);
else
add_symbol_to_list (sym, &file_symbols);
break;
case DNTT_TYPE_CONST:
SYMBOL_CLASS (sym) = LOC_CONST;
SYMBOL_VALUE (sym) = dn_bufp->dconst.location;
SYMBOL_TYPE (sym) = hpread_type_lookup (dn_bufp->dconst.type, objfile);
if (dn_bufp->dconst.global)
add_symbol_to_list (sym, &global_symbols);
else if (WITHIN_FUNCTION (objfile))
add_symbol_to_list (sym, &local_symbols);
else
add_symbol_to_list (sym, &file_symbols);
break;
case DNTT_TYPE_TYPEDEF:
SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
SYMBOL_TYPE (sym) = hpread_type_lookup (dn_bufp->dtype.type, objfile);
if (dn_bufp->dtype.global)
add_symbol_to_list (sym, &global_symbols);
else if (WITHIN_FUNCTION (objfile))
add_symbol_to_list (sym, &local_symbols);
else
add_symbol_to_list (sym, &file_symbols);
break;
case DNTT_TYPE_TAGDEF:
SYMBOL_NAMESPACE (sym) = STRUCT_NAMESPACE;
SYMBOL_TYPE (sym) = hpread_type_lookup (dn_bufp->dtype.type, objfile);
TYPE_NAME (sym->type) = SYMBOL_NAME (sym);
TYPE_TAG_NAME (sym->type) = SYMBOL_NAME (sym);
if (dn_bufp->dtype.global)
add_symbol_to_list (sym, &global_symbols);
else if (WITHIN_FUNCTION (objfile))
add_symbol_to_list (sym, &local_symbols);
else
add_symbol_to_list (sym, &file_symbols);
break;
case DNTT_TYPE_POINTER:
SYMBOL_TYPE (sym) = lookup_pointer_type (hpread_type_lookup
(dn_bufp->dptr.pointsto,
objfile));
add_symbol_to_list (sym, &file_symbols);
break;
case DNTT_TYPE_ENUM:
SYMBOL_NAMESPACE (sym) = STRUCT_NAMESPACE;
SYMBOL_TYPE (sym) = hpread_read_enum_type (hp_type, dn_bufp, objfile);
add_symbol_to_list (sym, &file_symbols);
break;
case DNTT_TYPE_MEMENUM:
break;
case DNTT_TYPE_SET:
SYMBOL_TYPE (sym) = hpread_read_set_type (hp_type, dn_bufp, objfile);
add_symbol_to_list (sym, &file_symbols);
break;
case DNTT_TYPE_SUBRANGE:
SYMBOL_TYPE (sym) = hpread_read_subrange_type (hp_type, dn_bufp,
objfile);
add_symbol_to_list (sym, &file_symbols);
break;
case DNTT_TYPE_ARRAY:
SYMBOL_TYPE (sym) = hpread_read_array_type (hp_type, dn_bufp, objfile);
add_symbol_to_list (sym, &file_symbols);
break;
case DNTT_TYPE_STRUCT:
case DNTT_TYPE_UNION:
SYMBOL_NAMESPACE (sym) = STRUCT_NAMESPACE;
SYMBOL_TYPE (sym) = hpread_read_struct_type (hp_type, dn_bufp, objfile);
add_symbol_to_list (sym, &file_symbols);
break;
default:
break;
}
}