* complaints.c: New file, code moved from utils.c.

* complaints.c (complain):  Made into a varargs function.
	* complaints.h:  New file, code moved from symfile.h.
	* Makefile.in (SFILES_MAINDIR):  Add complaints.c.
	* Makefile.in (HFILES):  Add complaints.h.
	* Makefile.in (OBS):  Add complaints.o.
	* symfile.c (complaint_root, stop_whining, complaint_series,
	complain, clear_complaints, add_show_from_set for stop_whining):
	Moved to complaints.c.
	* symfile.h (struct complaint, complaint_root decl, complain
	prototype, clear_complaints prototype):  Moved to complaints.h.
	* buildsym.c, coffread.c, dbxread.c, dwarfread.c, elfread.c,
	gdbtypes.c, mipsread.c, stbsread.c, symfile.c:  Include
	complaints.h.  Remove casts from arguments to complain(),
	which is now a varargs function, and remove unnecessary
	placeholder zero args.
	* defs.h (begin_line):  Add prototype.
	* defs.h (vprintf_filtered):  Add prototype.
	* dwarfread.c (varargs.h):  Remove, no longer needed.
	* dwarfread.c (dwarfwarn):  Remove prototype and function.
	* dwarfread.c (complaints):  Define a bunch of complaints.
	* dwarfread.c (SQUAWK):  Remove macro defs, convert all
	usages to standard complain() calls.
	* utils.c (begin_line):  New function that ensures that
	whatever gets filter-printed next starts on its own line.
	* utils.c (vprintf_filtered):  New func, like vfprintf_filtered,
	but to stdout (calls vfprintf_filtered internally).
This commit is contained in:
Fred Fish 1992-12-15 12:18:53 +00:00
parent 631f7a9f7c
commit 51b80b0072
19 changed files with 533 additions and 499 deletions

View File

@ -61,6 +61,8 @@ call-cmds.h
coffread.c
command.c
command.h
complaints.c
complaints.h
config
configure.in
convex-pinsn.c

View File

@ -1,3 +1,33 @@
Tue Dec 15 04:14:24 1992 Fred Fish (fnf@cygnus.com)
* complaints.c: New file, code moved from utils.c.
* complaints.c (complain): Made into a varargs function.
* complaints.h: New file, code moved from symfile.h.
* Makefile.in (SFILES_MAINDIR): Add complaints.c.
* Makefile.in (HFILES): Add complaints.h.
* Makefile.in (OBS): Add complaints.o.
* symfile.c (complaint_root, stop_whining, complaint_series,
complain, clear_complaints, add_show_from_set for stop_whining):
Moved to complaints.c.
* symfile.h (struct complaint, complaint_root decl, complain
prototype, clear_complaints prototype): Moved to complaints.h.
* buildsym.c, coffread.c, dbxread.c, dwarfread.c, elfread.c,
gdbtypes.c, mipsread.c, stbsread.c, symfile.c: Include
complaints.h. Remove casts from arguments to complain(),
which is now a varargs function, and remove unnecessary
placeholder zero args.
* defs.h (begin_line): Add prototype.
* defs.h (vprintf_filtered): Add prototype.
* dwarfread.c (varargs.h): Remove, no longer needed.
* dwarfread.c (dwarfwarn): Remove prototype and function.
* dwarfread.c (complaints): Define a bunch of complaints.
* dwarfread.c (SQUAWK): Remove macro defs, convert all
usages to standard complain() calls.
* utils.c (begin_line): New function that ensures that
whatever gets filter-printed next starts on its own line.
* utils.c (vprintf_filtered): New func, like vfprintf_filtered,
but to stdout (calls vfprintf_filtered internally).
Tue Dec 15 02:01:00 1992 John Gilmore (gnu@cygnus.com)
* remote.c: Avoid printf_filtered line limit. Suggested by

View File

@ -201,7 +201,8 @@ SFILES_MAINDIR = \
mem-break.c target.c \
dbxread.c coffread.c elfread.c dwarfread.c xcoffread.c stabsread.c \
ieee-float.c language.c parse.c buildsym.c objfiles.c \
minsyms.c mipsread.c maint.c ch-exp.y c-lang.c ch-lang.c m2-lang.c
minsyms.c mipsread.c maint.c ch-exp.y c-lang.c ch-lang.c m2-lang.c \
complaints.c
# Source files in subdirectories (which will be handled separately by
# 'make gdb.tar.Z').
@ -210,14 +211,12 @@ SFILES_MAINDIR = \
SFILES_SUBDIR = \
${srcdir}/vx-share/dbgRpcLib.h \
${srcdir}/vx-share/ptrace.h \
${srcdir}/vx-share/reg.h \
${srcdir}/vx-share/vxTypes.h \
${srcdir}/vx-share/vxWorks.h \
${srcdir}/vx-share/wait.h \
${srcdir}/vx-share/xdr_ld.h \
${srcdir}/vx-share/xdr_ptrace.h \
${srcdir}/vx-share/xdr_rdb.h \
${srcdir}/vx-share/xdr_regs.h \
${srcdir}/nindy-share/b.out.h \
${srcdir}/nindy-share/block_io.h \
${srcdir}/nindy-share/coff.h \
@ -225,12 +224,6 @@ SFILES_SUBDIR = \
${srcdir}/nindy-share/env.h \
${srcdir}/nindy-share/stop.h \
${srcdir}/nindy-share/ttycntl.h \
${srcdir}/29k-share/include/coff.h \
${srcdir}/29k-share/include/error.h \
${srcdir}/29k-share/include/macros.h \
${srcdir}/29k-share/include/main.h \
${srcdir}/29k-share/include/memspcs.h \
${srcdir}/29k-share/include/miniint.h \
${srcdir}/29k-share/udi/udiphcfg.h \
${srcdir}/29k-share/udi/udiphsun.h \
${srcdir}/29k-share/udi/udiproc.h \
@ -270,7 +263,7 @@ HFILES= breakpoint.h buildsym.h call-cmds.h command.h defs.h \
nm-sun2.h nm-sun3.h nm-sun386.h nm-sun4os4.h nm-trash.h \
nm-ultra3.h nm-hppab.h nm-hppah.h nm-umax.h nm-sysv4.h \
nm-apollo68b.h nm-apollo68v.h nm-vax.h nm-hp300bsd.h \
nm-hp300hpux.h c-lang.h ch-lang.h m2-lang.h
nm-hp300hpux.h c-lang.h ch-lang.h m2-lang.h complaints.h
REMOTE_EXAMPLES = m68k-stub.c i386-stub.c sparc-stub.c rem-multi.shar
@ -310,7 +303,7 @@ OBS = version.o main.o blockframe.o breakpoint.o findvar.o stack.o source.o \
ieee-float.o putenv.o parse.o language.o $(YYOBJ) \
buildsym.o objfiles.o minsyms.o maint.o demangle.o \
dbxread.o coffread.o elfread.o dwarfread.o xcoffread.o mipsread.o \
stabsread.o core.o c-lang.o ch-lang.o m2-lang.o
stabsread.o core.o c-lang.o ch-lang.o m2-lang.o complaints.o
RAPP_OBS = rgdb.o rudp.o rserial.o serial.o udp.o $(XDEPFILES)
@ -431,7 +424,6 @@ alldeps.mak: ${srcdir}/config
-e 's!xdr_ld.o!vx-share/xdr_ld.c!' \
-e 's!xdr_ptrace.o!vx-share/xdr_ptrace.c!' \
-e 's!xdr_rdb.o!vx-share/xdr_rdb.c!' \
-e 's!xdr_regs.o!vx-share/xdr_regs.c!' \
-e 's!udr.o!29k-share/udi/udr.c!' \
-e 's!udip2soc.o!29k-share/udi/udip2soc.c!' \
-e 's/\.o/.c/' \
@ -610,8 +602,7 @@ make-proto-gdb-1: ${TARFILES} ${TARDIRS} gdb.info
for i in $(ALLCONFIG) ; do ln -s ../../$$i ../$$i ; done
mkdir proto-gdb.dir/vx-share proto-gdb.dir/nindy-share \
proto-gdb.dir/29k-share
mkdir proto-gdb.dir/29k-share/include proto-gdb.dir/29k-share/udi
mkdir proto-gdb.dir/29k-share/dfe
mkdir proto-gdb.dir/29k-share/udi
cd proto-gdb.dir/config ; \
for i in $(SFILES_SUBDIR) $(NONSRC_SUBDIR) $(ALLDEPFILES_SUBDIR); \
do ln -s ../../$$i ../$$i ; done
@ -775,9 +766,6 @@ xdr_ptrace.o: ${srcdir}/vx-share/xdr_ptrace.c
xdr_rdb.o: ${srcdir}/vx-share/xdr_rdb.c
${CC} -c ${INTERNAL_CFLAGS} ${srcdir}/vx-share/xdr_rdb.c
xdr_regs.o: ${srcdir}/vx-share/xdr_regs.c
${CC} -c ${INTERNAL_CFLAGS} ${srcdir}/vx-share/xdr_regs.c
nindy.o: ${srcdir}/nindy-share/nindy.c
${CC} -c ${INTERNAL_CFLAGS} -DSTRIP='"$(tooldir)/bin/strip"' \
${srcdir}/nindy-share/nindy.c

