* osfsolib.c, remote-sim.c, remote.c, solib.c, xcoffexec.c,
authorFred Fish <fnf@specifix.com>
Fri, 8 Oct 1993 23:04:45 +0000 (23:04 +0000)
committerFred Fish <fnf@specifix.com>
Fri, 8 Oct 1993 23:04:45 +0000 (23:04 +0000)
xcoffsolib.h:  Use 'abfd' for bfd variables instead of 'bfd'.
Sun cc doesn't like variable names that match their typedef'd type.

gdb/ChangeLog
gdb/osfsolib.c
gdb/remote-sim.c
gdb/solib.c
gdb/xcoffexec.c
gdb/xcoffsolib.h

index f187228..93f15d9 100644 (file)
@@ -1,3 +1,9 @@
+Fri Oct  8 15:54:06 1993  Fred Fish  (fnf@deneb.cygnus.com)
+
+       * osfsolib.c, remote-sim.c, remote.c, solib.c, xcoffexec.c, 
+       xcoffsolib.h:  Use 'abfd' for bfd variables instead of 'bfd'.
+       Sun cc doesn't like variable names that match their typedef'd type.
+
 Fri Oct  8 14:56:21 1993  Jim Kingdon  (kingdon@lioth.cygnus.com)
 
        * inflow.c: Remove unused includes of sys/param.h, etc.
index a27243d..98224ef 100644 (file)
@@ -96,7 +96,7 @@ struct so_list {
   struct section_table *sections;
   struct section_table *sections_end;
   struct section_table *textsection;
-  bfd *bfd;
+  bfd *abfd;
 };
 
 static struct so_list *so_list_head;   /* List of known shared objects */
@@ -195,7 +195,7 @@ solib_map_sections (so)
             scratch_pathname, bfd_errmsg (bfd_error));
     }
   /* Leave bfd open, core_xfer_memory and "info files" need it.  */
-  so -> bfd = abfd;
+  so -> abfd = abfd;
   abfd -> cacheable = true;
 
   if (!bfd_check_format (abfd, bfd_object))
@@ -670,10 +670,10 @@ clear_solib()
        {
          free ((PTR)so_list_head -> sections);
        }
-      if (so_list_head -> bfd)
+      if (so_list_head -> abfd)
        {
-         bfd_filename = bfd_get_filename (so_list_head -> bfd);
-         bfd_close (so_list_head -> bfd);
+         bfd_filename = bfd_get_filename (so_list_head -> abfd);
+         bfd_close (so_list_head -> abfd);
        }
       else
        /* This happens for the executable on SVR4.  */
index 7148e4d..bfde87e 100644 (file)
@@ -165,7 +165,7 @@ gdbsim_load (prog, fromtty)
  * This is a utility routine that sim_load() can call to do the work.
  * The result is 0 for success, non-zero for failure.
  *
- * Eg: int sim_load (bfd *bfd, char *prog) { return sim_load_standard (bfd); }
+ * Eg: int sim_load (bfd *abfd, char *prog) { return sim_load_standard (abfd); }
  */
 
 sim_load_standard (abfd)
index 417fb60..1b50615 100644 (file)
@@ -42,6 +42,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "frame.h"
 #include "regex.h"
 #include "inferior.h"
+#include "language.h"
 
 #define MAX_PATH_SIZE 256              /* FIXME: Should be dynamic */
 
@@ -57,6 +58,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #define BKPT_AT_SYMBOL 1
 
