diff options
-rw-r--r-- | gdb/coffread.c | 21 | ||||
-rw-r--r-- | gdb/cplus-dem.c | 9 | ||||
-rw-r--r-- | gdb/symfile.c | 79 | ||||
-rw-r--r-- | gdb/values.c | 5 |
4 files changed, 58 insertions, 56 deletions
diff --git a/gdb/coffread.c b/gdb/coffread.c index 54ca80b..c695056 100644 --- a/gdb/coffread.c +++ b/gdb/coffread.c @@ -689,6 +689,7 @@ static bfd *symfile_bfd; /* FIXME! Addr and Mainline are not used yet -- this will not work for shared libraries or add_file! */ +/* ARGSUSED */ void coff_symfile_read (sf, addr, mainline) struct sym_fns *sf; @@ -756,7 +757,7 @@ coff_symfile_read (sf, addr, mainline) /* Go over the misc symbol bunches and install them in vector. */ - condense_misc_bunches (0); + condense_misc_bunches (!mainline); /* Make a default for file to list. */ @@ -764,12 +765,6 @@ coff_symfile_read (sf, addr, mainline) } void -coff_symfile_discard () -{ - /* There seems to be nothing to do here. */ -} - -void coff_new_init () { /* There seems to be nothing to do except free_all_symtabs and set @@ -1322,6 +1317,12 @@ init_lineno (chan, offset, size) { int val; + linetab_offset = offset; + linetab_size = size; + + if (size == 0) + return 0; + if (lseek (chan, offset, 0) < 0) return -1; @@ -1331,8 +1332,6 @@ init_lineno (chan, offset, size) if (val != size) return -1; - linetab_offset = offset; - linetab_size = size; make_cleanup (free, linetab); /* Be sure it gets de-allocated. */ return 0; } @@ -1935,6 +1934,7 @@ read_struct_type (index, length, lastsym) Also defines the symbols that represent the values of the type. */ /* Currently assumes it's sizeof (int) and doesn't use length. */ +/* ARGSUSED */ static struct type * read_enum_type (index, length, lastsym) int index; @@ -2033,8 +2033,7 @@ static struct sym_fns coff_sym_fns = #else /* not TDESC */ "coff", 4, #endif /* not TDESC */ - coff_new_init, coff_symfile_init, - coff_symfile_read, coff_symfile_discard + coff_new_init, coff_symfile_init, coff_symfile_read, }; void diff --git a/gdb/cplus-dem.c b/gdb/cplus-dem.c index d303ea4..33b46ab 100644 --- a/gdb/cplus-dem.c +++ b/gdb/cplus-dem.c @@ -249,8 +249,7 @@ cplus_demangle (type, arg_mode) /* destructor */ if (type[0] == '_' && type[1] == CPLUS_MARKER && type[2] == '_') { - int n = (strlen (type) - 3)*2 + 3 + 2 + 1; - char *tem = (char *) xmalloc (n); + char *tem = (char *) xmalloc ((strlen (type) - 3)*2 + 3 + 2 + 1); strcpy (tem, type + 3); strcat (tem, "::~"); strcat (tem, type + 3); @@ -260,8 +259,7 @@ cplus_demangle (type, arg_mode) /* static data member */ if (*type != '_' && (p = strchr (type, CPLUS_MARKER)) != NULL) { - int n = strlen (type) + 2; - char *tem = (char *) xmalloc (n); + char *tem = (char *) xmalloc (strlen (type) + 2); memcpy (tem, type, p - type); strcpy (tem + (p - type), "::"); strcpy (tem + (p - type) + 2, p + 1); @@ -270,8 +268,7 @@ cplus_demangle (type, arg_mode) /* virtual table "_vt$" */ if (type[0] == '_' && type[1] == 'v' && type[2] == 't' && type[3] == CPLUS_MARKER) { - int n = strlen (type + 4) + 14 + 1; - char *tem = (char *) xmalloc (n); + char *tem = (char *) xmalloc (strlen (type + 4) + 14 + 1); strcpy (tem, type + 4); strcat (tem, " virtual table"); return tem; diff --git a/gdb/symfile.c b/gdb/symfile.c index 1964417..f6ecf29 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -4,19 +4,19 @@ This file is part of GDB. -GDB is free software; you can redistribute it and/or modify +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 1, or (at your option) -any later version. +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. -GDB is distributed in the hope that it will be useful, +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 GDB; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <stdio.h> #include "defs.h" @@ -53,7 +53,10 @@ static void clear_symtab_users_once(); struct sym_fns *symtab_fns = NULL; /* Saves the sym_fns of the current symbol table, so we can call - the right sym_discard function when we free it. */ + the right XXX_new_init function when we free it. FIXME. This + should be extended to calling the new_init function for each + existing symtab or psymtab, since the main symbol file and + subsequent added symbol files can have different types. */ static struct sym_fns *symfile_fns; @@ -87,6 +90,15 @@ long /* really time_t */ symfile_mtime = 0; struct psymbol_allocation_list global_psymbols = {0}, static_psymbols = {0}; +/* Flag for whether user will be reloading symbols multiple times. + Defaults to ON for VxWorks, otherwise OFF. */ + +#ifdef SYMBOL_RELOADING_DEFAULT +int symbol_reloading = SYMBOL_RELOADING_DEFAULT; +#else +int symbol_reloading = 0; +#endif + /* Structure to manage complaints about symbol file contents. */ struct complaint complaint_root[1] = { @@ -364,15 +376,7 @@ psymtab_to_symtab (pst) (*pst->read_symtab) (pst); } - /* Search through list for correct name. */ - for (result = symtab_list; result; result = result->next) - if (!strcmp (result->filename, pst->filename)) - { - pst->symtab = result; /* Remember where it was. */ - return result; - } - - return 0; + return pst->symtab; } /* Process a symbol file, as either the main file or as a dynamically @@ -422,7 +426,7 @@ symbol_file_add (name, from_tty, addr, mainline) if (from_tty) { - printf_filtered ("Reading symbol data from %s...", name); + printf_filtered ("Reading symbols from %s...", name); wrap_here (""); fflush (stdout); } @@ -607,31 +611,22 @@ load_command (arg, from_tty) target_load (arg, from_tty); } -/* This function runs the add_syms command of our current target. */ - -void -add_symbol_file_command (args, from_tty) - char *args; - int from_tty; -{ - /* Getting new symbols may change our opinion about what is - frameless. */ - reinit_frame_cache (); - - target_add_syms (args, from_tty); -} - -/* This function allows the addition of incrementally linked object files. */ +/* This function allows the addition of incrementally linked object files. + It does not modify any state in the target, only in the debugger. */ /* ARGSUSED */ void -add_syms_addr_command (arg_string, from_tty) - char* arg_string; +add_symbol_file_command (arg_string, from_tty) + char *arg_string; int from_tty; { char *name; CORE_ADDR text_addr; + /* Getting new symbols may change our opinion about what is + frameless. */ + reinit_frame_cache (); + if (arg_string == 0) error ("add-symbol-file takes a file name and an address"); @@ -709,9 +704,10 @@ fill_in_vptr_fieldno (type) /* Functions to handle complaints during symbol reading. */ /* How many complaints about a particular thing should be printed before - we stop whining about it? */ + we stop whining about it? Default is no whining at all, since so many + systems have ill-constructed symbol files. */ -static unsigned stop_whining = 1; +static unsigned stop_whining = 0; /* Print a complaint about the input symbols, and link the complaint block into a chain for later handling. Result is 1 if the complaint was @@ -864,6 +860,10 @@ free_named_symtabs (name) struct blockvector *bv; int blewit = 0; + /* We only wack things if the symbol-reload switch is set. */ + if (!symbol_reloading) + return 0; + /* Some symbol formats have trouble providing file names... */ if (name == 0 || *name == '\0') return 0; @@ -957,6 +957,13 @@ for access from GDB."); &setlist), &showlist); + add_show_from_set + (add_set_cmd ("symbol-reloading", class_support, var_boolean, + (char *)&symbol_reloading, + "Set dynamic symbol table reloading multiple times in one run.", + &setlist), + &showlist); + obstack_init (symbol_obstack); obstack_init (psymbol_obstack); } diff --git a/gdb/values.c b/gdb/values.c index 34c64b3..dd53a86 100644 --- a/gdb/values.c +++ b/gdb/values.c @@ -1015,7 +1015,6 @@ value_headof (arg, btype, dtype) /* Now search through the virtual function table. */ entry = value_ind (vtbl); - entry_type = VALUE_TYPE (entry); nelems = longest_to_int (value_as_long (value_field (entry, 2))); for (i = 1; i <= nelems; i++) { @@ -1372,8 +1371,8 @@ modify_field (addr, fieldval, bitpos, bitsize) /* Reject values too big to fit in the field in question, otherwise adjoining fields may be corrupted. */ - if ((0 != fieldval & ~((1<<bitsize)-1)) - && bitsize < 8 * sizeof (fieldval)) + if (bitsize < (8 * sizeof (fieldval)) + && 0 != (fieldval & ~((1<<bitsize)-1))) error ("Value %d does not fit in %d bits.", fieldval, bitsize); bcopy (addr, &oword, sizeof oword); |