Changes to build misc function vector entries from canonical bfd symbol
authorFred Fish <fnf@specifix.com>
Fri, 15 Nov 1991 03:36:45 +0000 (03:36 +0000)
committerFred Fish <fnf@specifix.com>
Fri, 15 Nov 1991 03:36:45 +0000 (03:36 +0000)
table entries.

gdb/ChangeLog
gdb/dwarfread.c
gdb/elfread.c

index a80c8e2943e7f8ae4e93e9bd58c45b31523cda38..0496791611e7373b985248bd6ee1de2dfa2186c3 100644 (file)
@@ -1,3 +1,22 @@
+Thu Nov 14 19:27:30 1991  Fred Fish  (fnf at cygnus.com)
+
+       * dwarfread.c:  Add misc function type parameter to internal
+       record_misc_function().  Remove calls to init_misc_bunches()
+       and condense_misc_bunches(), these are now done in elfread.c.
+
+       * elfread.c:  Add support for reading bfd canonical symbol tables
+       and generating misc function vector entries for global and
+       absolute symbols.  Do calls to init_misc_bunches() and
+       condense_misc_bunches() where they will enclose all calls to
+       record_misc_function(), including those in dwarfread.c.
+
+Thu Nov 14 17:02:11 1991  Roland H. Pesch  (pesch at cygnus.com)
+
+       * doc/Makefile.in: new targets gdb.me, gdb.ms, gdb.mm
+       (roffable documentation).
+       * doc/gdb.texinfo: embedded hints (as comments) for better
+       texi2roff conversion.
+
 Thu Nov 14 13:18:25 1991  John Gilmore  (gnu at cygnus.com)
 
        * m88k-tdep.c (examine_prologue):  Deal with OR instructions
index 0201945afc5294566e7efcf81babc20af4ea85b7..bfdddc554bb48445aab8ea9e10d84377f51558cf 100644 (file)
@@ -448,7 +448,8 @@ static int
 EXFUN(locval, (char *loc));
 
 static void