+#if defined (BKPT_AT_SYMBOL) && defined (SVR4_SHARED_LIBS)
 static char *bkpt_names[] = {
 #ifdef SOLIB_BKPT_NAME
   SOLIB_BKPT_NAME,             /* Prefer configured name if it exists. */
@@ -65,6 +67,7 @@ static char *bkpt_names[] = {
   "main",
   NULL
 };
+#endif
 
 /* local data declarations */
 
@@ -103,7 +106,7 @@ struct so_list {
   struct section_table *sections;
   struct section_table *sections_end;
   struct section_table *textsection;
-  bfd *bfd;
+  bfd *abfd;
 };
 
 static struct so_list *so_list_head;   /* List of known shared objects */
@@ -212,9 +215,9 @@ solib_map_sections (so)
     {
       perror_with_name (filename);
     }
-  /* Leave scratch_pathname allocated.  bfd->name will point to it.  */
+  /* Leave scratch_pathname allocated.  abfd->name will point to it.  */
 
-  abfd = bfd_fdopenr (scratch_pathname, NULL, scratch_chan);
+  abfd = bfd_fdopenr (scratch_pathname, gnutarget, scratch_chan);
   if (!abfd)
     {
       close (scratch_chan);
@@ -222,7 +225,7 @@ solib_map_sections (so)
             scratch_pathname, bfd_errmsg (bfd_error));
     }
   /* Leave bfd open, core_xfer_memory and "info files" need it.  */
-  so -> bfd = abfd;
+  so -> abfd = abfd;
   abfd -> cacheable = true;
 
   if (!bfd_check_format (abfd, bfd_object))
@@ -259,37 +262,16 @@ solib_map_sections (so)
 
 #ifndef SVR4_SHARED_LIBS
 
-/* This routine can be a real performance hog.  According to some gprof data
-   which mtranle@paris.IntelliCorp.COM (Minh Tran-Le) sent, almost all the
-   time spend in solib_add (up to 20 minutes with 35 shared libraries) is
-   spent here, with 5/6 in lookup_minimal_symbol and 1/6 in read_memory.
-
-   Possible solutions:
-
-   * Hash the minimal symbols.
+/* In GDB 4.9 this routine was a real performance hog.  According to
+   some gprof data which mtranle@paris.IntelliCorp.COM (Minh Tran-Le)
+   sent, almost all the time spend in solib_add (up to 20 minutes with
+   35 shared libraries) was spent here, with 5/6 in
+   lookup_minimal_symbol and 1/6 in read_memory.
 
-   * Just record the name of the minimal symbol and lazily patch the
-   addresses.
-
-   * Tell everyone to switch to Solaris2.  
-
-(1)  Move the call to special_symbol_handling out of the find_solib
-loop in solib_add.  This will call it once, rather than 35 times, when
-you have 35 shared libraries.  It's in the loop to pass the current
-solib's objfile so the symbols are added to that objfile's minsym.
-But since the symbols are in common (BSS), it doesn't really matter
-which objfile's minsyms they are added to, I think.
-
-(2)  Indeed, it might be best to create an objfile just for common minsyms,
-thus not needing any objfile argument to solib_add_common_symbols.
-
-(3)  Remove the call to lookup_minimal_symbol from
-solib_add_common_symbols.  If a symbol appears multiple times in the
-minsyms, we probably cope, more or less.  Note that if we had an
-objfile for just minsyms, install_minimal_symbols would automatically
-remove duplicates caused by running solib_add_common_symbols several
-times.
-*/
+   To fix this, we moved the call to special_symbol_handling out of the
+   loop in solib_add, so this only gets called once, rather than once
+   for every shared library, and also removed the call to lookup_minimal_symbol
+   in this routine.  */
 
 static void
 solib_add_common_symbols (rtc_symp, objfile)
@@ -330,10 +312,16 @@ solib_add_common_symbols (rtc_symp, objfile)
              name++;
            }
 
+#if 0
+         /* I think this is unnecessary, GDB can probably deal with
+            duplicate minimal symbols, more or less.  And the duplication
+            which used to happen because this was called for each shared
+            library is gone now that we are just called once.  */
          /* FIXME:  Do we really want to exclude symbols which happen
             to match symbols for other locations in the inferior's
             address space, even when they are in different linkage units? */
          if (lookup_minimal_symbol (name, (struct objfile *) NULL) == NULL)
