aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorJohn Gilmore <gnu@cygnus>1993-04-15 09:41:59 +0000
committerJohn Gilmore <gnu@cygnus>1993-04-15 09:41:59 +0000
commit65ce5df44f4afe44894bca3064a7aa685b7d6039 (patch)
tree025e54c0d6c6770cbaaadf3ed029bd079eedb183 /gdb
parent4d7f562d49fb955a55771b2ca09e8952ab5f8ada (diff)
downloadgdb-65ce5df44f4afe44894bca3064a7aa685b7d6039.zip
gdb-65ce5df44f4afe44894bca3064a7aa685b7d6039.tar.gz
gdb-65ce5df44f4afe44894bca3064a7aa685b7d6039.tar.bz2
* dbxread.c (unknown_symchar_complaint): Add new complaint.
* stabsread.c: Declare it. * partial-stab.h: Use it. * utils.c (malloc_botch): Don't forward-declare if NO_MMALLOC.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/dbxread.c76
-rw-r--r--gdb/partial-stab.h9
-rw-r--r--gdb/utils.c111
4 files changed, 101 insertions, 103 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 0f611b1..86180bf 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,11 @@
+Thu Apr 15 02:37:48 1993 John Gilmore (gnu@cacophony.cygnus.com)
+
+ * dbxread.c (unknown_symchar_complaint): Add new complaint.
+ * stabsread.c: Declare it.
+ * partial-stab.h: Use it.
+
+ * utils.c (malloc_botch): Don't forward-declare if NO_MMALLOC.
+
Wed Apr 14 17:12:51 1993 Jim Kingdon (kingdon@cygnus.com)
* stack.c (print_frame_info): Print specially if dummy frame.
diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index 3f9334b..302d9cb 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -1,5 +1,6 @@
/* Read dbx symbol tables and convert to internal format, for GDB.
- Copyright 1986, 1987, 1988, 1989, 1990, 1991 Free Software Foundation, Inc.
+ Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993
+ Free Software Foundation, Inc.
This file is part of GDB.
@@ -165,6 +166,9 @@ struct complaint string_table_offset_complaint =
struct complaint unknown_symtype_complaint =
{"unknown symbol type %s", 0, 0};
+struct complaint unknown_symchar_complaint =
+ {"unknown symbol type character `%c'", 0, 0};
+
struct complaint lbrac_rbrac_complaint =
{"block start larger than block end", 0, 0};
@@ -561,6 +565,9 @@ dbx_symfile_init (objfile)
if (STRING_TABLE_OFFSET == 0)
{
+ /* It appears that with the existing bfd code, STRING_TABLE_OFFSET
+ will never be zero, even when there is no string table. This
+ would appear to be a bug in bfd. */
DBX_STRINGTAB_SIZE (objfile) = 0;
DBX_STRINGTAB (objfile) = NULL;
}
@@ -573,28 +580,47 @@ dbx_symfile_init (objfile)
memset ((PTR) size_temp, 0, sizeof (size_temp));
val = bfd_read ((PTR) size_temp, sizeof (size_temp), 1, sym_bfd);
if (val < 0)
- perror_with_name (name);
-
- DBX_STRINGTAB_SIZE (objfile) = bfd_h_get_32 (sym_bfd, size_temp);
-
- if (DBX_STRINGTAB_SIZE (objfile) < sizeof (size_temp)
- || DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
- error ("ridiculous string table size (%d bytes).",
- DBX_STRINGTAB_SIZE (objfile));
-
- DBX_STRINGTAB (objfile) =
- (char *) obstack_alloc (&objfile -> psymbol_obstack,
- DBX_STRINGTAB_SIZE (objfile));
-
- /* Now read in the string table in one big gulp. */
-
- val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
- if (val < 0)
- perror_with_name (name);
- val = bfd_read (DBX_STRINGTAB (objfile), DBX_STRINGTAB_SIZE (objfile), 1,
- sym_bfd);
- if (val != DBX_STRINGTAB_SIZE (objfile))
- perror_with_name (name);
+ {
+ perror_with_name (name);
+ }
+ else if (val == 0)
+ {
+ /* With the existing bfd code, STRING_TABLE_OFFSET will be set to
+ EOF if there is no string table, and attempting to read the size
+ from EOF will read zero bytes. */
+ DBX_STRINGTAB_SIZE (objfile) = 0;
+ DBX_STRINGTAB (objfile) = NULL;
+ }
+ else
+ {
+ /* Read some data that would appear to be the string table size.
+ If there really is a string table, then it is probably the right
+ size. Byteswap if necessary and validate the size. Note that
+ the minimum is DBX_STRINGTAB_SIZE_SIZE. If we just read some
+ random data that happened to be at STRING_TABLE_OFFSET, because
+ bfd can't tell us there is no string table, the sanity checks may
+ or may not catch this. */
+ DBX_STRINGTAB_SIZE (objfile) = bfd_h_get_32 (sym_bfd, size_temp);
+
+ if (DBX_STRINGTAB_SIZE (objfile) < sizeof (size_temp)
+ || DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
+ error ("ridiculous string table size (%d bytes).",
+ DBX_STRINGTAB_SIZE (objfile));
+
+ DBX_STRINGTAB (objfile) =
+ (char *) obstack_alloc (&objfile -> psymbol_obstack,
+ DBX_STRINGTAB_SIZE (objfile));
+
+ /* Now read in the string table in one big gulp. */
+
+ val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
+ if (val < 0)
+ perror_with_name (name);
+ val = bfd_read (DBX_STRINGTAB (objfile), DBX_STRINGTAB_SIZE (objfile), 1,
+ sym_bfd);
+ if (val != DBX_STRINGTAB_SIZE (objfile))
+ perror_with_name (name);
+ }
}
}
@@ -1421,7 +1447,7 @@ read_ofile_symtab (objfile, sym_offset, sym_size, text_offset, text_size,
if (last_source_start_addr == 0)
last_source_start_addr = text_offset;
- rtn = end_symtab (text_offset + text_size, 0, 0, objfile);
+ rtn = end_symtab (text_offset + text_size, 0, 0, objfile, SECT_OFF_TEXT);
end_stabs ();
return (rtn);
}
@@ -1668,7 +1694,7 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
patch_subfile_names (current_subfile, name);
break; /* Ignore repeated SOs */
}
- end_symtab (valu, 0, 0, objfile);
+ end_symtab (valu, 0, 0, objfile, SECT_OFF_TEXT);
end_stabs ();
}
start_stabs ();
diff --git a/gdb/partial-stab.h b/gdb/partial-stab.h
index d69f7f6..e083143 100644
--- a/gdb/partial-stab.h
+++ b/gdb/partial-stab.h
@@ -1,6 +1,6 @@
/* Shared code to pre-read a stab (dbx-style), when building a psymtab.
- Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992 Free Software Foundation,
- Inc.
+ Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993
+ Free Software Foundation, Inc.
This file is part of GDB.
@@ -518,9 +518,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
/* Global functions were ignored here, but now they
are put into the global psymtab like one would expect.
- They're also in the misc fn vector...
- FIXME, why did it used to ignore these? That broke
- "i fun" on these functions. */
+ They're also in the minimal symbol table. */
case 'F':
#ifdef DBXREAD_ONLY
/* Kludges for ELF/STABS with Sun ACC */
@@ -563,6 +561,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
Someone says sun cc puts out symbols like
/foo/baz/maclib::/usr/local/bin/maclib,
which would get here with a symbol type of ':'. */
+ complain (&unknown_symchar_complaint, p[1]);
continue;
}
diff --git a/gdb/utils.c b/gdb/utils.c
index 895a62a..b69b214 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -38,12 +38,13 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
/* Prototypes for local functions */
-#if !defined (NO_MALLOC_CHECK)
+#if defined (NO_MMALLOC) || defined (NO_MMALLOC_CHECK)
+#else
static void
malloc_botch PARAMS ((void));
-#endif /* NO_MALLOC_CHECK */
+#endif /* NO_MMALLOC, etc */
static void
fatal_dump_core (); /* Can't prototype with <varargs.h> usage... */
@@ -1135,53 +1136,6 @@ fputs_filtered (linebuffer, stream)
}
}
-
-/* fputs_demangled attempts to demangle NAME, a symbol in language LANG, using
- demangling args ARG_MODE, and print it filtered to STREAM. If the name is
- not mangled, or the language for the name is unknown, or demangling is off,
- the name is printed in its "raw" form. */
-
-void
-fputs_demangled (name, stream, arg_mode, lang)
- char *name;
- FILE *stream;
- int arg_mode;
- enum language lang;
-{
- char *demangled;
-
- if (name != NULL)
- {
- /* If user wants to see raw output, no problem. */
- if (!demangle)
- {
- fputs_filtered (name, stream);
- }
- else
- {
- switch (lang)
- {
- case language_cplus:
- demangled = cplus_demangle (name, arg_mode);
- break;
- /* start-sanitize-chill */
- case language_chill:
- demangled = chill_demangle (name);
- break;
- /* end-sanitize-chill */
- default:
- demangled = NULL;
- break;
- }
- fputs_filtered (demangled ? demangled : name, stream);
- if (demangled != NULL)
- {
- free (demangled);
- }
- }
- }
-}
-
/* Print a variable number of ARGS using format FORMAT. If this
information is going to put the amount written (since the last call
to REINITIALIZE_MORE_FILTER or the last page break) over the page size,
@@ -1366,38 +1320,49 @@ print_spaces_filtered (n, stream)
/* C++ demangler stuff. */
-/* Print NAME on STREAM, demangling if necessary. */
+/* fprintf_symbol_filtered attempts to demangle NAME, a symbol in language
+ LANG, using demangling args ARG_MODE, and print it filtered to STREAM.
+ If the name is not mangled, or the language for the name is unknown, or
+ demangling is off, the name is printed in its "raw" form. */
+
void
-fprint_symbol (stream, name)
+fprintf_symbol_filtered (stream, name, lang, arg_mode)
FILE *stream;
char *name;
+ enum language lang;
+ int arg_mode;
{
- char *demangled = NULL;
+ char *demangled;
- if (demangle)
+ if (name != NULL)
{
- /* Lacking a better method of knowing what demangler to use, pick
- one appropriate for whatever the current language is. (FIXME) */
- switch (current_language -> la_language)
+ /* If user wants to see raw output, no problem. */
+ if (!demangle)
{
- case language_cplus:
- demangled = cplus_demangle (name, DMGL_PARAMS | DMGL_ANSI);
- break;
- /* start-sanitize-chill */
- case language_chill:
- demangled = chill_demangle (name);
- break;
- /* end-sanitize-chill */
+ fputs_filtered (name, stream);
+ }
+ else
+ {
+ switch (lang)
+ {
+ case language_cplus:
+ demangled = cplus_demangle (name, arg_mode);
+ break;
+ /* start-sanitize-chill */
+ case language_chill:
+ demangled = chill_demangle (name);
+ break;
+ /* end-sanitize-chill */
+ default:
+ demangled = NULL;
+ break;
+ }
+ fputs_filtered (demangled ? demangled : name, stream);
+ if (demangled != NULL)
+ {
+ free (demangled);
+ }
}
- }
- if (demangled == NULL)
- {
- fputs_filtered (name, stream);
- }
- else
- {
- fputs_filtered (demangled, stream);
- free (demangled);
}
}