/* DWARF debugging format support for GDB.
- Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
- 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+ Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+ 2001, 2002, 2003, 2004, 2007 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.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA. */
/*
If you are looking for DWARF-2 support, you are in the wrong file.
- Go look in dwarf2read.c. This file is for the original DWARF.
-
- DWARF (also known as DWARF-1) is headed for obsoletion.
-
- In gcc 3.2.1, these targets prefer dwarf-1:
-
- i[34567]86-sequent-ptx4* # TD-R2
- i[34567]86-sequent-sysv4* # TD-R2
- i[34567]86-dg-dgux* # obsolete in gcc 3.2.1, to be removed in 3.3
- m88k-dg-dgux* # TD-R2
- mips-sni-sysv4 # TD-R2
- sparc-hal-solaris2* # TD-R2
-
- Configurations marked with "# TD-R2" are on Zach Weinberg's list
- of "Target Deprecation, Round 2". This is a candidate list of
- targets to be deprecated in gcc 3.3 and removed in gcc 3.4.
-
- http://gcc.gnu.org/ml/gcc/2002-12/msg00702.html
-
- gcc 2.95.3 had many configurations which prefer dwarf-1.
- We may have to support dwarf-1 as long as we support gcc 2.95.3.
- This could use more analysis.
-
- DG/UX (Data General Unix) used dwarf-1 for its native format.
- DG/UX uses gcc for its system C compiler, but they have their
- own linker and their own debuggers.
-
- Takis Psarogiannakopoulos has a complete gnu toolchain for DG/UX
- with gcc 2.95.3, gdb 5.1, and debug formats of dwarf-2 and stabs.
- For more info, see PR gdb/979 and PR gdb/1013; also:
-
- http://sources.redhat.com/ml/gdb/2003-02/msg00074.html
-
- There may be non-gcc compilers that still emit dwarf-1.
-
- -- chastain 2003-02-04
+ Go look in dwarf2read.c. This file is for the original DWARF,
+ also known as DWARF-1.
+
+ DWARF-1 is slowly headed for obsoletion.
+
+ In gcc 3.4.0, support for dwarf-1 has been removed.
+
+ In gcc 3.3.2, these targets prefer dwarf-1:
+
+ i[34567]86-sequent-ptx4*
+ i[34567]86-sequent-sysv4*
+ mips-sni-sysv4
+ sparc-hal-solaris2*
+
+ In gcc 3.2.2, these targets prefer dwarf-1:
+
+ i[34567]86-dg-dgux*
+ i[34567]86-sequent-ptx4*
+ i[34567]86-sequent-sysv4*
+ m88k-dg-dgux*
+ mips-sni-sysv4
+ sparc-hal-solaris2*
+
+ In gcc 2.95.3, these targets prefer dwarf-1:
+
+ i[34567]86-dg-dgux*
+ i[34567]86-ncr-sysv4*
+ i[34567]86-sequent-ptx4*
+ i[34567]86-sequent-sysv4*
+ i[34567]86-*-osf1*
+ i[34567]86-*-sco3.2v5*
+ i[34567]86-*-sysv4*
+ i860-alliant-*
+ i860-*-sysv4*
+ m68k-atari-sysv4*
+ m68k-cbm-sysv4*
+ m68k-*-sysv4*
+ m88k-dg-dgux*
+ m88k-*-sysv4*
+ mips-sni-sysv4
+ mips-*-gnu*
+ sh-*-elf*
+ sh-*-rtemself*
+ sparc-hal-solaris2*
+ sparc-*-sysv4*
+
+ Some non-gcc compilers produce dwarf-1:
+
+ PR gdb/1179 was from a user with Diab C++ 4.3.
+ On 2003-07-25 the gdb list received a report from a user
+ with Diab Compiler 4.4b.
+ Other users have also reported using Diab compilers with dwarf-1.
+
+ Diab Compiler Suite 5.0.1 supports dwarf-2/dwarf-3 for C and C++.
+ (Diab(tm) Compiler Suite 5.0.1 Release Notes, DOC-14691-ZD-00,
+ Wind River Systems, 2002-07-31).
+
+ On 2003-06-09 the gdb list received a report from a user
+ with Absoft ProFortran f77 which is dwarf-1.
+
+ Absoft ProFortran Linux[sic] Fortran User Guide (no version,
+ but copyright dates are 1991-2001) says that Absoft ProFortran
+ supports -gdwarf1 and -gdwarf2.
+
+ -- chastain 2004-04-24
*/
/*
#include "defs.h"
#include "symtab.h"
#include "gdbtypes.h"
-#include "symfile.h"
#include "objfiles.h"
#include "elf/dwarf.h"
#include "buildsym.h"
bad_die_ref_complaint (int arg1, const char *arg2, int arg3)
{
complaint (&symfile_complaints,
- "DIE @ 0x%x \"%s\", reference to DIE (0x%x) outside compilation unit",
+ _("DIE @ 0x%x \"%s\", reference to DIE (0x%x) outside compilation unit"),
arg1, arg2, arg3);
}
unknown_attribute_form_complaint (int arg1, const char *arg2, int arg3)
{
complaint (&symfile_complaints,
- "DIE @ 0x%x \"%s\", unknown attribute form (0x%x)", arg1, arg2,
+ _("DIE @ 0x%x \"%s\", unknown attribute form (0x%x)"), arg1, arg2,
arg3);
}
dup_user_type_definition_complaint (int arg1, const char *arg2)
{
complaint (&symfile_complaints,
- "DIE @ 0x%x \"%s\", internal error: duplicate user type definition",
+ _("DIE @ 0x%x \"%s\", internal error: duplicate user type definition"),
arg1, arg2);
}
bad_array_element_type_complaint (int arg1, const char *arg2, int arg3)
{
complaint (&symfile_complaints,
- "DIE @ 0x%x \"%s\", bad array element type attribute 0x%x", arg1,
+ _("DIE @ 0x%x \"%s\", bad array element type attribute 0x%x"), arg1,
arg2, arg3);
}
{
if (typeid < 0 || typeid >= FT_NUM_MEMBERS)
{
- error ("internal error - invalid fundamental type id %d", typeid);
+ error (_("internal error - invalid fundamental type id %d"), typeid);
}
/* Look for this particular type in the fundamental type vector. If one is
case LANG_FORTRAN90:
cu_language = language_fortran;
break;
+ case LANG_PASCAL83:
+ cu_language = language_pascal;
+ break;
case LANG_ADA83:
case LANG_COBOL74:
case LANG_COBOL85:
- case LANG_PASCAL83:
/* We don't know anything special about these yet. */
cu_language = language_unknown;
break;
(bfd_bread (dbbase, dbsize, abfd) != dbsize))
{
xfree (dbbase);
- error ("can't read DWARF data from '%s'", bfd_get_filename (abfd));
+ error (_("can't read DWARF data from '%s'"), bfd_get_filename (abfd));
}
back_to = make_cleanup (xfree, dbbase);
{
utypep = *typep;
complaint (&symfile_complaints,
- "DIE @ 0x%x \"%s\", internal error: duplicate user type allocation",
+ _("DIE @ 0x%x \"%s\", internal error: duplicate user type allocation"),
DIE_ID, DIE_NAME);
}
else
/* Should never happen */
TYPE_CODE (type) = TYPE_CODE_UNDEF;
complaint (&symfile_complaints,
- "DIE @ 0x%x \"%s\", missing class, structure, or union tag",
+ _("DIE @ 0x%x \"%s\", missing class, structure, or union tag"),
DIE_ID, DIE_NAME);
break;
}
&& *dip->at_name != '~'
&& *dip->at_name != '.')
{
- TYPE_TAG_NAME (type) = obconcat (&objfile->type_obstack,
+ TYPE_TAG_NAME (type) = obconcat (&objfile->objfile_obstack,
"", "", dip->at_name);
}
/* Use whatever size is known. Zero is a valid size. We might however
/* Save the data. */
list->field.name =
obsavestring (mbr.at_name, strlen (mbr.at_name),
- &objfile->type_obstack);
+ &objfile->objfile_obstack);
FIELD_TYPE (list->field) = decode_die_type (&mbr);
FIELD_BITPOS (list->field) = 8 * locval (&mbr);
FIELD_STATIC_KIND (list->field) = 0;
{
/* Munged subscript data or other problem, fake it. */
complaint (&symfile_complaints,
- "DIE @ 0x%x \"%s\", can't decode subscript data items",
+ _("DIE @ 0x%x \"%s\", can't decode subscript data items"),
DIE_ID, DIE_NAME);
nexttype = dwarf_fundamental_type (current_objfile, FT_INTEGER);
}
case FMT_UT_X_C:
case FMT_UT_X_X:
complaint (&symfile_complaints,
- "DIE @ 0x%x \"%s\", array subscript format 0x%x not handled yet",
+ _("DIE @ 0x%x \"%s\", array subscript format 0x%x not handled yet"),
DIE_ID, DIE_NAME, format);
nexttype = dwarf_fundamental_type (current_objfile, FT_INTEGER);
rangetype = create_range_type ((struct type *) NULL, nexttype, 0, 0);
break;
default:
complaint (&symfile_complaints,
- "DIE @ 0x%x \"%s\", unknown array subscript format %x", DIE_ID,
+ _("DIE @ 0x%x \"%s\", unknown array subscript format %x"), DIE_ID,
DIE_NAME, format);
nexttype = dwarf_fundamental_type (current_objfile, FT_INTEGER);
rangetype = create_range_type ((struct type *) NULL, nexttype, 0, 0);
{
/* FIXME: Can gdb even handle column major arrays? */
complaint (&symfile_complaints,
- "DIE @ 0x%x \"%s\", array not row major; not handled correctly",
+ _("DIE @ 0x%x \"%s\", array not row major; not handled correctly"),
DIE_ID, DIE_NAME);
}
sub = dip->at_subscr_data;
&& *dip->at_name != '~'
&& *dip->at_name != '.')
{
- TYPE_TAG_NAME (type) = obconcat (&objfile->type_obstack,
+ TYPE_TAG_NAME (type) = obconcat (&objfile->objfile_obstack,
"", "", dip->at_name);
}
if (dip->at_byte_size != 0)
objfile);
scan += TARGET_FT_LONG_SIZE (objfile);
list->field.name = obsavestring (scan, strlen (scan),
- &objfile->type_obstack);
+ &objfile->objfile_obstack);
scan += strlen (scan) + 1;
nfields++;
/* Handcraft a new symbol for this enum member. */
- sym = (struct symbol *) obstack_alloc (&objfile->symbol_obstack,
+ sym = (struct symbol *) obstack_alloc (&objfile->objfile_obstack,
sizeof (struct symbol));
memset (sym, 0, sizeof (struct symbol));
DEPRECATED_SYMBOL_NAME (sym) = create_name (list->field.name,
- &objfile->symbol_obstack);
+ &objfile->objfile_obstack);
SYMBOL_INIT_LANGUAGE_SPECIFIC (sym, cu_language);
SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
SYMBOL_CLASS (sym) = LOC_CONST;
TYPE_FLAGS (type) |= TYPE_FLAG_UNSIGNED;
TYPE_NFIELDS (type) = nfields;
TYPE_FIELDS (type) = (struct field *)
- obstack_alloc (&objfile->symbol_obstack, sizeof (struct field) * nfields);
+ obstack_alloc (&objfile->objfile_obstack, sizeof (struct field) * nfields);
/* Copy the saved-up fields into the field vector. */
for (n = 0; (n < nfields) && (list != NULL); list = list->next)
{
FIXME: Add code to handle AT_abstract_origin tags properly. */
if (dip->at_name == NULL)
{
- complaint (&symfile_complaints, "DIE @ 0x%x, AT_name tag missing",
+ complaint (&symfile_complaints, _("DIE @ 0x%x, AT_name tag missing"),
DIE_ID);
return;
}
- if (objfile->ei.entry_point >= dip->at_low_pc &&
- objfile->ei.entry_point < dip->at_high_pc)
- {
- objfile->ei.entry_func_lowpc = dip->at_low_pc;
- objfile->ei.entry_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;
/* If this compilation unit was compiled with g++ or gcc, then set the
processing_gcc_compilation flag. */
- if (STREQN (producer, GCC_PRODUCER, strlen (GCC_PRODUCER)))
+ if (DEPRECATED_STREQN (producer, GCC_PRODUCER, strlen (GCC_PRODUCER)))
{
char version = producer[strlen (GCC_PRODUCER)];
processing_gcc_compilation = (version == '2' ? 2 : 1);
else
{
processing_gcc_compilation =
- STREQN (producer, GPLUS_PRODUCER, strlen (GPLUS_PRODUCER));
+ strncmp (producer, GPLUS_PRODUCER, strlen (GPLUS_PRODUCER)) == 0;
}
/* Select a demangling style if we can identify the producer and if
if (AUTO_DEMANGLING)
{
- if (STREQN (producer, GPLUS_PRODUCER, strlen (GPLUS_PRODUCER)))
+ if (DEPRECATED_STREQN (producer, GPLUS_PRODUCER, strlen (GPLUS_PRODUCER)))
{
#if 0
/* For now, stay with AUTO_DEMANGLING for g++ output, as we don't
set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
#endif
}
- else if (STREQN (producer, LCC_PRODUCER, strlen (LCC_PRODUCER)))
+ else if (DEPRECATED_STREQN (producer, LCC_PRODUCER, strlen (LCC_PRODUCER)))
{
set_demangling_style (LUCID_DEMANGLING_STYLE_STRING);
}
struct cleanup *back_to;
struct symtab *symtab;
- if (objfile->ei.entry_point >= dip->at_low_pc &&
- objfile->ei.entry_point < dip->at_high_pc)
- {
- objfile->ei.entry_file_lowpc = dip->at_low_pc;
- objfile->ei.entry_file_highpc = dip->at_high_pc;
- }
set_cu_language (dip);
if (dip->at_producer != NULL)
{
case OP_DEREF2:
/* pop, deref and push 2 bytes (as a long) */
complaint (&symfile_complaints,
- "DIE @ 0x%x \"%s\", OP_DEREF2 address 0x%lx not handled",
+ _("DIE @ 0x%x \"%s\", OP_DEREF2 address 0x%lx not handled"),
DIE_ID, DIE_NAME, stack[stacki]);
break;
case OP_DEREF4: /* pop, deref and push 4 bytes (as a long) */
complaint (&symfile_complaints,
- "DIE @ 0x%x \"%s\", OP_DEREF4 address 0x%lx not handled",
+ _("DIE @ 0x%x \"%s\", OP_DEREF4 address 0x%lx not handled"),
DIE_ID, DIE_NAME, stack[stacki]);
break;
case OP_ADD: /* pop top 2 items, add, push result */
(bfd_bread (dbbase, dbsize, abfd) != dbsize))
{
xfree (dbbase);
- error ("can't read DWARF data");
+ error (_("can't read DWARF data"));
}
back_to = make_cleanup (xfree, dbbase);
(bfd_bread (lnsizedata, sizeof (lnsizedata), abfd)
!= sizeof (lnsizedata)))
{
- error ("can't read DWARF line number table size");
+ error (_("can't read DWARF line number table size"));
}
lnsize = target_to_host (lnsizedata, SIZEOF_LINETBL_LENGTH,
GET_UNSIGNED, pst->objfile);
(bfd_bread (lnbase, lnsize, abfd) != lnsize))
{
xfree (lnbase);
- error ("can't read DWARF line numbers");
+ error (_("can't read DWARF line numbers"));
}
make_cleanup (xfree, lnbase);
}
{
if (pst->readin)
{
- warning ("psymtab for %s already read in. Shouldn't happen.",
+ warning (_("psymtab for %s already read in. Shouldn't happen."),
pst->filename);
}
else
/* Inform about additional files that need to be read in. */
if (info_verbose)
{
+ /* FIXME: i18n: Need to make this a single
+ string. */
fputs_filtered (" ", gdb_stdout);
wrap_here ("");
fputs_filtered ("and ", gdb_stdout);
read_ofile_symtab (pst);
if (info_verbose)
{
- printf_filtered ("%d DIE's, sorting...", diecount);
+ printf_filtered (_("%d DIE's, sorting..."), diecount);
wrap_here ("");
gdb_flush (gdb_stdout);
}
{
if (pst->readin)
{
- warning ("psymtab for %s already read in. Shouldn't happen.",
+ warning (_("psymtab for %s already read in. Shouldn't happen."),
pst->filename);
}
else
disconcerting pauses. */
if (info_verbose)
{
- printf_filtered ("Reading in symbols for %s...",
+ printf_filtered (_("Reading in symbols for %s..."),
pst->filename);
gdb_flush (gdb_stdout);
}
/* Finish up the verbose info message. */
if (info_verbose)
{
- printf_filtered ("done.\n");
+ printf_filtered (_("done.\n"));
gdb_flush (gdb_stdout);
}
}
pst->texthigh = di.at_high_pc;
pst->read_symtab_private = (char *)
- obstack_alloc (&objfile->psymbol_obstack,
+ obstack_alloc (&objfile->objfile_obstack,
sizeof (struct dwfinfo));
DBFOFF (pst) = dbfoff;
DBROFF (pst) = curoff;
if (dip->at_name != NULL)
{
- sym = (struct symbol *) obstack_alloc (&objfile->symbol_obstack,
+ sym = (struct symbol *) obstack_alloc (&objfile->objfile_obstack,
sizeof (struct symbol));
OBJSTAT (objfile, n_syms++);
memset (sym, 0, sizeof (struct symbol));
if (dip->at_name != NULL)
{
sym = (struct symbol *)
- obstack_alloc (&objfile->symbol_obstack, sizeof (struct symbol));
+ obstack_alloc (&objfile->objfile_obstack, sizeof (struct symbol));
OBJSTAT (objfile, n_syms++);
memset (sym, 0, sizeof (struct symbol));
DEPRECATED_SYMBOL_NAME (sym) = create_name (dip->at_name,
- &objfile->symbol_obstack);
+ &objfile->objfile_obstack);
SYMBOL_INIT_LANGUAGE_SPECIFIC (sym, cu_language);
SYMBOL_TYPE (sym) = type;
SYMBOL_CLASS (sym) = LOC_TYPEDEF;
break;
default:
complaint (&symfile_complaints,
- "DIE @ 0x%x \"%s\", botched modified type decoding (mtype 0x%x)",
+ _("DIE @ 0x%x \"%s\", botched modified type decoding (mtype 0x%x)"),
DIE_ID, DIE_NAME, mtype);
typep = dwarf_fundamental_type (current_objfile, FT_INTEGER);
break;
break;
case MOD_const:
complaint (&symfile_complaints,
- "DIE @ 0x%x \"%s\", type modifier 'const' ignored", DIE_ID,
+ _("DIE @ 0x%x \"%s\", type modifier 'const' ignored"), DIE_ID,
DIE_NAME); /* FIXME */
break;
case MOD_volatile:
complaint (&symfile_complaints,
- "DIE @ 0x%x \"%s\", type modifier 'volatile' ignored",
+ _("DIE @ 0x%x \"%s\", type modifier 'volatile' ignored"),
DIE_ID, DIE_NAME); /* FIXME */
break;
default:
- if (!(MOD_lo_user <= (unsigned char) modifier
+ if (!(MOD_lo_user <= (unsigned char) modifier))
+#if 0
+/* This part of the test would always be true, and it triggers a compiler
+ warning. */
&& (unsigned char) modifier <= MOD_hi_user))
+#endif
{
complaint (&symfile_complaints,
- "DIE @ 0x%x \"%s\", unknown type modifier %u", DIE_ID,
+ _("DIE @ 0x%x \"%s\", unknown type modifier %u"), DIE_ID,
DIE_NAME, modifier);
}
break;
if (!(FT_lo_user <= fundtype && fundtype <= FT_hi_user))
{
complaint (&symfile_complaints,
- "DIE @ 0x%x \"%s\", unexpected fundamental type 0x%x",
+ _("DIE @ 0x%x \"%s\", unexpected fundamental type 0x%x"),
DIE_ID, DIE_NAME, fundtype);
}
}
((diep + dip->die_length) > (dbbase + dbsize)))
{
complaint (&symfile_complaints,
- "DIE @ 0x%x \"%s\", malformed DIE, bad length (%ld bytes)",
+ _("DIE @ 0x%x \"%s\", malformed DIE, bad length (%ld bytes)"),
DIE_ID, DIE_NAME, dip->die_length);
dip->die_length = 0;
}
if (nbytes == -1)
{
complaint (&symfile_complaints,
- "DIE @ 0x%x \"%s\", unknown attribute length, skipped remaining attributes",
+ _("DIE @ 0x%x \"%s\", unknown attribute length, skipped remaining attributes"),
DIE_ID, DIE_NAME);
diep = end;
continue;
break;
default:
complaint (&symfile_complaints,
- "DIE @ 0x%x \"%s\", no bfd support for %d byte data object",
+ _("DIE @ 0x%x \"%s\", no bfd support for %d byte data object"),
DIE_ID, DIE_NAME, nbytes);
rtnval = 0;
break;