+#endif
            {
              name = obsavestring (name, strlen (name),
                                   &objfile -> symbol_obstack);
@@ -463,7 +451,7 @@ look_for_base (fd, baseaddr)
      we have no way currently to find the filename.  Don't gripe about
      any problems we might have, just fail. */
 
-  if ((interp_bfd = bfd_fdopenr ("unnamed", NULL, fd)) == NULL)
+  if ((interp_bfd = bfd_fdopenr ("unnamed", gnutarget, fd)) == NULL)
     {
       return (0);
     }
@@ -771,6 +759,10 @@ solib_add (arg_string, from_tty, target)
      struct target_ops *target;
 {      
   register struct so_list *so = NULL;          /* link map state variable */
+
+  /* Last shared library that we read.  */
+  struct so_list *so_last = NULL;
+
   char *re_err;
   int count;
   int old;
@@ -801,7 +793,7 @@ solib_add (arg_string, from_tty, target)
                    "Error while reading shared library symbols:\n",
                    RETURN_MASK_ALL))
            {
-             special_symbol_handling (so);
+             so_last = so;
              so -> symbols_loaded = 1;
            }
        }
@@ -829,14 +821,14 @@ solib_add (arg_string, from_tty, target)
            {
              old = target -> to_sections_end - target -> to_sections;
              target -> to_sections = (struct section_table *)
-               realloc ((char *)target -> to_sections,
+               xrealloc ((char *)target -> to_sections,
                         (sizeof (struct section_table)) * (count + old));
            }
          else
            {
              old = 0;
              target -> to_sections = (struct section_table *)
-               malloc ((sizeof (struct section_table)) * count);
+               xmalloc ((sizeof (struct section_table)) * count);
            }
          target -> to_sections_end = target -> to_sections + (count + old);
          
@@ -854,6 +846,19 @@ solib_add (arg_string, from_tty, target)
            }
        }
     }
+
+  /* Calling this once at the end means that we put all the minimal
+     symbols for commons into the objfile for the last shared library.
+     Since they are in common, this should not be a problem.  If we
+     delete the objfile with the minimal symbols, we can put all the
+     symbols into a new objfile (and will on the next call to solib_add).
+
+     An alternate approach would be to create an objfile just for
+     common minsyms, thus not needing any objfile argument to
+     solib_add_common_symbols.  */
+
+  if (so_last)
+    special_symbol_handling (so_last);
 }
 
 /*
@@ -895,8 +900,12 @@ info_sharedlibrary_command (ignore, from_tty)
                     "Shared Object Library");
              header_done++;
            }
-         printf ("%-12s", local_hex_string_custom ((int) LM_ADDR (so), "08"));
-         printf ("%-12s", local_hex_string_custom (so -> lmend, "08"));
+         printf ("%-12s",
+                 local_hex_string_custom ((unsigned long) LM_ADDR (so),
+                                          "08l"));
+         printf ("%-12s",
+                 local_hex_string_custom ((unsigned long) so -> lmend,
+                                          "08l"));
          printf ("%-12s", so -> symbols_loaded ? "Yes" : "No");
          printf ("%s\n",  so -> so_name);
        }
@@ -965,10 +974,10 @@ clear_solib()
        {
          free ((PTR)so_list_head -> sections);
        }
-      if (so_list_head -> bfd)
+      if (so_list_head -> abfd)
        {
-         bfd_filename = bfd_get_filename (so_list_head -> bfd);
-         bfd_close (so_list_head -> bfd);
+         bfd_filename = bfd_get_filename (so_list_head -> abfd);
+         bfd_close (so_list_head -> abfd);
        }
       else
        /* This happens for the executable on SVR4.  */
@@ -1259,7 +1268,7 @@ solib_create_inferior_hook()
   stop_signal = 0;
   do
     {
-      target_resume (0, stop_signal);
+      target_resume (inferior_pid, 0, stop_signal);
       wait_for_inferior ();
     }
   while (stop_signal != SIGTRAP);