View File

@ -31,6 +31,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "symtab.h"
#include "symfile.h" /* Needed for "struct complaint" */
#include "objfiles.h"
#include "complaints.h"
#include <string.h>
/* Ask buildsym.h to define the vars it normally declares `extern'. */
@ -260,7 +261,7 @@ finish_block (symbol, listhead, old_blocks, start, end, objfile)
}
else
{
complain (&innerblock_anon_complaint, 0);
complain (&innerblock_anon_complaint);
}
BLOCK_START (pblock->block) = BLOCK_START (block);
BLOCK_END (pblock->block) = BLOCK_END (block);
@ -345,7 +346,7 @@ make_blockvector (objfile)
> BLOCK_START(BLOCKVECTOR_BLOCK (blockvector, i)))
{
complain (&blockvector_complaint,
(char *) BLOCK_START(BLOCKVECTOR_BLOCK (blockvector, i)));
BLOCK_START(BLOCKVECTOR_BLOCK (blockvector, i)));
}
}
}

View File

@ -26,6 +26,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "symfile.h"
#include "objfiles.h"
#include "buildsym.h"
#include "complaints.h"
#include <obstack.h>
#include <string.h>
@ -614,8 +615,7 @@ coff_end_symtab (objfile)
if (BLOCK_START(pb->block) < BLOCK_START(pbnext->block)) {
struct block *tmp = pb->block;
complain (&misordered_blocks_complaint,
(char *) BLOCK_START (pb->block));
complain (&misordered_blocks_complaint, BLOCK_START (pb->block));
pb->block = pbnext->block;
pbnext->block = tmp;
swapped = 1;
@ -1069,7 +1069,7 @@ read_coff_symtab (symtab_offset, nsyms, objfile)
/* main_aux.x_sym.x_misc.x_lnsz.x_lnno
contains line number of '{' } */
if (cs->c_naux != 1)
complain (&bf_no_aux_complaint, (char *) cs->c_symnum);
complain (&bf_no_aux_complaint, cs->c_symnum);
fcn_first_line = main_aux.x_sym.x_misc.x_lnsz.x_lnno;
new = (struct coff_context_stack *)
@ -1094,12 +1094,12 @@ read_coff_symtab (symtab_offset, nsyms, objfile)
new = coff_context_stack;
if (new == 0)
{
complain (&ef_complaint, (char *) cs->c_symnum);
complain (&ef_complaint, cs->c_symnum);
within_function = 0;
break;
}
if (cs->c_naux != 1) {
complain (&ef_no_aux_complaint, (char *) cs->c_symnum);
complain (&ef_no_aux_complaint, cs->c_symnum);
fcn_last_line = 0x7FFFFFFF;
} else {
fcn_last_line = main_aux.x_sym.x_misc.x_lnsz.x_lnno;
@ -1446,7 +1446,7 @@ enter_linenos (file_offset, first_line, last_line)
if (file_offset < linetab_offset)
{
complain (&lineno_complaint, (char *) file_offset);
complain (&lineno_complaint, file_offset);
if (file_offset > linetab_size) /* Too big to be an offset? */
return;
file_offset += linetab_offset; /* Try reading at that linetab offset */

154
gdb/complaints.c Normal file
View File

@ -0,0 +1,154 @@
/* Support for complaint handling during symbol reading in GDB.
Copyright (C) 1990, 1991, 1992 Free Software Foundation, Inc.
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
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., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "defs.h"
#include "complaints.h"
#include "gdbcmd.h"
#include <varargs.h>
/* Structure to manage complaints about symbol file contents. */
struct complaint complaint_root[1] = {
{
(char *) NULL, /* Complaint message */
0, /* Complaint counter */
complaint_root /* Next complaint. */
}
};
/* How many complaints about a particular thing should be printed before
we stop whining about it? Default is no whining at all, since so many
systems have ill-constructed symbol files. */
static unsigned int stop_whining = 0;
/* Should each complaint be self explanatory, or should we assume that
a series of complaints is being produced?
case 0: self explanatory message.
case 1: First message of a series that must start off with explanation.
case 2: Subsequent message, when user already knows we are reading
symbols and we can just state our piece. */
static int complaint_series = 0;
/* External variables and functions referenced. */
extern int info_verbose;
/* Functions to handle complaints during symbol reading. */
/* Print a complaint about the input symbols, and link the complaint block
into a chain for later handling. */
/* VARARGS */
void
complain (va_alist)
va_dcl
{
va_list args;
struct complaint *complaint;
char *val;
va_start (args);
complaint = va_arg (args, struct complaint *);
complaint -> counter++;
if (complaint -> next == NULL)
{
complaint -> next = complaint_root -> next;
complaint_root -> next = complaint;
}
if (complaint -> counter > stop_whining)
{
return;
}
wrap_here ("");
switch (complaint_series + (info_verbose << 1))
{
/* Isolated messages, must be self-explanatory. */
case 0:
begin_line ();
puts_filtered ("During symbol reading, ");
wrap_here ("");
vprintf_filtered (complaint -> message, args);
puts_filtered (".\n");
break;
/* First of a series, without `set verbose'. */
case 1:
begin_line ();
puts_filtered ("During symbol reading...");
vprintf_filtered (complaint -> message, args);
puts_filtered ("...");
wrap_here ("");
complaint_series++;
break;
/* Subsequent messages of a series, or messages under `set verbose'.
(We'll already have produced a "Reading in symbols for XXX..."
message and will clean up at the end with a newline.) */
default:
vprintf_filtered (complaint -> message, args);
puts_filtered ("...");
wrap_here ("");
}
va_end (args);
}
/* Clear out all complaint counters that have ever been incremented.
If sym_reading is 1, be less verbose about successive complaints,
since the messages are appearing all together during a command that
reads symbols (rather than scattered around as psymtabs get fleshed
out into symtabs at random times). If noisy is 1, we are in a
noisy symbol reading command, and our caller will print enough
context for the user to figure it out. */
void
clear_complaints (sym_reading, noisy)
int sym_reading;
int noisy;
{
struct complaint *p;
for (p = complaint_root -> next; p != complaint_root; p = p -> next)
{
p -> counter = 0;
}
if (!sym_reading && !noisy && complaint_series > 1)
{
/* Terminate previous series, since caller won't. */
puts_filtered ("\n");
}
complaint_series = sym_reading ? 1 + noisy : 0;
}
_initialize_complaints ()
{
add_show_from_set
(add_set_cmd ("complaints", class_support, var_zinteger,
(char *) &stop_whining,
"Set max number of complaints about incorrect symbols.",
&setlist),
&showlist);
}

46
gdb/complaints.h Normal file
View File

@ -0,0 +1,46 @@
/* Definitions for complaint handling during symbol reading in GDB.
Copyright (C) 1990, 1991, 1992 Free Software Foundation, Inc.
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
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., 675 Mass Ave, Cambridge, MA 02139, USA. */
/* Support for complaining about things in the symbol file that aren't
catastrophic.
Each such thing gets a counter. The first time we have the problem,
during a symbol read, we report it. At the end of symbol reading,
if verbose, we report how many of each problem we had. */
struct complaint
{
char *message;
unsigned counter;
struct complaint *next;
};
/* Root of the chain of complaints that have at some point been issued.
This is used to reset the counters, and/or report the total counts. */
extern struct complaint complaint_root[1];
/* Functions that handle complaints. (in complaints.c) */
extern void
complain ();
extern void
clear_complaints PARAMS ((int, int));

View File

@ -71,6 +71,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "stabsread.h"
#include "gdb-stabs.h"
#include "demangle.h"
#include "language.h" /* Needed inside partial-stab.h */
#include "complaints.h"
#include "aout/aout64.h"
#include "aout/stab_gnu.h" /* We always use GNU stabs, not native, now */
@ -348,7 +350,7 @@ add_old_header_file (name, instance)
add_this_object_header_file (i);
return;
}
complain (&repeated_header_complaint, (char *)symnum);
complain (&repeated_header_complaint, symnum);
complain (&repeated_header_name_complaint, name);
}
@ -919,7 +921,7 @@ read_dbx_symtab (section_offsets, objfile, text_addr, text_size)
symbol table. Read them in first. */
hp_symbuf_end = hp_symbuf_idx = 0;
bfd_seek (abfd, HP_SYMTAB_OFFSET (objfile), 0);
bfd_seek (abfd, HP_SYMTAB_OFFSET (objfile), L_SET);
for (hp_symnum = 0; hp_symnum < HP_SYMCOUNT (objfile); hp_symnum++)
{
@ -980,7 +982,7 @@ read_dbx_symtab (section_offsets, objfile, text_addr, text_size)
objfile);
}
}
bfd_seek (abfd, DBX_SYMTAB_OFFSET (objfile), 0);
bfd_seek (abfd, DBX_SYMTAB_OFFSET (objfile), L_SET);
#endif
for (symnum = 0; symnum < DBX_SYMCOUNT (objfile); symnum++)
@ -1018,7 +1020,7 @@ read_dbx_symtab (section_offsets, objfile, text_addr, text_size)
#define SET_NAMESTRING()\
if (((unsigned)bufp->n_strx + file_string_table_offset) >= \
DBX_STRINGTAB_SIZE (objfile)) { \
complain (&string_table_offset_complaint, (char *) symnum); \
complain (&string_table_offset_complaint, symnum); \
namestring = "foo"; \
} else \
namestring = bufp->n_strx + file_string_table_offset + \
@ -1535,7 +1537,6 @@ read_ofile_symtab (objfile, sym_offset, sym_size, text_offset, text_size,
However, there is no reason not to accept
the GCC_COMPILED_FLAG_SYMBOL anywhere. */
processing_gcc_compilation = 0;
if (strcmp (namestring, GCC_COMPILED_FLAG_SYMBOL) == 0)
processing_gcc_compilation = 1;
else if (strcmp (namestring, GCC2_COMPILED_FLAG_SYMBOL) == 0)
@ -1614,6 +1615,12 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
static CORE_ADDR function_start_offset;
char *colon_pos;
#ifndef BLOCK_ADDRESS_FUNCTION_RELATIVE
/* N_LBRAC, N_RBRAC and N_SLINE entries are not relative to the
function start address, so just use the text offset. */
function_start_offset = ANOFFSET (section_offsets, SECT_OFF_TEXT);
#endif
/* Something is wrong if we see real data before
seeing a source file name. */
@ -1671,9 +1678,6 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
absolute, or relative to the N_SO, depending on
BLOCK_ADDRESS_ABSOLUTE. */
function_start_offset = valu;
#else
/* Default on ordinary systems */
function_start_offset = ANOFFSET (section_offsets, SECT_OFF_TEXT);
#endif
within_function = 1;
@ -1686,7 +1690,7 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
}
/* Stack must be empty now. */
if (context_stack_depth != 0)
complain (&lbrac_unmatched_complaint, (char *) symnum);
complain (&lbrac_unmatched_complaint, symnum);
new = push_context (0, valu);
new->name = define_symbol (valu, name, desc, type, objfile);
@ -1708,7 +1712,7 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
#ifndef SUN_FIXED_LBRAC_BUG
if (valu < last_pc_address) {
/* Patch current LBRAC pc value to match last handy pc value */
complain (&lbrac_complaint, 0);
complain (&lbrac_complaint);
valu = last_pc_address;
}
#endif
@ -1730,7 +1734,7 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
new = pop_context();
if (desc != new->depth)
complain (&lbrac_mismatch_complaint, (char *) symnum);
complain (&lbrac_mismatch_complaint, symnum);
/* Some compilers put the variable decls inside of an
LBRAC/RBRAC block. This macro should be nonzero if this
@ -1762,7 +1766,7 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
/* FIXME Muzzle a compiler bug that makes end < start. */
if (new->start_addr > valu)
{
complain(&lbrac_rbrac_complaint, 0);
complain (&lbrac_rbrac_complaint);
new->start_addr = valu;
}
/* Make a block for the local symbols within. */
@ -2059,9 +2063,9 @@ elfstab_build_psymtabs (objfile, section_offsets, mainline,
struct objfile *objfile;
struct section_offsets *section_offsets;
int mainline;
unsigned int staboffset;
file_ptr staboffset;
unsigned int stabsize;
unsigned int stabstroffset;
file_ptr stabstroffset;
unsigned int stabstrsize;
{
int val;

View File

@ -41,6 +41,7 @@ typedef unsigned int CORE_ADDR;
extern int quit_flag;
extern int immediate_quit;
extern int sevenbit_strings;
extern void
quit PARAMS ((void));
@ -183,6 +184,9 @@ myread PARAMS ((int, char *, int));
extern int
query ();
extern void
begin_line PARAMS ((void));
extern void
wrap_here PARAMS ((char *));
@ -198,6 +202,9 @@ fputs_filtered PARAMS ((const char *, FILE *));
extern void
puts_filtered PARAMS ((char *));
extern void
vprintf_filtered ();
extern void
vfprintf_filtered ();
@ -223,7 +230,7 @@ extern char *
n_spaces PARAMS ((int));
extern void
printchar PARAMS ((int, FILE *, int));
gdb_printchar PARAMS ((int, FILE *, int));
extern char *
strdup_demangled PARAMS ((const char *));
@ -334,7 +341,10 @@ extern unsigned output_radix;
/* Baud rate specified for communication with serial target systems. */
extern char *baud_rate;
/* Languages represented in the symbol table and elsewhere. */
/* Languages represented in the symbol table and elsewhere.
This should probably be in language.h, but since enum's can't
be forward declared to satisfy opaque references before their
actual definition, needs to be here. */
enum language
{
@ -342,31 +352,12 @@ enum language
language_auto, /* Placeholder for automatic setting */
language_c, /* C */
language_cplus, /* C++ */
/* start-sanitize-chill */
language_chill, /* Chill */
/* end-sanitize-chill */
language_m2 /* Modula-2 */
};
/* Return a format string for printf that will print a number in the local
(language-specific) hexadecimal format. Result is static and is
overwritten by the next call. local_hex_format_custom takes printf
options like "08" or "l" (to produce e.g. %08x or %lx). */
#define local_hex_format() (current_language->la_hex_format)
extern char *
local_hex_format_custom PARAMS ((char *)); /* language.c */
/* Return a string that contains a number formatted in the local
(language-specific) hexadecimal format. Result is static and is
overwritten by the next call. local_hex_string_custom takes printf
options like "08" or "l". */
extern char *
local_hex_string PARAMS ((int)); /* language.c */
extern char *
local_hex_string_custom PARAMS ((int, char *)); /* language.c */
/* Host machine definition. This will be a symlink to one of the
xm-*.h files, built by the `configure' script. */

View File

@ -52,11 +52,12 @@ other things to work on, if you get bored. :-)
#include "demangle.h"
#include "expression.h" /* Needed for enum exp_opcode in language.h, sigh... */
#include "language.h"
#include "complaints.h"
#include <varargs.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#ifndef NO_SYS_FILE
#include <sys/file.h>
#endif
@ -66,11 +67,117 @@ other things to work on, if you get bored. :-)
#define L_SET 0
#endif
#ifdef MAINTENANCE /* Define to 1 to compile in some maintenance stuff */
#define SQUAWK(stuff) dwarfwarn stuff
#else
#define SQUAWK(stuff)
#endif
/* Some macros to provide DIE info for complaints. */
#define DIE_ID (curdie!=NULL ? curdie->die_ref : 0)
#define DIE_NAME (curdie!=NULL && curdie->at_name!=NULL) ? curdie->at_name : ""
/* Complaints that can be issued during DWARF debug info reading. */
struct complaint no_bfd_get_N =
{
"DIE @ 0x%x \"%s\", no bfd support for %d byte data object", 0, 0
};
struct complaint malformed_die =
{
"DIE @ 0x%x \"%s\", malformed DIE, bad length (%d bytes)", 0, 0
};
struct complaint bad_die_ref =
{
"DIE @ 0x%x \"%s\", reference to DIE (0x%x) outside compilation unit", 0, 0
};
struct complaint unknown_attribute_form =
{
"DIE @ 0x%x \"%s\", unknown attribute form (0x%x)", 0, 0
};
struct complaint unknown_attribute_length =
{
"DIE @ 0x%x \"%s\", unknown attribute length, skipped remaining attributes", 0, 0
};
struct complaint unexpected_fund_type =
{
"DIE @ 0x%x \"%s\", unexpected fundamental type 0x%x", 0, 0
};
struct complaint unknown_type_modifier =
{
"DIE @ 0x%x \"%s\", unknown type modifier %u", 0, 0
};
struct complaint volatile_ignored =
{
"DIE @ 0x%x \"%s\", type modifier 'volatile' ignored", 0, 0
};
struct complaint const_ignored =
{
"DIE @ 0x%x \"%s\", type modifier 'const' ignored", 0, 0
};
struct complaint botched_modified_type =
{
"DIE @ 0x%x \"%s\", botched modified type decoding (mtype 0x%x)", 0, 0
};
struct complaint op_deref2 =
{
"DIE @ 0x%x \"%s\", OP_DEREF2 address 0x%x not handled", 0, 0
};
struct complaint op_deref4 =
{
"DIE @ 0x%x \"%s\", OP_DEREF4 address 0x%x not handled", 0, 0
};
struct complaint basereg_not_handled =
{
"DIE @ 0x%x \"%s\", BASEREG %d not handled", 0, 0
};
struct complaint dup_user_type_allocation =
{
"DIE @ 0x%x \"%s\", internal error: duplicate user type allocation", 0, 0
};
struct complaint dup_user_type_definition =
{
"DIE @ 0x%x \"%s\", internal error: duplicate user type definition", 0, 0
};
struct complaint missing_tag =
{
"DIE @ 0x%x \"%s\", missing class, structure, or union tag", 0, 0
};
struct complaint bad_array_element_type =
{
"DIE @ 0x%x \"%s\", bad array element type attribute 0x%x", 0, 0
};
struct complaint subscript_data_items =
{
"DIE @ 0x%x \"%s\", can't decode subscript data items", 0, 0
};
struct complaint unhandled_array_subscript_format =
{
"DIE @ 0x%x \"%s\", array subscript format 0x%x not handled yet", 0, 0
};
struct complaint unknown_array_subscript_format =
{
"DIE @ 0x%x \"%s\", unknown array subscript format %x", 0, 0
};
struct complaint not_row_major =
{
"DIE @ 0x%x \"%s\", array not row major; not handled correctly", 0, 0
};
#ifndef R_FP /* FIXME */
#define R_FP 14 /* Kludge to get frame pointer register number */
@ -371,9 +478,6 @@ static void
read_lexical_block_scope PARAMS ((struct dieinfo *, char *, char *,
struct objfile *));
static void
dwarfwarn ();
static void
scan_partial_symbols PARAMS ((char *, char *, struct objfile *));
@ -712,55 +816,6 @@ record_minimal_symbol (name, address, ms_type, objfile)
/*
LOCAL FUNCTION
dwarfwarn -- issue a DWARF related warning
DESCRIPTION
Issue warnings about DWARF related things that aren't serious enough
to warrant aborting with an error, but should not be ignored either.
This includes things like detectable corruption in DIE's, missing
DIE's, unimplemented features, etc.
In general, running across tags or attributes that we don't recognize
is not considered to be a problem and we should not issue warnings
about such.
NOTES
We mostly follow the example of the error() routine, but without
returning to command level. It is arguable about whether warnings
should be issued at all, and if so, where they should go (stdout or
stderr).
We assume that curdie is valid and contains at least the basic
information for the DIE where the problem was noticed.
*/
static void
dwarfwarn (va_alist)
va_dcl
{
va_list ap;
char *fmt;
va_start (ap);
fmt = va_arg (ap, char *);
warning_setup ();
fprintf (stderr, "warning: DWARF ref 0x%x: ", curdie -> die_ref);
if (curdie -> at_name)
{
fprintf (stderr, "'%s': ", curdie -> at_name);
}
vfprintf (stderr, fmt, ap);
fprintf (stderr, "\n");
fflush (stderr);
va_end (ap);
}
/*
LOCAL FUNCTION
read_lexical_block_scope -- process all dies in a lexical block
@ -826,7 +881,7 @@ lookup_utype (die_ref)
utypeidx = (die_ref - dbroff) / 4;
if ((utypeidx < 0) || (utypeidx >= numutypes))
{
dwarfwarn ("reference to DIE (0x%x) outside compilation unit", die_ref);
complain (&bad_die_ref, DIE_ID, DIE_NAME);
}
else
{
@ -870,12 +925,12 @@ alloc_utype (die_ref, utypep)
if ((utypeidx < 0) || (utypeidx >= numutypes))
{
utypep = dwarf_fundamental_type (current_objfile, FT_INTEGER);
dwarfwarn ("reference to DIE (0x%x) outside compilation unit", die_ref);
complain (&bad_die_ref, DIE_ID, DIE_NAME);
}
else if (*typep != NULL)
{
utypep = *typep;
SQUAWK (("internal error: dup user type allocation"));
complain (&dup_user_type_allocation, DIE_ID, DIE_NAME);
}
else
{
@ -1002,7 +1057,7 @@ struct_type (dip, thisdie, enddie, objfile)
/* Should never happen */
TYPE_CODE (type) = TYPE_CODE_UNDEF;
tpart1 = "???";
SQUAWK (("missing class, structure, or union tag"));
complain (&missing_tag, DIE_ID, DIE_NAME);
break;
}
/* Some compilers try to be helpful by inventing "fake" names for
@ -1210,7 +1265,7 @@ decode_array_element_type (scan)
scan += SIZEOF_ATTRIBUTE;
if ((nbytes = attribute_size (attribute)) == -1)
{
SQUAWK (("bad array element type attribute 0x%x", attribute));
complain (&bad_array_element_type, DIE_ID, DIE_NAME, attribute);
typep = dwarf_fundamental_type (current_objfile, FT_INTEGER);
}
else
@ -1237,7 +1292,7 @@ decode_array_element_type (scan)
typep = decode_mod_u_d_type (scan);
break;
default:
SQUAWK (("bad array element type attribute 0x%x", attribute));
complain (&bad_array_element_type, DIE_ID, DIE_NAME, attribute);
typep = dwarf_fundamental_type (current_objfile, FT_INTEGER);
break;
}
@ -1326,7 +1381,7 @@ decode_subscript_data_item (scan, end)
if (nexttype == NULL)
{
/* Munged subscript data or other problem, fake it. */
SQUAWK (("can't decode subscript data items"));
complain (&subscript_data_items, DIE_ID, DIE_NAME);
nexttype = dwarf_fundamental_type (current_objfile, FT_INTEGER);
}
typep = create_array_type ((struct type *) NULL, nexttype, indextype,
@ -1339,12 +1394,12 @@ decode_subscript_data_item (scan, end)
case FMT_UT_C_X:
case FMT_UT_X_C:
case FMT_UT_X_X:
SQUAWK (("array subscript format 0x%x not handled yet", format));
complain (&unhandled_array_subscript_format, DIE_ID, DIE_NAME, format);
typep = dwarf_fundamental_type (current_objfile, FT_INTEGER);
typep = create_array_type ((struct type *) NULL, typep, typep, 0, 1);
break;
default:
SQUAWK (("unknown array subscript format %x", format));
complain (&unknown_array_subscript_format, DIE_ID, DIE_NAME, format);
typep = dwarf_fundamental_type (current_objfile, FT_INTEGER);
typep = create_array_type ((struct type *) NULL, typep, typep, 0, 1);
break;
@ -1382,7 +1437,7 @@ dwarf_read_array_type (dip)
if (dip -> at_ordering != ORD_row_major)
{
/* FIXME: Can gdb even handle column major arrays? */
SQUAWK (("array not row major; not handled correctly"));
complain (&not_row_major, DIE_ID, DIE_NAME);
}
if ((sub = dip -> at_subscr_data) != NULL)
{
@ -1412,7 +1467,7 @@ dwarf_read_array_type (dip)
{
/* Double ick! Not only is a type already in our slot, but
someone has decorated it. Complain and leave it alone. */
SQUAWK (("duplicate user defined array type definition"));
complain (&dup_user_type_definition, DIE_ID, DIE_NAME);
}
}
}
@ -1521,7 +1576,7 @@ read_subroutine_type (dip, thisdie, enddie)
}
else
{
SQUAWK (("duplicate user defined function type definition"));
complain (&dup_user_type_definition, DIE_ID, DIE_NAME);
}
}
@ -2142,7 +2197,8 @@ locval (loc)
else
{
stack[++stacki] = 0;
SQUAWK (("BASEREG %d not handled!", regno));
complain (&basereg_not_handled, DIE_ID, DIE_NAME, regno);
}
break;
case OP_ADDR:
@ -2159,10 +2215,10 @@ locval (loc)
break;
case OP_DEREF2:
/* pop, deref and push 2 bytes (as a long) */
SQUAWK (("OP_DEREF2 address 0x%x not handled", stack[stacki]));
complain (&op_deref2, DIE_ID, DIE_NAME, stack[stacki]);
break;
case OP_DEREF4: /* pop, deref and push 4 bytes (as a long) */
SQUAWK (("OP_DEREF4 address 0x%x not handled", stack[stacki]));
complain (&op_deref4, DIE_ID, DIE_NAME, stack[stacki]);
break;
case OP_ADD: /* pop top 2 items, add, push result */
stack[stacki - 1] += stack[stacki];
@ -2668,7 +2724,8 @@ scan_partial_symbols (thisdie, enddie, objfile)
temp = dbbase + di.at_sibling - dbroff;
if ((temp < thisdie) || (temp >= enddie))
{
dwarfwarn ("reference to DIE (0x%x) outside compilation unit", di.at_sibling);
complain (&bad_die_ref, DIE_ID, DIE_NAME,
di.at_sibling);
}
else
{
@ -3166,7 +3223,7 @@ decode_modified_type (modifiers, modcount, mtype)
}
break;
default:
SQUAWK (("botched modified type decoding (mtype 0x%x)", mtype));
complain (&botched_modified_type, DIE_ID, DIE_NAME, mtype);
typep = dwarf_fundamental_type (current_objfile, FT_INTEGER);
break;
}
@ -3184,17 +3241,16 @@ decode_modified_type (modifiers, modcount, mtype)
typep = lookup_reference_type (typep);
break;
case MOD_const:
SQUAWK (("type modifier 'const' ignored")); /* FIXME */
complain (&const_ignored, DIE_ID, DIE_NAME); /* FIXME */
break;
case MOD_volatile:
SQUAWK (("type modifier 'volatile' ignored")); /* FIXME */
complain (&volatile_ignored, DIE_ID, DIE_NAME); /* FIXME */
break;
default:
if (!(MOD_lo_user <= (unsigned char) modifier
&& (unsigned char) modifier <= MOD_hi_user))
{
SQUAWK (("unknown type modifier %u",
(unsigned char) modifier));
complain (&unknown_type_modifier, DIE_ID, DIE_NAME, modifier);
}
break;
}
@ -3337,7 +3393,7 @@ decode_fund_type (fundtype)
typep = dwarf_fundamental_type (current_objfile, FT_INTEGER);
if (!(FT_lo_user <= fundtype && fundtype <= FT_hi_user))
{
SQUAWK (("unexpected fundamental type 0x%x", fundtype));
complain (&unexpected_fund_type, DIE_ID, DIE_NAME, fundtype);
}
}
@ -3440,7 +3496,7 @@ basicdieinfo (dip, diep, objfile)
if ((dip -> die_length < SIZEOF_DIE_LENGTH) ||
((diep + dip -> die_length) > (dbbase + dbsize)))
{
dwarfwarn ("malformed DIE, bad length (%d bytes)", dip -> die_length);
complain (&malformed_die, DIE_ID, DIE_NAME, dip -> die_length);
dip -> die_length = 0;
}
else if (dip -> die_length < (SIZEOF_DIE_LENGTH + SIZEOF_DIE_TAG))
@ -3508,7 +3564,7 @@ completedieinfo (dip, objfile)
diep += SIZEOF_ATTRIBUTE;
if ((nbytes = attribute_size (attr)) == -1)
{
SQUAWK (("unknown attribute length, skipped remaining attributes"));;
complain (&unknown_attribute_length, DIE_ID, DIE_NAME);
diep = end;
continue;
}
@ -3665,8 +3721,7 @@ completedieinfo (dip, objfile)
diep += strlen (diep) + 1;
break;
default:
SQUAWK (("unknown attribute form (0x%x)", form));
SQUAWK (("unknown attribute length, skipped remaining attributes"));;
complain (&unknown_attribute_form, DIE_ID, DIE_NAME, form);
diep = end;
break;
}
@ -3724,7 +3779,7 @@ target_to_host (from, nbytes, signextend, objfile)
rtnval = bfd_get_8 (objfile -> obfd, (bfd_byte *) from);
break;
default:
dwarfwarn ("no bfd support for %d byte data object", nbytes);
complain (&no_bfd_get_N, DIE_ID, DIE_NAME, nbytes);
rtnval = 0;
break;
}
@ -3780,7 +3835,7 @@ attribute_size (attr)
nbytes = TARGET_FT_POINTER_SIZE (objfile);
break;
default:
SQUAWK (("unknown attribute form (0x%x)", form));
complain (&unknown_attribute_form, DIE_ID, DIE_NAME, form);
nbytes = -1;
break;
}

