#include "objfiles.h"
#include "gdbcmd.h"
#include "breakpoint.h"
+#include "language.h"
+#include "complaints.h"
+#include "demangle.h"
#include <obstack.h>
#include <assert.h>
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;
/* Functions this file defines */
+static void
+set_initial_language PARAMS ((void));
+
static void
load_command PARAMS ((char *, int));
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 };
-
\f
/* In the following sort, we always make sure that
register debug symbol declarations always come before regular
if (namediff != 0) return namediff;
/* If they match, compare the rest of the names. */
- namediff = strcmp (SYMBOL_NAME (*s1), SYMBOL_NAME (*s2));
+ namediff = STRCMP (SYMBOL_NAME (*s1), SYMBOL_NAME (*s2));
if (namediff != 0) return namediff;
/* For symbols of the same name, registers should come first. */
}
else
{
- return (strcmp (st1 + 2, st2 + 2));
+ return (STRCMP (st1 + 2, st2 + 2));
}
}
warning ("no loadable sections found in added symbol-file %s",
objfile->name);
else if (0 == bfd_get_section_name (objfile->obfd, lowest_sect)
- || 0 != strcmp(".text",
+ || !STREQ (".text",
bfd_get_section_name (objfile->obfd, lowest_sect)))
warning ("Lowest section in %s is %s at 0x%x",
objfile->name,
addr -= bfd_section_vma (objfile->obfd, lowest_sect);
}
+ {
+ /* Debugging check inserted for testing elimination of NAMES_HAVE_UNDERSCORE.
+ Complain if the dynamic setting of NAMES_HAVE_UNDERSCORE from BFD
+ doesn't match the static setting from the GDB config files, but only
+ if we are using the first BFD target (the default target selected by
+ the same configuration that decided whether NAMES_HAVE_UNDERSCORE is
+ defined or not). For other targets (such as when the user sets GNUTARGET
+ or we are reading a "foreign" object file), it is likely that the value
+ of bfd_get_symbol_leading_char has no relation to the value of
+ NAMES_HAVE_UNDERSCORE for the target for which this gdb was built.
+ Hack alert: the only way to currently do this with bfd is to ask it to
+ produce a list of known target names and compare the first one in the
+ list with the one for the bfd we are using.
+ FIXME: Remove this check after a round of testing.
+ -- gnu@cygnus.com, 16dec92 */
+ CONST char **targets = bfd_target_list ();
+ if (targets != NULL && *targets != NULL)
+ {
+ if (bfd_get_symbol_leading_char (objfile->obfd) !=
+#ifdef NAMES_HAVE_UNDERSCORE
+ '_'
+#else
+ 0
+#endif
+ && STREQ (bfd_get_target (objfile->obfd), *targets))
+ {
+ fprintf (stderr, "GDB internal error! NAMES_HAVE_UNDERSCORE set wrong for %s BFD:\n%s\n",
+ bfd_get_target (objfile->obfd),
+ bfd_get_filename (objfile->obfd));
+ }
+ free (targets);
+ }
+ /* End of debugging check. FIXME. */
+ }
+
/* Initialize symbol reading routines for this objfile, allow complaints to
appear for this new file, and record how verbose to be, then do the
initial symbol reading for this file. */
current_source_line = 0;
if (from_tty)
{
- printf_filtered ("No symbol file now.\n");
+ printf ("No symbol file now.\n");
}
}
else
cleanups = make_cleanup (freeargv, (char *) argv);
while (*argv != NULL)
{
- if (strcmp (*argv, "-mapped") == 0)
+ if (STREQ (*argv, "-mapped"))
{
mapped = 1;
}
- else if (strcmp (*argv, "-readnow") == 0)
+ else if (STREQ (*argv, "-readnow"))
{
readnow = 1;
}
else
{
symbol_file_add (name, from_tty, (CORE_ADDR)0, 1, mapped, readnow);
+ set_initial_language ();
}
do_cleanups (cleanups);
}
}
+/* Set the initial language.
+
+ A better solution would be to record the language in the psymtab when reading
+ partial symbols, and then use it (if known) to set the language. This would
+ be a win for formats that encode the language in an easily discoverable place,
+ such as DWARF. For stabs, we can jump through hoops looking for specially
+ named symbols or try to intuit the language from the specific type of stabs
+ we find, but we can't do that until later when we read in full symbols.
+ FIXME. */
+
+static void
+set_initial_language ()
+{
+ struct partial_symtab *pst;
+ enum language lang = language_unknown;
+
+ pst = find_main_psymtab ();
+ if (pst != NULL)
+ {
+ if (pst -> filename != NULL)
+ {
+ lang = deduce_language_from_filename (pst -> filename);
+ }
+ if (lang == language_unknown)
+ {
+ /* Make C the default language */
+ lang = language_c;
+ }
+ set_language (lang);
+ expected_language = current_language; /* Don't warn the user */
+ }
+}
+
/* Open file specified by NAME and hand it off to BFD for preliminary
analysis. Result is a newly initialized bfd *, which includes a newly
malloc'd` copy of NAME (tilde-expanded and made absolute).
error ("\"%s\": can't open to read symbols: %s.", name,
bfd_errmsg (bfd_error));
}
+ sym_bfd->cacheable = true;
if (!bfd_check_format (sym_bfd, bfd_object))
{
{
name = arg;
}
- else if (strcmp (arg, "-mapped") == 0)
+ else if (STREQ (arg, "-mapped"))
{
mapped = 1;
}
- else if (strcmp (arg, "-readnow") == 0)
+ else if (STREQ (arg, "-readnow"))
{
readnow = 1;
}
if (reread_one)
breakpoint_re_set ();
}
-\f
-/* 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;
-}
\f
enum language
deduce_language_from_filename (filename)
char *c = strrchr (filename, '.');
if (!c) ; /* Get default. */
- else if(!strcmp(c,".mod"))
+ else if(STREQ(c,".mod"))
return language_m2;
- else if(!strcmp(c,".c"))
+ else if(STREQ(c,".c"))
return language_c;
- else if(!strcmp(c,".cc") || !strcmp(c,".C"))
+ else if(STREQ(c,".cc") || STREQ(c,".C"))
return language_cplus;
+ /* start-sanitize-chill */
+ else if(STREQ(c,".ch") || STREQ(c,".c186") || STREQ(c,".c286"))
+ return language_chill;
+ /* end-sanitize-chill */
return language_unknown; /* default */
}
return;
clear_symtab_users_done = clear_symtab_users_queued;
- printf_filtered ("Resetting debugger state after updating old symbol tables\n");
+ printf ("Resetting debugger state after updating old symbol tables\n");
/* Someday, we should do better than this, by only blowing away
the things that really need to be blown. */
again2:
for (ps = partial_symtab_list; ps; ps = ps->next) {
- if (!strcmp (name, ps->filename)) {
+ if (STREQ (name, ps->filename)) {
cashier_psymtab (ps); /* Blow it away...and its little dog, too. */
goto again2; /* Must restart, chain has been munged */
}
for (s = symtab_list; s; s = s->next)
{
- if (!strcmp (name, s->filename))
+ if (STREQ (name, s->filename))
break;
prev = s;
}
/* Debugging versions of functions that are usually inline macros
(see symfile.h). */
-#if 0 /* Don't quite work nowadays... */
+#if !INLINE_ADD_PSYMBOL
/* Add a symbol with a long value to a psymtab.
Since one arg is a struct, we pass in a ptr and deref it (sigh). */
void
-add_psymbol_to_list (name, namelength, namespace, class, list, val)
+add_psymbol_to_list (name, namelength, namespace, class, list, val, language,
+ objfile)
char *name;
int namelength;
enum namespace namespace;
enum address_class class;
struct psymbol_allocation_list *list;
long val;
+ enum language language;
+ struct objfile *objfile;
{
- ADD_PSYMBOL_VT_TO_LIST (name, namelength, namespace, class, (*list), val,
- SYMBOL_VALUE);
+ register struct partial_symbol *psym;
+ register char *demangled_name;
+
+ if (list->next >= list->list + list->size)
+ {
+ extend_psymbol_list (list,objfile);
+ }
+ psym = list->next++;
+
+ SYMBOL_NAME (psym) =
+ (char *) obstack_alloc (&objfile->psymbol_obstack, namelength + 1);
+ memcpy (SYMBOL_NAME (psym), name, namelength);
+ SYMBOL_NAME (psym)[namelength] = '\0';
+ SYMBOL_VALUE (psym) = val;
+ SYMBOL_LANGUAGE (psym) = language;
+ PSYMBOL_NAMESPACE (psym) = namespace;
+ PSYMBOL_CLASS (psym) = class;
+ SYMBOL_INIT_DEMANGLED_NAME (psym, &objfile->psymbol_obstack);
}
/* Add a symbol with a CORE_ADDR value to a psymtab. */
void
-add_psymbol_addr_to_list (name, namelength, namespace, class, list, val)
+add_psymbol_addr_to_list (name, namelength, namespace, class, list, val,
+ language, objfile)
char *name;
int namelength;
enum namespace namespace;
enum address_class class;
struct psymbol_allocation_list *list;
CORE_ADDR val;
+ enum language language;
+ struct objfile *objfile;
{
- ADD_PSYMBOL_VT_TO_LIST (name, namelength, namespace, class, (*list), val,
- SYMBOL_VALUE_ADDRESS);
+ register struct partial_symbol *psym;
+ register char *demangled_name;
+
+ if (list->next >= list->list + list->size)
+ {
+ extend_psymbol_list (list,objfile);
+ }
+ psym = list->next++;
+
+ SYMBOL_NAME (psym) =
+ (char *) obstack_alloc (&objfile->psymbol_obstack, namelength + 1);
+ memcpy (SYMBOL_NAME (psym), name, namelength);
+ SYMBOL_NAME (psym)[namelength] = '\0';
+ SYMBOL_VALUE_ADDRESS (psym) = val;
+ SYMBOL_LANGUAGE (psym) = language;
+ PSYMBOL_NAMESPACE (psym) = namespace;
+ PSYMBOL_CLASS (psym) = class;
+ SYMBOL_INIT_DEMANGLED_NAME (psym, &objfile->psymbol_obstack);
}
-#endif /* 0 */
+#endif /* !INLINE_ADD_PSYMBOL */
+
\f
void
_initialize_symfile ()
"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,