index 3853486..5c47ba1 100644 (file)
@@ -410,7 +410,7 @@ static struct vmap *
 add_vmap(ldi)
      register struct ld_info *ldi; 
 {
-       bfd *bfd, *last;
+       bfd *abfd, *last;
        register char *mem, *objname;
        struct objfile *obj;
        struct vmap *vp;
@@ -426,32 +426,32 @@ add_vmap(ldi)
        if (ldi->ldinfo_fd < 0)
          /* Note that this opens it once for every member; a possible
             enhancement would be to only open it once for every object.  */
-         bfd = bfd_openr (objname, gnutarget);
+         abfd = bfd_openr (objname, gnutarget);
        else
-         bfd = bfd_fdopenr(objname, gnutarget, ldi->ldinfo_fd);
-       if (!bfd)
+         abfd = bfd_fdopenr(objname, gnutarget, ldi->ldinfo_fd);
+       if (!abfd)
          error("Could not open `%s' as an executable file: %s",
                                        objname, bfd_errmsg(bfd_error));
 
 
        /* make sure we have an object file */
 
-       if (bfd_check_format(bfd, bfd_object))
-         vp = map_vmap (bfd, 0);
+       if (bfd_check_format(abfd, bfd_object))
+         vp = map_vmap (abfd, 0);
 
-       else if (bfd_check_format(bfd, bfd_archive)) {
+       else if (bfd_check_format(abfd, bfd_archive)) {
                last = 0;
                /*
                 * FIXME??? am I tossing BFDs?  bfd?
                 */
-               while (last = bfd_openr_next_archived_file(bfd, last))
+               while (last = bfd_openr_next_archived_file(abfd, last))
                        if (STREQ(mem, last->filename))
                                break;
 
                if (!last) {
-                 bfd_close(bfd);
+                 bfd_close(abfd);
                  /* FIXME -- should be error */
-                 warning("\"%s\": member \"%s\" missing.", bfd->filename, mem);
+                 warning("\"%s\": member \"%s\" missing.", abfd->filename, mem);
                  return;
                }
 
@@ -460,16 +460,16 @@ add_vmap(ldi)
                        goto obj_err;
                }
 
-               vp = map_vmap (last, bfd);
+               vp = map_vmap (last, abfd);
        }
        else {
            obj_err:
-               bfd_close(bfd);
+               bfd_close(abfd);
                error ("\"%s\": not in executable format: %s.",
                       objname, bfd_errmsg(bfd_error));
                /*NOTREACHED*/
        }
-       obj = allocate_objfile (vp->bfd, 0);
+       obj = allocate_objfile (vp->abfd, 0);
        vp->objfile = obj;
 
 #ifndef SOLIB_SYMBOLS_MANUAL
@@ -591,7 +591,7 @@ retry:
                || (memb[0] && !STREQ(memb, vp->member)))
            continue;
 
-         io = bfd_cache_lookup(vp->bfd);               /* totally opaque! */
+         io = bfd_cache_lookup(vp->abfd);              /* totally opaque! */
          if (!io)
            fatal("cannot find BFD's iostream for %s", vp->name);
 
@@ -695,7 +695,7 @@ xfer_memory (memaddr, myaddr, len, write, target)
        if (p->endaddr >= memend)
          {
            /* Entire transfer is within this section.  */
-           res = xfer_fn (p->bfd, p->sec_ptr, myaddr, memaddr - p->addr, len);
+           res = xfer_fn (p->abfd, p->sec_ptr, myaddr, memaddr - p->addr, len);
            return (res != false)? len: 0;
          }
        else if (p->endaddr <= memaddr)
