* main.c (main): Remove calls to {pre,post}_add_symbol_hooks.
authorKeith Seitz <keiths@cygnus>
Thu, 8 Oct 1998 23:04:53 +0000 (23:04 +0000)
committerKeith Seitz <keiths@cygnus>
Thu, 8 Oct 1998 23:04:53 +0000 (23:04 +0000)
        There should be sufficient information/hooks now to eliminate
        this hack.

        * exec.c (file_command): Add a new hook here to inform ui's
        when the exec file has changed. Adding it here allows the
        ui to be informed after symbol reading.

        * gdbcore.h: Add declaration of file_changed_hook.

gdb/ChangeLog
gdb/exec.c

index 7788cdb088db3faa301f4a4e1439f1665a121e30..1e051551ba8e02da62ec928ac70533ddb2ed08d1 100644 (file)
@@ -1,3 +1,15 @@
+1998-10-08  Keith Seitz  <keiths@cygnus.com>
+
+       * main.c (main): Remove calls to {pre,post}_add_symbol_hooks.
+       There should be sufficient information/hooks now to eliminate
+       this hack.
+
+       * exec.c (file_command): Add a new hook here to inform ui's
+       when the exec file has changed. Adding it here allows the
+       ui to be informed after symbol reading.
+
+       * gdbcore.h: Add declaration of file_changed_hook.
+
 Thu Oct  8 08:40:42 1998  Mark Alexander  <marka@cygnus.com>
 
        * rs6000-tdep.c (get_saved_register): Define only if
index fa64163ed781c65429a8d4f07a11165ae456d8af..c39e118d302d8789504f025dc2dd6a13c64abad4 100644 (file)
@@ -1,5 +1,6 @@
 /* Work with executable files, for GDB. 
-   Copyright 1988, 1989, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
+   Copyright 1988, 1989, 1991, 1992, 1993, 1994, 1997
+             Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -30,7 +31,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include <sys/types.h>
 #endif
 
-#include <sys/param.h>
 #include <fcntl.h>
 #include "gdb_string.h"
 
@@ -46,6 +46,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 struct vmap *map_vmap PARAMS ((bfd *, bfd *));
 
+void (*file_changed_hook) PARAMS ((char *));
+
 /* Prototypes for local functions */
 
 static void add_to_section_table PARAMS ((bfd *, sec_ptr, PTR));
@@ -187,7 +189,7 @@ exec_file_command (args, from_tty)
       scratch_chan = openp (getenv ("PATH"), 1, filename, 
                            write_files? O_RDWR|O_BINARY: O_RDONLY|O_BINARY, 0,
                            &scratch_pathname);
-#if defined(__GO32__) || defined(__WIN32__)
+#if defined(__GO32__) || defined(_WIN32)
       if (scratch_chan < 0)
       {
        char *exename = alloca (strlen (filename) + 5);
@@ -277,6 +279,7 @@ exec_file_command (args, from_tty)
       validate_files ();
 
       set_endian_from_file (exec_bfd);
+      set_architecture_from_file (exec_bfd);
 
       push_target (&exec_ops);
 
@@ -285,7 +288,7 @@ exec_file_command (args, from_tty)
        (*exec_file_display_hook) (filename);
     }
   else if (from_tty)
-    printf_unfiltered ("No exec file now.\n");
+    printf_unfiltered ("No executable file now.\n");
 }
 
 /* Set both the exec file and the symbol file, in one command.  
@@ -301,6 +304,8 @@ file_command (arg, from_tty)
      the exec file, but that's rough.  */
   exec_file_command (arg, from_tty);
   symbol_file_command (arg, from_tty);
+  if (file_changed_hook)
+    file_changed_hook (arg);
 }
 
 \f
