/* Generic symbol file reading for the GNU debugger, GDB.
- Copyright 1990, 1991, 1992 Free Software Foundation, Inc.
+ Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
Contributed by Cygnus Support, using pieces from other GDB modules.
This file is part of GDB.
#include "breakpoint.h"
#include "language.h"
#include "complaints.h"
+#include "demangle.h"
#include <obstack.h>
#include <assert.h>
#include <sys/stat.h>
#include <ctype.h>
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
/* Global variables owned by this file */
int readnow_symbol_files; /* Read full symbols immediately */
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));
}
}
struct section_offsets *section_offsets;
asection *lowest_sect;
- /* There is a distinction between having no symbol table
- (we refuse to read the file, leaving the old set of symbols around)
- and having no debugging symbols in your symbol table (we read
- the file and end up with a mostly empty symbol table).
-
- FIXME: This strategy works correctly when the debugging symbols are
- intermixed with "normal" symbols. However, when the debugging symbols
- are separate, such as with ELF/DWARF, it is perfectly plausible for
- the symbol table to be missing but still have all the DWARF info
- intact. Thus in general it is wrong to assume that having no symbol
- table implies no debugging information. */
-
- if (!(bfd_get_file_flags (objfile -> obfd) & HAS_SYMS))
- return;
-
init_entry_point_info (objfile);
find_sym_fns (objfile);
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.
- FIXME: Remove this check after a round of testing.
- -- gnu@cygnus.com, 16dec92 */
-#ifdef NAMES_HAVE_UNDERSCORE
- if (bfd_get_symbol_leading_char(objfile->obfd) != '_')
-#else
- if (bfd_get_symbol_leading_char(objfile->obfd) != 0)
-#endif
- fprintf (stderr,
- "GDB internal error! NAMES_HAVE_UNDERSCORE set wrong for %s BFD:\n%s\n",
- objfile->obfd->xvec->name,
- objfile->obfd->filename);
- /* 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. */
(*objfile -> sf -> sym_init) (objfile);
clear_complaints (1, verbo);
+
+ /* If objfile->sf->sym_offsets doesn't set this, we don't care
+ (currently). */
+ objfile->num_sections = 0; /* krp-FIXME: why zero? */
section_offsets = (*objfile -> sf -> sym_offsets) (objfile, addr);
+ objfile->section_offsets = section_offsets;
+
+#ifndef IBM6000_TARGET
+ /* This is a SVR4/SunOS specific hack, I think. In any event, it
+ screws RS/6000. sym_offsets should be doing this sort of thing,
+ because it knows the mapping between bfd sections and
+ section_offsets. */
+ /* This is a hack. As far as I can tell, section offsets are not
+ target dependent. They are all set to addr with a couple of
+ exceptions. The exceptions are sysvr4 shared libraries, whose
+ offsets are kept in solib structures anyway and rs6000 xcoff
+ which handles shared libraries in a completely unique way.
+
+ Section offsets are built similarly, except that they are built
+ by adding addr in all cases because there is no clear mapping
+ from section_offsets into actual sections. Note that solib.c
+ has a different algorythm for finding section offsets.
+
+ These should probably all be collapsed into some target
+ independent form of shared library support. FIXME. */
+
+ if (addr)
+ {
+ struct obj_section *s;
+
+ for (s = objfile->sections; s < objfile->sections_end; ++s)
+ {
+ s->addr -= s->offset;
+ s->addr += addr;
+ s->endaddr -= s->offset;
+ s->endaddr += addr;
+ s->offset += addr;
+ }
+ }
+#endif /* not IBM6000_TARGET */
+
(*objfile -> sf -> sym_read) (objfile, section_offsets, mainline);
/* Don't allow char * to have a typename (else would get caddr_t.) */
struct partial_symtab *psymtab;
bfd *abfd;
- /* Open a bfd for the file and then check to see if the file has a
- symbol table. There is a distinction between having no symbol table
- (we refuse to read the file, leaving the old set of symbols around)
- and having no debugging symbols in the symbol table (we read the file
- and end up with a mostly empty symbol table, but with lots of stuff in
- the minimal symbol table). We need to make the decision about whether
- to continue with the file before allocating and building a objfile.
-
- FIXME: This strategy works correctly when the debugging symbols are
- intermixed with "normal" symbols. However, when the debugging symbols
- are separate, such as with ELF/DWARF, it is perfectly plausible for
- the symbol table to be missing but still have all the DWARF info
- intact. Thus in general it is wrong to assume that having no symbol
- table implies no debugging information. */
+ /* Open a bfd for the file, and give user a chance to burp if we'd be
+ interactively wiping out any existing symbols. */
abfd = symfile_bfd_open (name);
- if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
- {
- error ("%s has no symbol-table", name);
- }
if ((have_full_symbols () || have_partial_symbols ())
&& mainline
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;
}
name = tilde_expand (name); /* Returns 1st new malloc'd copy */
/* Look down path for it, allocate 2nd new malloc'd copy. */
- desc = openp (getenv ("PATH"), 1, name, O_RDONLY, 0, &absolute_name);
+ desc = openp (getenv ("PATH"), 1, name, O_RDONLY | O_BINARY, 0, &absolute_name);
if (desc < 0)
{
make_cleanup (free, name);
{
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;
}
deduce_language_from_filename (filename)
char *filename;
{
- char *c = strrchr (filename, '.');
+ char *c;
- if (!c) ; /* Get default. */
- else if(!strcmp(c,".mod"))
- return language_m2;
- else if(!strcmp(c,".c"))
- 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 */
+ if (0 == filename)
+ ; /* Get default */
+ else if (0 == (c = strrchr (filename, '.')))
+ ; /* Get default. */
+ else if(STREQ(c,".mod"))
+ return language_m2;
+ else if(STREQ(c,".c"))
+ return language_c;
+ else if(STREQ(c,".cc") || STREQ(c,".C"))
+ return language_cplus;
+ else if(STREQ(c,".ch") || STREQ(c,".c186") || STREQ(c,".c286"))
+ return language_chill;
return language_unknown; /* default */
}
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 ()