@@ -707,7 +707,7 @@ xfer_memory (memaddr, myaddr, len, write, target)
          {
            /* This section overlaps the transfer.  Just do half.  */
            len = p->endaddr - memaddr;
-           res = xfer_fn (p->bfd, p->sec_ptr, myaddr, memaddr - p->addr, len);
+           res = xfer_fn (p->abfd, p->sec_ptr, myaddr, memaddr - p->addr, len);
            return (res != false)? len: 0;
          }
       else if (p->addr < nextsectaddr)
@@ -739,9 +739,9 @@ print_section_info (t, abfd)
     if (info_verbose)
       printf_filtered (" @ %s",
                       local_hex_string_custom ((unsigned long) p->sec_ptr->filepos, "08l"));
-    printf_filtered (" is %s", bfd_section_name (p->bfd, p->sec_ptr));
-    if (p->bfd != abfd) {
-      printf_filtered (" in %s", bfd_get_filename (p->bfd));
+    printf_filtered (" is %s", bfd_section_name (p->abfd, p->sec_ptr));
+    if (p->abfd != abfd) {
+      printf_filtered (" in %s", bfd_get_filename (p->abfd));
     }
     printf_filtered ("\n");
   }
@@ -808,8 +808,8 @@ char *args;
 
        for (vp = vmap; vp; vp = vp->nxt) {
                if (!strncmp(secname
-                            , bfd_section_name(vp->bfd, vp->sex), seclen)
-                   && bfd_section_name(vp->bfd, vp->sex)[seclen] == '\0') {
+                            , bfd_section_name(vp->abfd, vp->sex), seclen)
+                   && bfd_section_name(vp->abfd, vp->sex)[seclen] == '\0') {
                        offset = secaddr - vp->tstart;
                        vp->tstart += offset;
                        vp->tend   += offset;
@@ -1001,16 +1001,16 @@ bfd_err:
             So for text sections, bfd_section_vma tends to be 0x200,
             and if vp->tstart is 0xd0002000, then the first byte of
             the text section on disk corresponds to address 0xd0002200.  */
-         stp->bfd = vp->bfd;
-         stp->sec_ptr = bfd_get_section_by_name (stp->bfd, ".text");
-         stp->addr = bfd_section_vma (stp->bfd, stp->sec_ptr) + vp->tstart;
-         stp->endaddr = bfd_section_vma (stp->bfd, stp->sec_ptr) + vp->tend;
+         stp->abfd = vp->abfd;
+         stp->sec_ptr = bfd_get_section_by_name (stp->abfd, ".text");
+         stp->addr = bfd_section_vma (stp->abfd, stp->sec_ptr) + vp->tstart;
+         stp->endaddr = bfd_section_vma (stp->abfd, stp->sec_ptr) + vp->tend;
          stp++;
          
-         stp->bfd = vp->bfd;
-         stp->sec_ptr = bfd_get_section_by_name (stp->bfd, ".data");
-         stp->addr = bfd_section_vma (stp->bfd, stp->sec_ptr) + vp->dstart;
-         stp->endaddr = bfd_section_vma (stp->bfd, stp->sec_ptr) + vp->dend;
+         stp->abfd = vp->abfd;
+         stp->sec_ptr = bfd_get_section_by_name (stp->abfd, ".data");
+         stp->addr = bfd_section_vma (stp->abfd, stp->sec_ptr) + vp->dstart;
+         stp->endaddr = bfd_section_vma (stp->abfd, stp->sec_ptr) + vp->dend;
        }
 
       vmap_symtab (vp);
index 5be3533..2539ac0 100644 (file)
@@ -28,7 +28,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 struct vmap {
        struct vmap *nxt;       /* ^ to next in chain                   */
-       bfd *bfd;               /* BFD for mappable object library      */
+       bfd *abfd;              /* BFD for mappable object library      */
        char *name;             /* ^ to object file name                */
        char *member;           /* ^ to member name                     */
        CORE_ADDR tstart;       /* virtual addr where member is mapped  */