From a71c0593c6f836e5e6607619209938dff0e7a093 Mon Sep 17 00:00:00 2001 From: Fred Fish Date: Fri, 8 Oct 1993 23:04:45 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 6 +++ gdb/osfsolib.c | 10 ++--- gdb/remote-sim.c | 2 +- gdb/solib.c | 97 ++++++++++++++++++++++++++---------------------- gdb/xcoffexec.c | 58 ++++++++++++++--------------- gdb/xcoffsolib.h | 2 +- 6 files changed, 95 insertions(+), 80 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f18722878c..93f15d9187 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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. diff --git a/gdb/osfsolib.c b/gdb/osfsolib.c index a27243d941..98224ef5a6 100644 --- a/gdb/osfsolib.c +++ b/gdb/osfsolib.c @@ -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. */ diff --git a/gdb/remote-sim.c b/gdb/remote-sim.c index 7148e4de97..bfde87ed62 100644 --- a/gdb/remote-sim.c +++ b/gdb/remote-sim.c @@ -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) diff --git a/gdb/solib.c b/gdb/solib.c index 417fb600e3..1b50615aaa 100644 --- a/gdb/solib.c +++ b/gdb/solib.c @@ -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. +/* 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. - Possible solutions: - - * Hash the minimal symbols. - - * 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); diff --git a/gdb/xcoffexec.c b/gdb/xcoffexec.c index 3853486b39..5c47ba13bc 100644 --- a/gdb/xcoffexec.c +++ b/gdb/xcoffexec.c @@ -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); diff --git a/gdb/xcoffsolib.h b/gdb/xcoffsolib.h index 5be35331ba..2539ac0e10 100644 --- a/gdb/xcoffsolib.h +++ b/gdb/xcoffsolib.h @@ -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 */