@@ -367,20 +372,16 @@ bfdsec_to_vmap(abfd, sect, arg3)
 
   if (STREQ (bfd_section_name (abfd, sect), ".text"))
     {
-      vp->tstart = 0;
+      vp->tstart = bfd_section_vma (abfd, sect);
       vp->tend = vp->tstart + bfd_section_size (abfd, sect);
-
-      /* When it comes to this adjustment value, in contrast to our previous
-        belief shared objects should behave the same as the main load segment.
-        This is the offset from the beginning of text section to the first
-        real instruction. */
-
-      vp->tadj = sect->filepos - bfd_section_vma (abfd, sect);
+      vp->tvma = bfd_section_vma (abfd, sect);
+      vp->toffs = sect->filepos;
     }
   else if (STREQ (bfd_section_name (abfd, sect), ".data"))
     {
-      vp->dstart = 0;
+      vp->dstart = bfd_section_vma (abfd, sect);
       vp->dend = vp->dstart + bfd_section_size (abfd, sect);
+      vp->dvma = bfd_section_vma (abfd, sect);
     }
   /* Silently ignore other types of sections. (FIXME?)  */
 }
@@ -445,25 +446,79 @@ xfer_memory (memaddr, myaddr, len, write, target)
   struct section_table *p;
   CORE_ADDR nextsectaddr, memend;
   boolean (*xfer_fn) PARAMS ((bfd *, sec_ptr, PTR, file_ptr, bfd_size_type));
+  asection *section;
 
   if (len <= 0)
     abort();
 
+  if (overlay_debugging)
+    {
+      section = find_pc_overlay (memaddr);
+      if (pc_in_unmapped_range (memaddr, section))
+       memaddr = overlay_mapped_address (memaddr, section);
+    }
+
   memend = memaddr + len;
   xfer_fn = write ? bfd_set_section_contents : bfd_get_section_contents;
   nextsectaddr = memend;
 
+#if 0 /* Stu's implementation */
+/* If a section has been specified, try to use it.  Note that we cannot use the
+   specified section directly.  This is because it usually comes from the
+   symbol file, which may be different from the exec or core file.  Instead, we
+   have to lookup the specified section by name in the bfd associated with
+   to_sections.  */
+
+  if (target_memory_bfd_section)
+    {
+      asection *s;
+      bfd *abfd;
+      asection *target_section;
+      bfd *target_bfd;
+
+      s = target_memory_bfd_section;
+      abfd = s->owner;
+
+      target_bfd = target->to_sections->bfd;
+      target_section = bfd_get_section_by_name (target_bfd, bfd_section_name (abfd, s));
+
+      if (target_section)
+       {
+         bfd_vma sec_addr;
+         bfd_size_type sec_size;
+
+         sec_addr = bfd_section_vma (target_bfd, target_section);
+         sec_size = target_section->_raw_size;
+
+         /* Make sure the requested memory starts inside the section.  */
+
+         if (memaddr >= sec_addr
+             && memaddr < sec_addr + sec_size)
+           {
+             /* Cut back length in case request overflows the end of the section. */
+             len = min (len, sec_addr + sec_size - memaddr);
+
+             res = xfer_fn (target_bfd, target_section, myaddr, memaddr - sec_addr, len);
+
+             return res ? len : 0;
+           }
+       }
+    }
+#endif /* 0, Stu's implementation */
   for (p = target->to_sections; p < target->to_sections_end; p++)
     {
-      if (p->addr <= memaddr)
-       if (p->endaddr >= memend)
+      if (overlay_debugging && section && p->the_bfd_section &&
+         strcmp (section->name, p->the_bfd_section->name) != 0)
+       continue;       /* not the section we need */
+      if (memaddr >= p->addr)
+       if (memend <= p->endaddr)
          {
            /* Entire transfer is within this section.  */
            res = xfer_fn (p->bfd, p->the_bfd_section, myaddr,
                           memaddr - p->addr, len);
            return (res != 0) ? len : 0;
          }
-       else if (p->endaddr <= memaddr)
+       else if (memaddr >= p->endaddr)
          {
            /* This section ends before the transfer starts.  */
            continue;
@@ -476,8 +531,8 @@ xfer_memory (memaddr, myaddr, len, write, target)
                           memaddr - p->addr, len);
            return (res != 0) ? len : 0;
          }
-      else if (p->addr < nextsectaddr)
-       nextsectaddr = p->addr;
+      else
+       nextsectaddr = min (nextsectaddr, p->addr);
     }
 
   if (nextsectaddr >= memend)