/* stabs.c -- Parse COFF debugging information
- Copyright (C) 1996 Free Software Foundation, Inc.
+ Copyright (C) 1996, 98, 99, 2000 Free Software Foundation, Inc.
Written by Ian Lance Taylor <ian@cygnus.com>.
This file is part of GNU Binutils.
static boolean parse_coff_symbol
PARAMS ((bfd *, struct coff_types *, asymbol *, long,
struct internal_syment *, PTR, debug_type, boolean));
+static boolean external_coff_symbol_p PARAMS ((int sym_class));
\f
/* Return the slot for a type. */
NULL, dhandle),
0, n - 1, false);
}
+ else
+ {
+ non_fatal (_("parse_coff_type: Bad type code 0x%x"), ntype);
+ return DEBUG_TYPE_NULL;
+ }
return type;
}
if (! bfd_coff_get_syment (abfd, sym, &syment))
{
- fprintf (stderr, "%s: bfd_coff_get_syment failed: %s\n",
- program_name, bfd_errmsg (bfd_get_error ()));
+ non_fatal (_("bfd_coff_get_syment failed: %s"),
+ bfd_errmsg (bfd_get_error ()));
return DEBUG_TYPE_NULL;
}
{
if (! bfd_coff_get_auxent (abfd, sym, 0, &auxent))
{
- fprintf (stderr, "%s: bfd_coff_get_auxent failed: %s\n",
- program_name, bfd_errmsg (bfd_get_error ()));
+ non_fatal (_("bfd_coff_get_auxent failed: %s"),
+ bfd_errmsg (bfd_get_error ()));
return DEBUG_TYPE_NULL;
}
psubaux = &auxent;
parse_coff_enum_type (abfd, symbols, types, pauxent, dhandle)
bfd *abfd;
struct coff_symbols *symbols;
- struct coff_types *types;
+ struct coff_types *types ATTRIBUTE_UNUSED;
union internal_auxent *pauxent;
PTR dhandle;
{
if (! bfd_coff_get_syment (abfd, sym, &syment))
{
- fprintf (stderr, "%s: bfd_coff_get_syment failed: %s\n",
- program_name, bfd_errmsg (bfd_get_error ()));
+ non_fatal (_("bfd_coff_get_syment failed: %s"),
+ bfd_errmsg (bfd_get_error ()));
return DEBUG_TYPE_NULL;
}
static boolean
parse_coff_symbol (abfd, types, sym, coff_symno, psyment, dhandle, type,
within_function)
- bfd *abfd;
+ bfd *abfd ATTRIBUTE_UNUSED;
struct coff_types *types;
asymbol *sym;
long coff_symno;
return false;
break;
+ case C_WEAKEXT:
case C_EXT:
if (! debug_record_variable (dhandle, bfd_asymbol_name (sym), type,
DEBUG_GLOBAL, bfd_asymbol_value (sym)))
return true;
}
+/* Determine if a symbol has external visibility. */
+
+static boolean
+external_coff_symbol_p (sym_class)
+ int sym_class;
+{
+ switch (sym_class)
+ {
+ case C_EXT:
+ case C_WEAKEXT:
+ return true;
+ default:
+ break;
+ }
+ return false;
+}
+
/* This is the main routine. It looks through all the symbols and
handles them. */
const char *fnname;
int fnclass;
int fntype;
+ bfd_vma fnend;
alent *linenos;
boolean within_function;
long this_coff_symno;
fnname = NULL;
fnclass = 0;
fntype = 0;
+ fnend = 0;
linenos = NULL;
within_function = false;
if (! bfd_coff_get_syment (abfd, sym, &syment))
{
- fprintf (stderr, "%s: bfd_coff_get_syment failed: %s\n",
- program_name, bfd_errmsg (bfd_get_error ()));
+ non_fatal (_("bfd_coff_get_syment failed: %s"),
+ bfd_errmsg (bfd_get_error ()));
return false;
}
{
if (! bfd_coff_get_auxent (abfd, sym, 0, &auxent))
{
- fprintf (stderr, "%s: bfd_coff_get_auxent failed: %s\n",
- program_name, bfd_errmsg (bfd_get_error ()));
+ non_fatal (_("bfd_coff_get_auxent failed: %s"),
+ bfd_errmsg (bfd_get_error ()));
return false;
}
paux = &auxent;
if (syment.n_type == T_NULL)
break;
/* Fall through. */
+ case C_WEAKEXT:
case C_EXT:
if (ISFCN (syment.n_type))
{
fnname = name;
fnclass = syment.n_sclass;
fntype = syment.n_type;
+ if (syment.n_numaux > 0)
+ fnend = bfd_asymbol_value (sym) + auxent.x_sym.x_misc.x_fsize;
+ else
+ fnend = 0;
linenos = BFD_SEND (abfd, _get_lineno, (abfd, sym));
break;
}
{
if (fnname == NULL)
{
- fprintf (stderr, "%s: %ld: .bf without preceding function\n",
- program_name, this_coff_symno);
+ non_fatal (_("%ld: .bf without preceding function"),
+ this_coff_symno);
return false;
}
return false;
if (! debug_record_function (dhandle, fnname, type,
- fnclass == C_EXT,
+ external_coff_symbol_p (fnclass),
bfd_asymbol_value (sym)))
return false;
{
if (! within_function)
{
- fprintf (stderr, "%s: %ld: unexpected .ef\n",
- program_name, this_coff_symno);
+ non_fatal (_("%ld: unexpected .ef\n"), this_coff_symno);
return false;
}
- if (! debug_end_function (dhandle, bfd_asymbol_value (sym)))
+ if (bfd_asymbol_value (sym) > fnend)
+ fnend = bfd_asymbol_value (sym);
+ if (! debug_end_function (dhandle, fnend))
return false;
+ fnend = 0;
within_function = false;
}
break;