From 51b80b0072e928c9163087e1fcbc71e52301f524 Mon Sep 17 00:00:00 2001 From: Fred Fish Date: Tue, 15 Dec 1992 12:18:53 +0000 Subject: [PATCH] * 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). --- gdb/.Sanitize | 2 + gdb/ChangeLog | 30 ++++++ gdb/Makefile.in | 22 +--- gdb/buildsym.c | 5 +- gdb/coffread.c | 12 +-- gdb/complaints.c | 154 ++++++++++++++++++++++++++++ gdb/complaints.h | 46 +++++++++ gdb/dbxread.c | 32 +++--- gdb/defs.h | 37 +++---- gdb/dwarfread.c | 227 +++++++++++++++++++++++++---------------- gdb/elfread.c | 6 +- gdb/gdbtypes.c | 3 +- gdb/mipsread.c | 29 +++--- gdb/partial-stab.h | 3 +- gdb/remote-vx.c | 2 +- gdb/stabsread.c | 17 ++-- gdb/symfile.c | 120 ++-------------------- gdb/symfile.h | 248 +++++++-------------------------------------- gdb/utils.c | 37 ++++++- 19 files changed, 533 insertions(+), 499 deletions(-) create mode 100644 gdb/complaints.c create mode 100644 gdb/complaints.h diff --git a/gdb/.Sanitize b/gdb/.Sanitize index f0be8cd969..28ebf29b61 100644 --- a/gdb/.Sanitize +++ b/gdb/.Sanitize @@ -61,6 +61,8 @@ call-cmds.h coffread.c command.c command.h +complaints.c +complaints.h config configure.in convex-pinsn.c diff --git a/gdb/ChangeLog b/gdb/ChangeLog index de5942e5d0..c248d25c0b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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 diff --git a/gdb/Makefile.in b/gdb/Makefile.in index fee05da0dc..622f32b477 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -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 diff --git a/gdb/buildsym.c b/gdb/buildsym.c index a25190a616..73ca9b24ce 100644 --- a/gdb/buildsym.c +++ b/gdb/buildsym.c @@ -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 /* 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))); } } } diff --git a/gdb/coffread.c b/gdb/coffread.c index 1086d4c5aa..6df6492877 100644 --- a/gdb/coffread.c +++ b/gdb/coffread.c @@ -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 #include @@ -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 */ diff --git a/gdb/complaints.c b/gdb/complaints.c new file mode 100644 index 0000000000..b8ab240724 --- /dev/null +++ b/gdb/complaints.c @@ -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 + +/* 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); + +} diff --git a/gdb/complaints.h b/gdb/complaints.h new file mode 100644 index 0000000000..f7ff5a5681 --- /dev/null +++ b/gdb/complaints.h @@ -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)); diff --git a/gdb/dbxread.c b/gdb/dbxread.c index c6935d7ced..a8595973cd 100644 --- a/gdb/dbxread.c +++ b/gdb/dbxread.c @@ -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; diff --git a/gdb/defs.h b/gdb/defs.h index 2ec8a0c38c..34d47f7a2d 100644 --- a/gdb/defs.h +++ b/gdb/defs.h @@ -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. */ diff --git a/gdb/dwarfread.c b/gdb/dwarfread.c index 6d635439ff..5e22da5c6a 100644 --- a/gdb/dwarfread.c +++ b/gdb/dwarfread.c @@ -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 #include #include #include + #ifndef NO_SYS_FILE #include #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 (¬_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; } diff --git a/gdb/elfread.c b/gdb/elfread.c index 737943602c..8c212434bc 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -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 #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 (§ion_info_complaint, (char *)sym->name); + complain (§ion_info_complaint, sym->name); else sectinfo->filename = (char *)filesym->name; } if (sectinfo->sections[index]) - complain (§ion_info_dup_complaint, - (char *)sectinfo->filename); + complain (§ion_info_dup_complaint, sectinfo->filename); symaddr = sym -> value; /* Relocate all non-absolute symbols by base address. */ diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index e3ec14a7bb..392fec36d9 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -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, diff --git a/gdb/mipsread.c b/gdb/mipsread.c index 15e5d8bce2..0760f1e310 100644 --- a/gdb/mipsread.c +++ b/gdb/mipsread.c @@ -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 @@ -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 (); diff --git a/gdb/partial-stab.h b/gdb/partial-stab.h index 2c2c0f8cc4..b7fc445527 100644 --- a/gdb/partial-stab.h +++ b/gdb/partial-stab.h @@ -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; } diff --git a/gdb/remote-vx.c b/gdb/remote-vx.c index 90a0ef11f6..1f862a61ea 100644 --- a/gdb/remote-vx.c +++ b/gdb/remote-vx.c @@ -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; } diff --git a/gdb/stabsread.c b/gdb/stabsread.c index dfbd3cbfd6..ec7900b610 100644 --- a/gdb/stabsread.c +++ b/gdb/stabsread.c @@ -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); } diff --git a/gdb/symfile.c b/gdb/symfile.c index 96c994fb30..908ff09eb9 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -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 #include @@ -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, diff --git a/gdb/symfile.h b/gdb/symfile.h index 1d9b7dd49f..3f232ec2b2 100644 --- a/gdb/symfile.h +++ b/gdb/symfile.h @@ -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) */ diff --git a/gdb/utils.c b/gdb/utils.c index 6ad26648bd..b087b52420 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -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;