/* DWARF debugging format support for GDB.
- Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1998
+ Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+ 2001, 2002
Free Software Foundation, Inc.
Written by Fred Fish at Cygnus Support. Portions based on dbxread.c,
mipsread.c, coffread.c, and dwarfread.c from a Data General SVR4 gdb port.
#define CHILL_PRODUCER "GNU Chill "
#endif
-/* Provide a default mapping from a DWARF register number to a gdb REGNUM. */
-#ifndef DWARF_REG_TO_REGNUM
-#define DWARF_REG_TO_REGNUM(num) (num)
-#endif
-
/* Flags to target_to_host() that tell whether or not the data object is
expected to be signed. Used, for example, when fetching a signed
integer in the target environment which is used as a signed integer
#define AT_short_element_list (0x00f0|FORM_BLOCK2)
-/* External variables referenced. */
-
-extern int info_verbose; /* From main.c; nonzero => verbose */
-extern char *warning_pre_print; /* From utils.c */
-
/* The DWARF debugging information consists of two major pieces,
one is a block of DWARF Information Entries (DIE's) and the other
is a line number table. The "struct dieinfo" structure contains
/* Forward declarations of static functions so we don't have to worry
about ordering within this file. */
-static void
-free_utypes PARAMS ((PTR));
+static void free_utypes (PTR);
-static int
-attribute_size PARAMS ((unsigned int));
+static int attribute_size (unsigned int);
-static CORE_ADDR
- target_to_host PARAMS ((char *, int, int, struct objfile *));
+static CORE_ADDR target_to_host (char *, int, int, struct objfile *);
-static void
-add_enum_psymbol PARAMS ((struct dieinfo *, struct objfile *));
+static void add_enum_psymbol (struct dieinfo *, struct objfile *);
-static void
-handle_producer PARAMS ((char *));
+static void handle_producer (char *);
static void
-read_file_scope PARAMS ((struct dieinfo *, char *, char *, struct objfile *));
+read_file_scope (struct dieinfo *, char *, char *, struct objfile *);
static void
-read_func_scope PARAMS ((struct dieinfo *, char *, char *, struct objfile *));
+read_func_scope (struct dieinfo *, char *, char *, struct objfile *);
static void
-read_lexical_block_scope PARAMS ((struct dieinfo *, char *, char *,
- struct objfile *));
+read_lexical_block_scope (struct dieinfo *, char *, char *, struct objfile *);
-static void
-scan_partial_symbols PARAMS ((char *, char *, struct objfile *));
+static void scan_partial_symbols (char *, char *, struct objfile *);
static void
-scan_compilation_units PARAMS ((char *, char *, file_ptr,
- file_ptr, struct objfile *));
+scan_compilation_units (char *, char *, file_ptr, file_ptr, struct objfile *);
-static void
-add_partial_symbol PARAMS ((struct dieinfo *, struct objfile *));
+static void add_partial_symbol (struct dieinfo *, struct objfile *);
-static void
-basicdieinfo PARAMS ((struct dieinfo *, char *, struct objfile *));
+static void basicdieinfo (struct dieinfo *, char *, struct objfile *);
-static void
-completedieinfo PARAMS ((struct dieinfo *, struct objfile *));
+static void completedieinfo (struct dieinfo *, struct objfile *);
-static void
-dwarf_psymtab_to_symtab PARAMS ((struct partial_symtab *));
+static void dwarf_psymtab_to_symtab (struct partial_symtab *);
-static void
-psymtab_to_symtab_1 PARAMS ((struct partial_symtab *));
+static void psymtab_to_symtab_1 (struct partial_symtab *);
-static void
-read_ofile_symtab PARAMS ((struct partial_symtab *));
+static void read_ofile_symtab (struct partial_symtab *);
-static void
-process_dies PARAMS ((char *, char *, struct objfile *));
+static void process_dies (char *, char *, struct objfile *);
static void
-read_structure_scope PARAMS ((struct dieinfo *, char *, char *,
- struct objfile *));
+read_structure_scope (struct dieinfo *, char *, char *, struct objfile *);
-static struct type *
- decode_array_element_type PARAMS ((char *));
+static struct type *decode_array_element_type (char *);
-static struct type *
- decode_subscript_data_item PARAMS ((char *, char *));
+static struct type *decode_subscript_data_item (char *, char *);
-static void
-dwarf_read_array_type PARAMS ((struct dieinfo *));
+static void dwarf_read_array_type (struct dieinfo *);
-static void
-read_tag_pointer_type PARAMS ((struct dieinfo * dip));
+static void read_tag_pointer_type (struct dieinfo *dip);
-static void
-read_tag_string_type PARAMS ((struct dieinfo * dip));
+static void read_tag_string_type (struct dieinfo *dip);
-static void
-read_subroutine_type PARAMS ((struct dieinfo *, char *, char *));
+static void read_subroutine_type (struct dieinfo *, char *, char *);
static void
-read_enumeration PARAMS ((struct dieinfo *, char *, char *, struct objfile *));
+read_enumeration (struct dieinfo *, char *, char *, struct objfile *);
-static struct type *
- struct_type PARAMS ((struct dieinfo *, char *, char *, struct objfile *));
+static struct type *struct_type (struct dieinfo *, char *, char *,
+ struct objfile *);
-static struct type *
- enum_type PARAMS ((struct dieinfo *, struct objfile *));
+static struct type *enum_type (struct dieinfo *, struct objfile *);
-static void
-decode_line_numbers PARAMS ((char *));
+static void decode_line_numbers (char *);
-static struct type *
- decode_die_type PARAMS ((struct dieinfo *));
+static struct type *decode_die_type (struct dieinfo *);
-static struct type *
- decode_mod_fund_type PARAMS ((char *));
+static struct type *decode_mod_fund_type (char *);
-static struct type *
- decode_mod_u_d_type PARAMS ((char *));
+static struct type *decode_mod_u_d_type (char *);
-static struct type *
- decode_modified_type PARAMS ((char *, unsigned int, int));
+static struct type *decode_modified_type (char *, unsigned int, int);
-static struct type *
- decode_fund_type PARAMS ((unsigned int));
+static struct type *decode_fund_type (unsigned int);
-static char *
- create_name PARAMS ((char *, struct obstack *));
+static char *create_name (char *, struct obstack *);
-static struct type *
- lookup_utype PARAMS ((DIE_REF));
+static struct type *lookup_utype (DIE_REF);
-static struct type *
- alloc_utype PARAMS ((DIE_REF, struct type *));
+static struct type *alloc_utype (DIE_REF, struct type *);
-static struct symbol *
- new_symbol PARAMS ((struct dieinfo *, struct objfile *));
+static struct symbol *new_symbol (struct dieinfo *, struct objfile *);
static void
-synthesize_typedef PARAMS ((struct dieinfo *, struct objfile *,
- struct type *));
+synthesize_typedef (struct dieinfo *, struct objfile *, struct type *);
-static int
-locval PARAMS ((struct dieinfo *));
+static int locval (struct dieinfo *);
-static void
-set_cu_language PARAMS ((struct dieinfo *));
+static void set_cu_language (struct dieinfo *);
-static struct type *
- dwarf_fundamental_type PARAMS ((struct objfile *, int));
+static struct type *dwarf_fundamental_type (struct objfile *, int);
/*
*/
static struct type *
-dwarf_fundamental_type (objfile, typeid)
- struct objfile *objfile;
- int typeid;
+dwarf_fundamental_type (struct objfile *objfile, int typeid)
{
if (typeid < 0 || typeid >= FT_NUM_MEMBERS)
{
*/
static void
-set_cu_language (dip)
- struct dieinfo *dip;
+set_cu_language (struct dieinfo *dip)
{
switch (dip->at_language)
{
SYNOPSIS
void dwarf_build_psymtabs (struct objfile *objfile,
- struct section_offsets *section_offsets,
int mainline, file_ptr dbfoff, unsigned int dbfsize,
file_ptr lnoffset, unsigned int lnsize)
*/
void
-dwarf_build_psymtabs (objfile, section_offsets, mainline, dbfoff, dbfsize,
- lnoffset, lnsize)
- struct objfile *objfile;
- struct section_offsets *section_offsets;
- int mainline;
- file_ptr dbfoff;
- unsigned int dbfsize;
- file_ptr lnoffset;
- unsigned int lnsize;
+dwarf_build_psymtabs (struct objfile *objfile, int mainline, file_ptr dbfoff,
+ unsigned int dbfsize, file_ptr lnoffset,
+ unsigned int lnsize)
{
bfd *abfd = objfile->obfd;
struct cleanup *back_to;
dbbase = xmalloc (dbsize);
dbroff = 0;
if ((bfd_seek (abfd, dbfoff, SEEK_SET) != 0) ||
- (bfd_read (dbbase, dbsize, 1, abfd) != dbsize))
+ (bfd_bread (dbbase, dbsize, abfd) != dbsize))
{
- free (dbbase);
+ xfree (dbbase);
error ("can't read DWARF data from '%s'", bfd_get_filename (abfd));
}
- back_to = make_cleanup (free, dbbase);
+ back_to = make_cleanup (xfree, dbbase);
/* If we are reinitializing, or if we have never loaded syms yet, init.
Since we have no idea how many DIES we are looking at, we just guess
some arbitrary value. */
- if (mainline || objfile->global_psymbols.size == 0 ||
- objfile->static_psymbols.size == 0)
+ if (mainline
+ || (objfile->global_psymbols.size == 0
+ && objfile->static_psymbols.size == 0))
{
init_psymbol_list (objfile, 1024);
}
/* Save the relocation factor where everybody can see it. */
- base_section_offsets = section_offsets;
- baseaddr = ANOFFSET (section_offsets, 0);
+ base_section_offsets = objfile->section_offsets;
+ baseaddr = ANOFFSET (objfile->section_offsets, 0);
/* Follow the compilation unit sibling chain, building a partial symbol
table entry for each one. Save enough information about each compilation
*/
static void
-read_lexical_block_scope (dip, thisdie, enddie, objfile)
- struct dieinfo *dip;
- char *thisdie;
- char *enddie;
- struct objfile *objfile;
+read_lexical_block_scope (struct dieinfo *dip, char *thisdie, char *enddie,
+ struct objfile *objfile)
{
register struct context_stack *new;
*/
static struct type *
-lookup_utype (die_ref)
- DIE_REF die_ref;
+lookup_utype (DIE_REF die_ref)
{
struct type *type = NULL;
int utypeidx;
*/
static struct type *
-alloc_utype (die_ref, utypep)
- DIE_REF die_ref;
- struct type *utypep;
+alloc_utype (DIE_REF die_ref, struct type *utypep)
{
struct type **typep;
int utypeidx;
*/
static void
-free_utypes (dummy)
- PTR dummy;
+free_utypes (PTR dummy)
{
- free (utypes);
+ xfree (utypes);
utypes = NULL;
numutypes = 0;
}
*/
static struct type *
-decode_die_type (dip)
- struct dieinfo *dip;
+decode_die_type (struct dieinfo *dip)
{
struct type *type = NULL;
*/
static struct type *
-struct_type (dip, thisdie, enddie, objfile)
- struct dieinfo *dip;
- char *thisdie;
- char *enddie;
- struct objfile *objfile;
+struct_type (struct dieinfo *dip, char *thisdie, char *enddie,
+ struct objfile *objfile)
{
struct type *type;
struct nextfield
*/
static void
-read_structure_scope (dip, thisdie, enddie, objfile)
- struct dieinfo *dip;
- char *thisdie;
- char *enddie;
- struct objfile *objfile;
+read_structure_scope (struct dieinfo *dip, char *thisdie, char *enddie,
+ struct objfile *objfile)
{
struct type *type;
struct symbol *sym;
type = struct_type (dip, thisdie, enddie, objfile);
- if (!(TYPE_FLAGS (type) & TYPE_FLAG_STUB))
+ if (!TYPE_STUB (type))
{
sym = new_symbol (dip, objfile);
if (sym != NULL)
*/
static struct type *
-decode_array_element_type (scan)
- char *scan;
+decode_array_element_type (char *scan)
{
struct type *typep;
DIE_REF die_ref;
*/
static struct type *
-decode_subscript_data_item (scan, end)
- char *scan;
- char *end;
+decode_subscript_data_item (char *scan, char *end)
{
struct type *typep = NULL; /* Array type we are building */
struct type *nexttype; /* Type of each element (may be array) */
*/
static void
-dwarf_read_array_type (dip)
- struct dieinfo *dip;
+dwarf_read_array_type (struct dieinfo *dip)
{
struct type *type;
struct type *utype;
*/
static void
-read_tag_pointer_type (dip)
- struct dieinfo *dip;
+read_tag_pointer_type (struct dieinfo *dip)
{
struct type *type;
struct type *utype;
*/
static void
-read_tag_string_type (dip)
- struct dieinfo *dip;
+read_tag_string_type (struct dieinfo *dip)
{
struct type *utype;
struct type *indextype;
*/
static void
-read_subroutine_type (dip, thisdie, enddie)
- struct dieinfo *dip;
- char *thisdie;
- char *enddie;
+read_subroutine_type (struct dieinfo *dip, char *thisdie, char *enddie)
{
struct type *type; /* Type that this function returns */
struct type *ftype; /* Function that returns above type */
*/
static void
-read_enumeration (dip, thisdie, enddie, objfile)
- struct dieinfo *dip;
- char *thisdie;
- char *enddie;
- struct objfile *objfile;
+read_enumeration (struct dieinfo *dip, char *thisdie, char *enddie,
+ struct objfile *objfile)
{
struct type *type;
struct symbol *sym;
*/
static struct type *
-enum_type (dip, objfile)
- struct dieinfo *dip;
- struct objfile *objfile;
+enum_type (struct dieinfo *dip, struct objfile *objfile)
{
struct type *type;
struct nextfield
*/
static void
-read_func_scope (dip, thisdie, enddie, objfile)
- struct dieinfo *dip;
- char *thisdie;
- char *enddie;
- struct objfile *objfile;
+read_func_scope (struct dieinfo *dip, char *thisdie, char *enddie,
+ struct objfile *objfile)
{
register struct context_stack *new;
objfile->ei.entry_func_lowpc = dip->at_low_pc;
objfile->ei.entry_func_highpc = dip->at_high_pc;
}
- if (STREQ (dip->at_name, "main")) /* FIXME: hardwired name */
- {
- objfile->ei.main_func_lowpc = dip->at_low_pc;
- objfile->ei.main_func_highpc = dip->at_high_pc;
- }
new = push_context (0, dip->at_low_pc);
new->name = new_symbol (dip, objfile);
list_in_scope = &local_symbols;
*/
static void
-handle_producer (producer)
- char *producer;
+handle_producer (char *producer)
{
/* If this compilation unit was compiled with g++ or gcc, then set the
{
if (STREQN (producer, GPLUS_PRODUCER, strlen (GPLUS_PRODUCER)))
{
+#if 0
+ /* For now, stay with AUTO_DEMANGLING for g++ output, as we don't
+ know whether it will use the old style or v3 mangling. */
set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
+#endif
}
else if (STREQN (producer, LCC_PRODUCER, strlen (LCC_PRODUCER)))
{
*/
static void
-read_file_scope (dip, thisdie, enddie, objfile)
- struct dieinfo *dip;
- char *thisdie;
- char *enddie;
- struct objfile *objfile;
+read_file_scope (struct dieinfo *dip, char *thisdie, char *enddie,
+ struct objfile *objfile)
{
struct cleanup *back_to;
struct symtab *symtab;
*/
static void
-process_dies (thisdie, enddie, objfile)
- char *thisdie;
- char *enddie;
- struct objfile *objfile;
+process_dies (char *thisdie, char *enddie, struct objfile *objfile)
{
char *nextdie;
struct dieinfo di;
{
nextdie = thisdie + di.die_length;
}
-#ifdef SMASH_TEXT_ADDRESS
/* I think that these are always text, not data, addresses. */
- SMASH_TEXT_ADDRESS (di.at_low_pc);
- SMASH_TEXT_ADDRESS (di.at_high_pc);
-#endif
+ di.at_low_pc = SMASH_TEXT_ADDRESS (di.at_low_pc);
+ di.at_high_pc = SMASH_TEXT_ADDRESS (di.at_high_pc);
switch (di.die_tag)
{
case TAG_compile_unit:
*/
static void
-decode_line_numbers (linetable)
- char *linetable;
+decode_line_numbers (char *linetable)
{
char *tblscan;
char *tblend;
*/
static int
-locval (dip)
- struct dieinfo *dip;
+locval (struct dieinfo *dip)
{
unsigned short nbytes;
unsigned short locsize;
*/
static void
-read_ofile_symtab (pst)
- struct partial_symtab *pst;
+read_ofile_symtab (struct partial_symtab *pst)
{
struct cleanup *back_to;
unsigned long lnsize;
base_section_offsets = pst->section_offsets;
baseaddr = ANOFFSET (pst->section_offsets, 0);
if (bfd_seek (abfd, foffset, SEEK_SET) ||
- (bfd_read (dbbase, dbsize, 1, abfd) != dbsize))
+ (bfd_bread (dbbase, dbsize, abfd) != dbsize))
{
- free (dbbase);
+ xfree (dbbase);
error ("can't read DWARF data");
}
- back_to = make_cleanup (free, dbbase);
+ back_to = make_cleanup (xfree, dbbase);
/* If there is a line number table associated with this compilation unit
then read the size of this fragment in bytes, from the fragment itself.
if (LNFOFF (pst))
{
if (bfd_seek (abfd, LNFOFF (pst), SEEK_SET) ||
- (bfd_read ((PTR) lnsizedata, sizeof (lnsizedata), 1, abfd) !=
- sizeof (lnsizedata)))
+ (bfd_bread ((PTR) lnsizedata, sizeof (lnsizedata), abfd)
+ != sizeof (lnsizedata)))
{
error ("can't read DWARF line number table size");
}
GET_UNSIGNED, pst->objfile);
lnbase = xmalloc (lnsize);
if (bfd_seek (abfd, LNFOFF (pst), SEEK_SET) ||
- (bfd_read (lnbase, lnsize, 1, abfd) != lnsize))
+ (bfd_bread (lnbase, lnsize, abfd) != lnsize))
{
- free (lnbase);
+ xfree (lnbase);
error ("can't read DWARF line numbers");
}
- make_cleanup (free, lnbase);
+ make_cleanup (xfree, lnbase);
}
process_dies (dbbase, dbbase + dbsize, pst->objfile);
*/
static void
-psymtab_to_symtab_1 (pst)
- struct partial_symtab *pst;
+psymtab_to_symtab_1 (struct partial_symtab *pst)
{
int i;
struct cleanup *old_chain;
if (DBLENGTH (pst)) /* Otherwise it's a dummy */
{
buildsym_init ();
- old_chain = make_cleanup ((make_cleanup_func)
- really_free_pendings, 0);
+ old_chain = make_cleanup (really_free_pendings, 0);
read_ofile_symtab (pst);
if (info_verbose)
{
*/
static void
-dwarf_psymtab_to_symtab (pst)
- struct partial_symtab *pst;
+dwarf_psymtab_to_symtab (struct partial_symtab *pst)
{
if (pst != NULL)
*/
static void
-add_enum_psymbol (dip, objfile)
- struct dieinfo *dip;
- struct objfile *objfile;
+add_enum_psymbol (struct dieinfo *dip, struct objfile *objfile)
{
char *scan;
char *listend;
*/
static void
-add_partial_symbol (dip, objfile)
- struct dieinfo *dip;
- struct objfile *objfile;
+add_partial_symbol (struct dieinfo *dip, struct objfile *objfile)
{
switch (dip->die_tag)
{
static void
-scan_partial_symbols (thisdie, enddie, objfile)
- char *thisdie;
- char *enddie;
- struct objfile *objfile;
+scan_partial_symbols (char *thisdie, char *enddie, struct objfile *objfile)
{
char *nextdie;
char *temp;
*/
static void
-scan_compilation_units (thisdie, enddie, dbfoff, lnoffset, objfile)
- char *thisdie;
- char *enddie;
- file_ptr dbfoff;
- file_ptr lnoffset;
- struct objfile *objfile;
+scan_compilation_units (char *thisdie, char *enddie, file_ptr dbfoff,
+ file_ptr lnoffset, struct objfile *objfile)
{
char *nextdie;
struct dieinfo di;
*/
static struct symbol *
-new_symbol (dip, objfile)
- struct dieinfo *dip;
- struct objfile *objfile;
+new_symbol (struct dieinfo *dip, struct objfile *objfile)
{
struct symbol *sym = NULL;
*/
static void
-synthesize_typedef (dip, objfile, type)
- struct dieinfo *dip;
- struct objfile *objfile;
- struct type *type;
+synthesize_typedef (struct dieinfo *dip, struct objfile *objfile,
+ struct type *type)
{
struct symbol *sym = NULL;
*/
static struct type *
-decode_mod_fund_type (typedata)
- char *typedata;
+decode_mod_fund_type (char *typedata)
{
struct type *typep = NULL;
unsigned short modcount;
*/
static struct type *
-decode_mod_u_d_type (typedata)
- char *typedata;
+decode_mod_u_d_type (char *typedata)
{
struct type *typep = NULL;
unsigned short modcount;
*/
static struct type *
-decode_modified_type (modifiers, modcount, mtype)
- char *modifiers;
- unsigned int modcount;
- int mtype;
+decode_modified_type (char *modifiers, unsigned int modcount, int mtype)
{
struct type *typep = NULL;
unsigned short fundtype;
*/
static struct type *
-decode_fund_type (fundtype)
- unsigned int fundtype;
+decode_fund_type (unsigned int fundtype)
{
struct type *typep = NULL;
*/
static char *
-create_name (name, obstackp)
- char *name;
- struct obstack *obstackp;
+create_name (char *name, struct obstack *obstackp)
{
int length;
char *newname;
*/
static void
-basicdieinfo (dip, diep, objfile)
- struct dieinfo *dip;
- char *diep;
- struct objfile *objfile;
+basicdieinfo (struct dieinfo *dip, char *diep, struct objfile *objfile)
{
curdie = dip;
memset (dip, 0, sizeof (struct dieinfo));
*/
static void
-completedieinfo (dip, objfile)
- struct dieinfo *dip;
- struct objfile *objfile;
+completedieinfo (struct dieinfo *dip, struct objfile *objfile)
{
char *diep; /* Current pointer into raw DIE data */
char *end; /* Terminate DIE scan here */
*/
static CORE_ADDR
-target_to_host (from, nbytes, signextend, objfile)
- char *from;
- int nbytes;
- int signextend; /* FIXME: Unused */
- struct objfile *objfile;
+target_to_host (char *from, int nbytes, int signextend, /* FIXME: Unused */
+ struct objfile *objfile)
{
CORE_ADDR rtnval;
*/
static int
-attribute_size (attr)
- unsigned int attr;
+attribute_size (unsigned int attr)
{
int nbytes; /* Size of next data for this attribute */
unsigned short form; /* Form of the attribute */