View File

@ -43,6 +43,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "objfiles.h"
#include "buildsym.h"
#include "gdb-stabs.h"
#include "complaints.h"
#include <string.h>
#define STREQ(a,b) (strcmp((a),(b))==0)
@ -373,13 +374,12 @@ elf_symtab_read (abfd, addr, objfile)
sizeof (*sectinfo));
memset ((PTR) sectinfo, 0, sizeof (*sectinfo));
if (!filesym)
complain (&section_info_complaint, (char *)sym->name);
complain (&section_info_complaint, sym->name);
else
sectinfo->filename = (char *)filesym->name;
}
if (sectinfo->sections[index])
complain (&section_info_dup_complaint,
(char *)sectinfo->filename);
complain (&section_info_dup_complaint, sectinfo->filename);
symaddr = sym -> value;
/* Relocate all non-absolute symbols by base address. */

View File

@ -30,6 +30,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "target.h"
#include "value.h"
#include "demangle.h"
#include "complaints.h"
/* Alloc a new type structure and fill it with some defaults. If
OBJFILE is non-NULL, then allocate the space for the type structure
@ -733,7 +734,7 @@ check_stub_type (type)
struct symbol *sym;
if (name == NULL)
{
complain (&stub_noname_complaint, 0);
complain (&stub_noname_complaint);
return;
}
sym = lookup_symbol (name, 0, STRUCT_NAMESPACE, 0,

View File

@ -58,6 +58,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "obstack.h"
#include "buildsym.h"
#include "stabsread.h"
#include "complaints.h"
#ifdef USG
#include <sys/types.h>
@ -1135,7 +1136,7 @@ data: /* Common code for symbols describing data */
tsym = ((SYMR*)cur_fdr->isymBase)
+ tsym->index-1;
}
else complain (&block_member_complaint, (char *)tsym->st);
else complain (&block_member_complaint, tsym->st);
}
/* In an stBlock, there is no way to distinguish structs,
@ -1292,7 +1293,7 @@ data: /* Common code for symbols describing data */
/* End of file. Pop parse stack and ignore. Higher
level code deals with this. */
;
} else complain (&stEnd_complaint, (char *)sh->sc);
} else complain (&stEnd_complaint, sh->sc);
pop_parse_stack(); /* restore previous lexical context */
break;
@ -1328,7 +1329,7 @@ data: /* Common code for symbols describing data */
case stConstant:
break; /* constant */
default:
complain(&unknown_mips_symtype_complaint, (char *)sh->st);
complain(&unknown_mips_symtype_complaint, sh->st);
break;
}
sh->st = stParsed;
@ -1390,7 +1391,7 @@ parse_type(ax, bs, bigend)
tax = ax;
ecoff_swap_tir_in (bigend, &tax->a_ti, t);
if (t->bt > (sizeof (map_bt)/sizeof (*map_bt))) {
complain (&basic_type_complaint, (char *)t->bt);
complain (&basic_type_complaint, t->bt);
return builtin_type_int;
}
if (map_bt[t->bt]) {
@ -1426,7 +1427,7 @@ parse_type(ax, bs, bigend)
break;
case btTypedef:
default:
complain (&basic_type_complaint, (char *)t->bt);
complain (&basic_type_complaint, t->bt);
return builtin_type_int;
}
}
@ -1606,7 +1607,7 @@ upgrade_type(tpp, tq, ax, bigend)
TYPE_LENGTH(TYPE_TARGET_TYPE(t)) = id >> 3;
}
if (id != rf)
complain (&array_bitsize_complaint, (char *)rf);
complain (&array_bitsize_complaint, rf);
TYPE_LENGTH(t) = (upper < 0) ? 0 :
(upper - lower + 1) * (rf >> 3);
@ -1622,7 +1623,7 @@ upgrade_type(tpp, tq, ax, bigend)
return 0;
default:
complain (&unknown_type_qual_complaint, (char *)tq);
complain (&unknown_type_qual_complaint, tq);
return 0;
}
}
@ -1650,7 +1651,7 @@ parse_procedure (pr, bound, have_stabs)
/* Static procedure at address pr->adr. Sigh. */
if (sh == (SYMR*)-1) {
complain (&pdr_static_symbol_complaint, (char *)pr->adr);
complain (&pdr_static_symbol_complaint, pr->adr);
return;
}
sh_name = (char*)sh->iss;
@ -1937,7 +1938,7 @@ parse_partial_symbols (end_of_text_seg, objfile, section_offsets)
break;
default:
ms_type = mst_unknown;
complain (&unknown_ext_complaint, (char *)esh->asym.iss);
complain (&unknown_ext_complaint, esh->asym.iss);
}
prim_record_minimal_symbol ((char *)esh->asym.iss,
esh->asym.value,
@ -2114,8 +2115,8 @@ parse_partial_symbols (end_of_text_seg, objfile, section_offsets)
default:
/* Both complaints are valid: one gives symbol name,
the other the offending symbol type. */
complain (&unknown_sym_complaint, (char *)sh->iss);
complain (&unknown_st_complaint, (char *)sh->st);
complain (&unknown_sym_complaint, sh->iss);
complain (&unknown_st_complaint, sh->st);
cur_sdx++;
continue;
}
@ -2147,7 +2148,7 @@ parse_partial_symbols (end_of_text_seg, objfile, section_offsets)
class = LOC_LABEL;
break;
default:
complain (&unknown_ext_complaint, (char *)sh->iss);
complain (&unknown_ext_complaint, sh->iss);
/* Fall through, pretend it's global. */
case stGlobal:
class = LOC_STATIC;
@ -2206,7 +2207,7 @@ parse_partial_symbols (end_of_text_seg, objfile, section_offsets)
for (s_idx = s_id0; s_idx < fh->crfd; s_idx++) {
RFDT *rh = (RFDT *) (fh->rfdBase) + s_idx;
if (*rh < 0 || *rh >= hdr->ifdMax)
complain(&bad_file_number_complaint, (char *)*rh);
complain(&bad_file_number_complaint, *rh);
else
pst->dependencies[s_idx-s_id0] = fdr_to_pst[*rh].pst;
}
@ -2401,7 +2402,7 @@ psymtab_to_symtab_1(pst, filename)
/* Handle encoded stab line number. */
record_line (current_subfile, sh->index, valu);
}
else complain (&stab_unknown_complaint, (char *)sh->iss);
else complain (&stab_unknown_complaint, sh->iss);
}
st = end_symtab (pst->texthigh, 0, 0, pst->objfile);
end_stabs ();