-EXFUN(record_misc_function, (char *name AND CORE_ADDR address));
+EXFUN(record_misc_function, (char *name AND CORE_ADDR address AND
+                            enum misc_function_type));
 
 static int
 EXFUN(compare_psymbols,
@@ -522,9 +523,6 @@ DEFUN(dwarf_build_psymtabs,
       init_psymbol_list (1024);
     }
   
-  init_misc_bunches ();
-  make_cleanup (discard_misc_bunches, 0);
-  
   /* Follow the compilation unit sibling chain, building a partial symbol
      table entry for each one.  Save enough information about each compilation
      unit to locate the full DWARF information later. */
@@ -532,10 +530,6 @@ DEFUN(dwarf_build_psymtabs,
   scan_compilation_units (filename, addr, dbbase, dbbase + dbsize,
                          dbfoff, lnoffset, objfile);
   
-  /* Go over the miscellaneous functions and install them in the miscellaneous
-     function vector. */
-  
-  condense_misc_bunches (!mainline);
   do_cleanups (back_to);
 }
 
@@ -548,7 +542,8 @@ LOCAL FUNCTION
 
 SYNOPSIS
 
-       static void record_misc_function (char *name, CORE_ADDR address)
+       static void record_misc_function (char *name, CORE_ADDR address,
+                                         enum misc_function_type mf_type)
 
 DESCRIPTION
 
@@ -557,17 +552,14 @@ DESCRIPTION
        symbol, records this information for later use in building the
        miscellaneous function vector.
 
-NOTES
-
-       FIXME:  For now we just use mf_text as the type.  This should be
-       fixed.
  */
 
 static void
-DEFUN(record_misc_function, (name, address), char *name AND CORE_ADDR address)
+DEFUN(record_misc_function, (name, address, mf_type),
+      char *name AND CORE_ADDR address AND enum misc_function_type mf_type)
 {
   prim_record_misc_function (obsavestring (name, strlen (name)), address,
-                            mf_text);
+                            mf_type);
 }
 
 /*
@@ -2615,11 +2607,13 @@ DEFUN(add_partial_symbol, (dip), struct dieinfo *dip)
   switch (dip -> dietag)
     {
     case TAG_global_subroutine:
-      record_misc_function (dip -> at_name, dip -> at_low_pc);
+      record_misc_function (dip -> at_name, dip -> at_low_pc, mf_text);
       add_psymbol_to_list (&global_psymbols, dip -> at_name, VAR_NAMESPACE,
                           LOC_BLOCK, dip -> at_low_pc);
       break;
     case TAG_global_variable:
+      record_misc_function (dip -> at_name, locval (dip -> at_location),
+                           mf_data);
       add_psymbol_to_list (&global_psymbols, dip -> at_name, VAR_NAMESPACE,
                           LOC_STATIC, 0);
       break;
index 49b5d3415f5b137a332d7359f9348f76ad7cd699..d203e2e9b5847dcd78e63dc3fb5ecc9854f2b80b 100644 (file)
@@ -94,6 +94,71 @@ DEFUN(elf_locate_sections, (abfd, sectp, ei),
     }
 }
 
+/*
+
+LOCAL FUNCTION
+
+       record_misc_function -- add entry to miscellaneous function vector
+
+SYNOPSIS
+
+       static void record_misc_function (char *name, CORE_ADDR address)
+
+DESCRIPTION
+
+       Given a pointer to the name of a symbol that should be added to the
+       miscellaneous function vector, and the address associated with that
+       symbol, records this information for later use in building the
+       miscellaneous function vector.
+
+NOTES
+
+       FIXME:  For now we just use mf_unknown as the type.  This should be
+       fixed.
+ */
+
+static void
+DEFUN(record_misc_function, (name, address), char *name AND CORE_ADDR address)
+{
+  prim_record_misc_function (obsavestring (name, strlen (name)), address,
+                            mf_unknown);
+}
+
+static void
+DEFUN (elf_symtab_read, (abfd, addr),
+       bfd *abfd AND
+       CORE_ADDR addr)
+{
+  unsigned int storage_needed;
+  asymbol *sym;
+  asymbol **symbol_table;
+  unsigned int number_of_symbols;
+  unsigned int i;
+  struct cleanup *back_to;
+  
+  storage_needed = get_symtab_upper_bound (abfd);
+
+  if (storage_needed > 0)
+    {
+      symbol_table = (asymbol **) bfd_xmalloc (storage_needed);
+      back_to = make_cleanup (free, symbol_table);
+      number_of_symbols = bfd_canonicalize_symtab (abfd, symbol_table); 
+  
+      for (i = 0; i < number_of_symbols; i++)
+       {
+         sym = *symbol_table++;
+         /* Select global symbols that are defined in a specific section
+            or are absolute. */
+         if (sym -> flags & BSF_GLOBAL
+             && ((sym -> section != NULL) || (sym -> flags & BSF_ABSOLUTE)))
+           {
+             record_misc_function ((char *) sym -> name, sym -> value);
+           }
+       }
+      do_cleanups (back_to);
+    }
+}
+
 /* Scan and build partial symbols for a symbol file.
    We have been initialized by a call to elf_symfile_init, which 
    currently does nothing.
@@ -111,7 +176,14 @@ DEFUN(elf_locate_sections, (abfd, sectp, ei),
    file, the corresponding partial symbol table is mutated into a full
    fledged symbol table by going back and reading the symbols
    for real.  The function dwarf_psymtab_to_symtab() is the function that
-   does this for DWARF symbols. */
+   does this for DWARF symbols.
+
+   Note that ELF files have a "minimal" symbol table, which looks a lot
+   like a COFF symbol table, but has only the minimal information necessary
+   for linking.  We process this also, and just use the information to
+   add to the misc function vector.  This gives us some minimal debugging
+   capability even for files compiled without -g.
+ */
 
 static void
 DEFUN(elf_symfile_read, (sf, addr, mainline),
@@ -121,7 +193,19 @@ DEFUN(elf_symfile_read, (sf, addr, mainline),
 {
   bfd *abfd = sf->objfile->obfd;
   struct elfinfo ei;
+  struct cleanup *back_to;
 
+  init_misc_bunches ();
+  back_to = make_cleanup (discard_misc_bunches, 0);
+
+  /* Process the normal ELF symbol table first. */
+
+  elf_symtab_read (abfd, addr);
+
+  /* Now process the DWARF debugging information, which is contained in
+     special ELF sections.  We first have to find them... */
+
+  (void) memset ((char *) &ei, 0, sizeof (ei));
   bfd_map_over_sections (abfd, elf_locate_sections, &ei);
   if (ei.dboffset && ei.lnoffset)
     {
@@ -132,12 +216,19 @@ DEFUN(elf_symfile_read, (sf, addr, mainline),
                            ei.dboffset, ei.dbsize,
                            ei.lnoffset, ei.lnsize, sf->objfile);
     }
+
   if (!partial_symtab_list)
     {
       wrap_here ("");
       printf_filtered ("(no debugging symbols found)...");
       wrap_here ("");
     }
+
+  /* Go over the miscellaneous functions and install them in the
+     miscellaneous function vector. */
+  
+  condense_misc_bunches (!mainline);
+  do_cleanups (back_to);
 }
 
 /* Initialize anything that needs initializing when a completely new symbol