View File

@ -642,6 +642,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
default:
/* If we haven't found it yet, ignore it. It's probably some
new type we don't know about yet. */
complain (&unknown_symtype_complaint, local_hex_string(CUR_SYMBOL_TYPE));
complain (&unknown_symtype_complaint,
local_hex_string (CUR_SYMBOL_TYPE));
continue;
}

View File

@ -809,7 +809,7 @@ vx_lookup_symbol (name, pAddr)
status = net_clnt_call (VX_SYMBOL_INQ, xdr_wrapstring, &name,
xdr_SYMBOL_ADDR, &symbolAddr);
if (status != RPC_SUCCESS) {
complain (&cant_contact_target, 0);
complain (&cant_contact_target);
return -1;
}

View File

@ -29,10 +29,11 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "obstack.h"
#include "symtab.h"
#include "gdbtypes.h"
#include "symfile.h" /* Needed for "struct complaint" */
#include "symfile.h"
#include "objfiles.h"
#include "aout/stab_gnu.h" /* We always use GNU stabs, not native */
#include "buildsym.h"
#include "complaints.h"
/* Ask stabsread.h to define the vars it normally declares `extern'. */
#define EXTERN /**/
@ -943,7 +944,7 @@ struct type *
error_type (pp)
char **pp;
{
complain (&error_type_complaint, 0);
complain (&error_type_complaint);
while (1)
{
/* Skip to end of symbol. */
@ -1229,7 +1230,7 @@ read_type (pp, objfile)
(*pp)++;
return_type = read_type (pp, objfile);
if (*(*pp)++ != ';')
complain (&invalid_member_complaint, (char *) symnum);
complain (&invalid_member_complaint, symnum);
type = allocate_stub_method (return_type);
if (typenums[0] != -1)
*dbx_lookup_type (typenums) = type;
@ -1504,7 +1505,7 @@ read_member_functions (fip, pp, type, objfile)
case '.':
break;
default:
complain (&const_vol_complaint, (char *) (long) **pp);
complain (&const_vol_complaint, **pp);
break;
}
@ -1565,7 +1566,7 @@ read_member_functions (fip, pp, type, objfile)
default:
/* error */
complain (&member_fn_complaint, (char *) (long) (*pp)[-1]);
complain (&member_fn_complaint, (*pp)[-1]);
/* Fall through into normal member function. */
case '.':
@ -1659,7 +1660,7 @@ read_cpp_abbrev (fip, pp, type, objfile)
name = type_name_no_tag (context);
if (name == NULL)
{
complain (&invalid_cpp_type_complaint, (char *) symnum);
complain (&invalid_cpp_type_complaint, symnum);
name = "FOO";
}
fip -> list -> field.name =
@ -1791,7 +1792,7 @@ read_one_struct_field (fip, pp, p, type, objfile)
stuff. */
if (fip -> list -> field.bitpos == 0 && fip -> list -> field.bitsize == 0)
{
complain (&dbx_class_complaint, 0);
complain (&dbx_class_complaint);
/* Ignore this field. */
fip -> list = fip -> list -> next;
}
@ -2908,7 +2909,7 @@ read_range_type (pp, typenums, objfile)
TYPE_TARGET_TYPE (result_type) = *dbx_lookup_type(rangenums);
if (TYPE_TARGET_TYPE (result_type) == 0) {
complain (&range_type_base_complaint, (char *) rangenums[1]);
complain (&range_type_base_complaint, rangenums[1]);
TYPE_TARGET_TYPE (result_type) = lookup_fundamental_type (objfile, FT_INTEGER);
}

View File

@ -30,6 +30,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "gdbcmd.h"
#include "breakpoint.h"
#include "language.h"
#include "complaints.h"
#include <obstack.h>
#include <assert.h>
@ -44,6 +45,14 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
int readnow_symbol_files; /* Read full symbols immediately */
struct complaint oldsyms_complaint = {
"Replacing old symbols for `%s'", 0, 0
};
struct complaint empty_symtab_complaint = {
"Empty symbol table found for `%s'", 0, 0
};
/* External variables and functions referenced. */
extern int info_verbose;
@ -96,20 +105,6 @@ int symbol_reloading = SYMBOL_RELOADING_DEFAULT;
int symbol_reloading = 0;
#endif
/* Structure to manage complaints about symbol file contents. */
struct complaint complaint_root[1] = {
{(char *) 0, 0, complaint_root},
};
/* Some actual complaints. */
struct complaint oldsyms_complaint = {
"Replacing old symbols for `%s'", 0, 0 };
struct complaint empty_symtab_complaint = {
"Empty symbol table found for `%s'", 0, 0 };
/* In the following sort, we always make sure that
register debug symbol declarations always come before regular
@ -949,95 +944,7 @@ the_big_top:
if (reread_one)
breakpoint_re_set ();
}
/* Functions to handle complaints during symbol reading. */
/* How many complaints about a particular thing should be printed before
we stop whining about it? Default is no whining at all, since so many
systems have ill-constructed symbol files. */
static unsigned stop_whining = 0;
/* Should each complaint be self explanatory, or should we assume that
a series of complaints is being produced?
case 0: self explanatory message.
case 1: First message of a series that must start off with explanation.
case 2: Subsequent message, when user already knows we are reading
symbols and we can just state our piece. */
static int complaint_series = 0;
/* Print a complaint about the input symbols, and link the complaint block
into a chain for later handling. */
void
complain (complaint, val)
struct complaint *complaint;
char *val;
{
complaint->counter++;
if (complaint->next == 0) {
complaint->next = complaint_root->next;
complaint_root->next = complaint;
}
if (complaint->counter > stop_whining)
return;
wrap_here ("");
switch (complaint_series + (info_verbose << 1)) {
/* Isolated messages, must be self-explanatory. */
case 0:
puts_filtered ("During symbol reading, ");
wrap_here("");
printf_filtered (complaint->message, val);
puts_filtered (".\n");
break;
/* First of a series, without `set verbose'. */
case 1:
puts_filtered ("During symbol reading...");
printf_filtered (complaint->message, val);
puts_filtered ("...");
wrap_here("");
complaint_series++;
break;
/* Subsequent messages of a series, or messages under `set verbose'.
(We'll already have produced a "Reading in symbols for XXX..." message
and will clean up at the end with a newline.) */
default:
printf_filtered (complaint->message, val);
puts_filtered ("...");
wrap_here("");
}
}
/* Clear out all complaint counters that have ever been incremented.
If sym_reading is 1, be less verbose about successive complaints,
since the messages are appearing all together during a command that
reads symbols (rather than scattered around as psymtabs get fleshed
out into symtabs at random times). If noisy is 1, we are in a
noisy symbol reading command, and our caller will print enough
context for the user to figure it out. */
void
clear_complaints (sym_reading, noisy)
int sym_reading;
int noisy;
{
struct complaint *p;
for (p = complaint_root->next; p != complaint_root; p = p->next)
p->counter = 0;
if (!sym_reading && !noisy && complaint_series > 1) {
/* Terminate previous series, since caller won't. */
puts_filtered ("\n");
}
complaint_series = sym_reading? 1 + noisy: 0;
}
enum language
deduce_language_from_filename (filename)
@ -1052,8 +959,10 @@ deduce_language_from_filename (filename)
return language_c;
else if(!strcmp(c,".cc") || !strcmp(c,".C"))
return language_cplus;
/* start-sanitize-chill */
else if(!strcmp(c,".chill") || !strcmp(c,".c186") || !strcmp(c,".c286"))
return language_chill;
/* end-sanitize-chill */
return language_unknown; /* default */
}
@ -1418,13 +1327,6 @@ The second argument provides the starting address of the file's text.");
"Dynamically load FILE into the running program, and record its symbols\n\
for access from GDB.");
add_show_from_set
(add_set_cmd ("complaints", class_support, var_zinteger,
(char *)&stop_whining,
"Set max number of complaints about incorrect symbols.",
&setlist),
&showlist);
add_show_from_set
(add_set_cmd ("symbol-reloading", class_support, var_boolean,
(char *)&symbol_reloading,

View File

@ -60,20 +60,31 @@ struct sym_fns {
/* sym_read (objfile, addr, mainline)
Reads a symbol file into a psymtab (or possibly a symtab).
OBJFILE is the objfile struct for the file we are reading. ADDR
is the offset between the file's specified start address and
its true address in memory. MAINLINE is 1 if this is the
OBJFILE is the objfile struct for the file we are reading.
SECTION_OFFSETS
are the offset between the file's specified section addresses and
their true addresses in memory.
MAINLINE is 1 if this is the
main symbol table being read, and 0 if a secondary
symbol file (e.g. shared library or dynamically loaded file)
is being read. */
void (*sym_read) PARAMS ((struct objfile *, CORE_ADDR, int));
void (*sym_read) PARAMS ((struct objfile *, struct section_offsets *, int));
/* Called when we are finished with an objfile. Should do all cleanup
that is specific to the object file format for the particular objfile. */
void (*sym_finish) PARAMS ((struct objfile *));
/* This function produces a file-dependent section_offsets structure,
allocated in the objfile's storage, and based on the parameter.
The parameter is currently a CORE_ADDR (FIXME!) for backward compatibility
with the higher levels of GDB. It should probably be changed to
a string, where NULL means the default, and others are parsed in a file
dependent way. The result of this function is handed in to sym_read. */
struct section_offsets *(*sym_offsets) PARAMS ((struct objfile *, CORE_ADDR));
/* Finds the next struct sym_fns. They are allocated and initialized
in whatever module implements the functions pointed to; an
initializer calls add_symtab_fns to add them to the global chain. */
@ -82,124 +93,6 @@ struct sym_fns {
};
/* Master structure for keeping track of each input file from which
gdb reads symbols. One of these is allocated for each such file we
access, e.g. the exec_file, symbol_file, and any shared library object
files. */
struct objfile
{
/* All struct objfile's are chained together by their next pointers.
The global variable "object_files" points to the first link in this
chain. */
struct objfile *next;
/* The object file's name. Malloc'd; free it if you free this struct. */
char *name;
/* Some flag bits for this objfile. */
unsigned short flags;
/* Each objfile points to a linked list of symtabs derived from this file,
one symtab structure for each compilation unit (source file). Each link
in the symtab list contains a backpointer to this objfile. */
struct symtab *symtabs;
/* Each objfile points to a linked list of partial symtabs derived from
this file, one partial symtab structure for each compilation unit
(source file). */
struct partial_symtab *psymtabs;
/* List of freed partial symtabs, available for re-use */
struct partial_symtab *free_psymtabs;
/* The object file's BFD. Can be null, in which case bfd_open (name) and
put the result here. */
bfd *obfd;
/* The modification timestamp of the object file, as of the last time
we read its symbols. */
long mtime;
/* Obstacks to hold objects that should be freed when we load a new symbol
table from this object file. */
struct obstack psymbol_obstack; /* Partial symbols */
struct obstack symbol_obstack; /* Full symbols */
struct obstack type_obstack; /* Types */
/* Vectors of all partial symbols read in from file. The actual data
is stored in the psymbol_obstack. */
struct psymbol_allocation_list global_psymbols;
struct psymbol_allocation_list static_psymbols;
/* Each file contains a pointer to an array of minimal symbols for all
global symbols that are defined within the file. The array is terminated
by a "null symbol", one that has a NULL pointer for the name and a zero
value for the address. This makes it easy to walk through the array
when passed a pointer to somewhere in the middle of it. There is also
a count of the number of symbols, which does include the terminating
null symbol. The array itself, as well as all the data that it points
to, should be allocated on the symbol_obstack for this file. */
struct minimal_symbol *msymbols;
int minimal_symbol_count;
/* For object file formats which don't specify fundamental types, gdb
can create such types. For now, it maintains a vector of pointers
to these internally created fundamental types on a per objfile basis,
however it really should ultimately keep them on a per-compilation-unit
basis, to account for linkage-units that consist of a number of
compilation units that may have different fundamental types, such as
linking C modules with ADA modules, or linking C modules that are
compiled with 32-bit ints with C modules that are compiled with 64-bit
ints (not inherently evil with a smarter linker). */
struct type **fundamental_types;
/* The mmalloc() malloc-descriptor for this objfile if we are using
the memory mapped malloc() package to manage storage for this objfile's
data. NULL if we are not. */
PTR md;
/* Structure which keeps track of functions that manipulate objfile's
of the same type as this objfile. I.E. the function to read partial
symbols for example. Note that this structure is in statically
allocated memory, and is shared by all objfiles that use the
object module reader of this type. */
struct sym_fns *sf;
/* Hook for information which is shared by sym_init and sym_read for
this objfile. It is typically a pointer to malloc'd memory. */
PTR sym_private;
};
/* Defines for the objfile flag word. */
/* Gdb can arrange to allocate storage for all objects related to a
particular objfile in a designated section of it's address space,
managed at a low level by mmap() and using a special version of
malloc that handles malloc/free/realloc on top of the mmap() interface.
This allows the "internal gdb state" for a particular objfile to be
dumped to a gdb state file and subsequently reloaded at a later time. */
#define OBJF_MAPPED (1 << 0) /* Objfile data is mmap'd */
extern void
extend_psymbol_list PARAMS ((struct psymbol_allocation_list *,
struct objfile *));
@ -254,15 +147,6 @@ sort_pst_symbols PARAMS ((struct partial_symtab *));
extern struct symtab *
allocate_symtab PARAMS ((char *, struct objfile *));
extern struct objfile *
allocate_objfile PARAMS ((bfd *, int));
extern void
free_objfile PARAMS ((struct objfile *));
extern void
free_all_objfiles PARAMS ((void));
extern int
free_named_symtabs PARAMS ((char *));
@ -272,11 +156,18 @@ fill_in_vptr_fieldno PARAMS ((struct type *));
extern void
add_symtab_fns PARAMS ((struct sym_fns *));
extern void
init_entry_point_info PARAMS ((struct objfile *));
extern void
syms_from_objfile PARAMS ((struct objfile *, CORE_ADDR, int, int));
extern void
new_symfile_objfile PARAMS ((struct objfile *, int, int));
extern struct partial_symtab *
start_psymtab_common PARAMS ((struct objfile *, CORE_ADDR, char *, CORE_ADDR,
start_psymtab_common PARAMS ((struct objfile *, struct section_offsets *,
char *, CORE_ADDR,
struct partial_symbol *,
struct partial_symbol *));
@ -307,90 +198,29 @@ obconcat PARAMS ((struct obstack *obstackp, const char *, const char *,
/* Variables */
/* The object file that the main symbol table was loaded from (e.g. the
argument to the "symbol-file" or "file" command). */
extern struct objfile *symfile_objfile;
/* Where execution starts in symfile */
extern CORE_ADDR entry_point;
/* Root of object file struct chain. */
extern struct objfile *object_files;
/* Traverse all object files. ALL_OBJFILES_SAFE works even if you delete
the objfile during the traversal. */
#define ALL_OBJFILES(obj) \
for (obj = object_files; 0 != obj; obj = obj->next)
#define ALL_OBJFILES_SAFE(obj,nxt) \
for (obj = object_files; obj? (nxt=obj->next, 1): 0; obj = nxt)
/* Support for complaining about things in the symbol file that aren't
catastrophic.
Each such thing gets a counter. The first time we have the problem,
during a symbol read, we report it. At the end of symbol reading,
if verbose, we report how many of each problem we had. */
struct complaint {
char *message;
unsigned counter;
struct complaint *next;
};
/* Root of the chain of complaints that have at some point been issued.
This is used to reset the counters, and/or report the total counts. */
extern struct complaint complaint_root[1];
/* Functions that handle complaints. (in symfile.c) */
extern void
complain PARAMS ((struct complaint *, char *));
extern void
clear_complaints PARAMS ((int sym_reading, int noisy));
/* From symfile.c */
extern struct partial_symtab *
allocate_psymtab PARAMS ((char *, struct objfile *));
/* From minsyms.c */
extern PTR
iterate_over_msymbols PARAMS ((PTR (*func) (struct objfile *,
struct minimal_symbol *,
PTR arg1, PTR arg2, PTR arg3),
PTR arg1, PTR arg2, PTR arg3));
/* From objfiles.c */
extern PTR
iterate_over_objfiles PARAMS ((PTR (*func) (struct objfile *,
PTR arg1, PTR arg2, PTR arg3),
PTR arg1, PTR arg2, PTR arg3));
extern PTR
iterate_over_symtabs PARAMS ((PTR (*func) (struct objfile *, struct symtab *,
PTR arg1, PTR arg2, PTR arg3),
PTR arg1, PTR arg2, PTR arg3));
extern PTR
iterate_over_psymtabs PARAMS ((PTR (*func) (struct objfile *,
struct partial_symtab *,
PTR arg1, PTR arg2, PTR arg3),
PTR arg1, PTR arg2, PTR arg3));
/* From dwarfread.c */
extern void
dwarf_build_psymtabs PARAMS ((int, char *, CORE_ADDR, int, unsigned int,
unsigned int, unsigned int, unsigned int,
struct objfile *));
dwarf_build_psymtabs PARAMS ((struct objfile *, struct section_offsets *, int,
file_ptr, unsigned int, file_ptr, unsigned int));
/* From dbxread.c */
extern void
elfstab_build_psymtabs PARAMS ((struct objfile *objfile,
struct section_offsets *section_offsets,
int mainline,
file_ptr staboff, unsigned int stabsize,
file_ptr stabstroffset, unsigned int stabstrsize));
/* From demangle.c */
extern void
set_demangling_style PARAMS ((char *));
#endif /* !defined(SYMFILE_H) */

View File

@ -808,11 +808,13 @@ parse_escape (string_ptr)
}
}
/* Print the character C on STREAM as part of the contents
of a literal string whose delimiter is QUOTER. */
/* Print the character C on STREAM as part of the contents of a literal
string whose delimiter is QUOTER. Note that this routine should only
be call for printing things which are independent of the language
of the program being debugged. */
void
printchar (c, stream, quoter)
gdb_printchar (c, stream, quoter)
register int c;
FILE *stream;
int quoter;
@ -980,6 +982,20 @@ wrap_here(indent)
}
}
/* Ensure that whatever gets printed next, using the filtered output
commands, starts at the beginning of the line. I.E. if there is
any pending output for the current line, flush it and start a new
line. Otherwise do nothing. */
void
begin_line ()
{
if (chars_printed > 0)
{
puts_filtered ("\n");
}
}
/* Like fputs but pause after every screenful, and can wrap at points
other than the final character of a line.
Unlike fputs, fputs_filtered does not return a value.
@ -1211,6 +1227,14 @@ vfprintf_filtered (stream, format, args)
fputs_filtered (linebuffer, stream);
}
void
vprintf_filtered (format, args)
char *format;
va_list args;
{
vfprintf_filtered (stdout, format, args);
}
/* VARARGS */
void
fprintf_filtered (va_alist)
@ -1290,7 +1314,10 @@ printfi_filtered (va_alist)
va_end (args);
}
/* Easy */
/* Easy -- but watch out!
This routine is *not* a replacement for puts()! puts() appends a newline.
This one doesn't, and had better not! */
void
puts_filtered (string)
@ -1378,7 +1405,7 @@ fprint_symbol (stream, name)
when searching for matching C++ function names (such as if the
user types 'break FOO', where FOO is a mangled C++ function). */
static int
int
strcmp_iw (string1, string2)
const char *string1;
const char *string2;