import gdb-19990422 snapshot
[deliverable/binutils-gdb.git] / gdb / corefile.c
index a916bf8ac8134285540b087335cd4589d92b756e..6a0bea4f9442529f2383133b7e757d3ce9036098 100644 (file)
@@ -33,12 +33,27 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include "gdbcore.h"
 #include "dis-asm.h"
 #include "language.h"
+#include "gdb_stat.h"
+#include "symfile.h"
+#include "objfiles.h"
 
-extern char registers[];
+/* Local function declarations.  */
 
-/* Hook for `exec_file_command' command to call.  */
+static void call_extra_exec_file_hooks PARAMS ((char *filename));
 
-void (*exec_file_display_hook) PARAMS ((char *)) = NULL;
+/* You can have any number of hooks for `exec_file_command' command to call.
+   If there's only one hook, it is set in exec_file_display hook.
+   If there are two or more hooks, they are set in exec_file_extra_hooks[],
+   and exec_file_display_hook is set to a function that calls all of them.
+   This extra complexity is needed to preserve compatibility with
+   old code that assumed that only one hook could be set, and which called
+   exec_file_display_hook directly.  */
+
+typedef void (*hook_type) PARAMS ((char *));
+
+hook_type exec_file_display_hook;              /* the original hook */
+static hook_type *exec_file_extra_hooks;       /* array of additional hooks */
+static int exec_file_hook_count = 0;           /* size of array */
 
 /* Binary file diddling handle for the core file.  */
 
@@ -61,12 +76,47 @@ core_file_command (filename, from_tty)
     if (!filename)
       (t->to_detach) (filename, from_tty);
     else
-      (t->to_open) (filename, from_tty);
+      {
+        /* Yes, we were given the path of a core file.  Do we already
+           have a symbol file?  If not, can we determine it from the
+           core file?  If we can, do so.
+           */
+#ifdef HPUXHPPA
+        if (symfile_objfile == NULL)
+          {
+            char *  symfile;
+            symfile = t->to_core_file_to_sym_file (filename);
+            if (symfile)
+              {
+                char *  symfile_copy = strdup (symfile);
+
+                make_cleanup (free, symfile_copy);
+                symbol_file_command (symfile_copy, from_tty);
+              }
+            else
+              warning ("Unknown symbols for '%s'; use the 'symbol-file' command.", filename);
+          }
+#endif
+        (t->to_open) (filename, from_tty);
+      }
   else
     error ("GDB can't read core files on this machine.");
 }
 
 \f
+/* If there are two or more functions that wish to hook into exec_file_command,
+ * this function will call all of the hook functions. */
+
+static void
+call_extra_exec_file_hooks (filename)
+     char *filename;
+{
+  int i;
+
+  for (i = 0; i < exec_file_hook_count; i++)
+    (*exec_file_extra_hooks[i])(filename);
+}
+
 /* Call this to specify the hook for exec_file_command to call back.
    This is called from the x-window display code.  */
 
@@ -74,7 +124,33 @@ void
 specify_exec_file_hook (hook)
      void (*hook) PARAMS ((char *));
 {
-  exec_file_display_hook = hook;
+  hook_type *new_array;
+
+  if (exec_file_display_hook != NULL)
+    {
+      /* There's already a hook installed.  Arrange to have both it
+       * and the subsequent hooks called. */
+      if (exec_file_hook_count == 0)
+       {
+         /* If this is the first extra hook, initialize the hook array. */
+         exec_file_extra_hooks = (hook_type *) xmalloc (sizeof(hook_type));
+         exec_file_extra_hooks[0] = exec_file_display_hook;
+         exec_file_display_hook = call_extra_exec_file_hooks;
+         exec_file_hook_count = 1;
+       }
+
+      /* Grow the hook array by one and add the new hook to the end.
+         Yes, it's inefficient to grow it by one each time but since
+         this is hardly ever called it's not a big deal.  */
+      exec_file_hook_count++;
+      new_array =
+       (hook_type *) xrealloc (exec_file_extra_hooks,
+                               exec_file_hook_count * sizeof(hook_type));
+      exec_file_extra_hooks = new_array;
+      exec_file_extra_hooks[exec_file_hook_count - 1] = hook;
+    }
+  else
+    exec_file_display_hook = hook;
 }
 
 /* The exec file must be closed before running an inferior.
@@ -84,7 +160,7 @@ specify_exec_file_hook (hook)
 void
 close_exec_file ()
 {
-#ifdef FIXME
+#if 0 /* FIXME */
   if (exec_bfd)
     bfd_tempclose (exec_bfd);
 #endif
@@ -93,9 +169,27 @@ close_exec_file ()
 void
 reopen_exec_file ()
 {
-#ifdef FIXME
+#if 0 /* FIXME */
   if (exec_bfd)
     bfd_reopen (exec_bfd);
+#else
+  char *filename;
+  int res;
+  struct stat st;
+  long mtime;
+
+  /* Don't do anything if the current target isn't exec. */
+  if (exec_bfd == NULL || strcmp (target_shortname, "exec") != 0)
+    return;
+  /* If the timestamp of the exec file has changed, reopen it. */
+  filename = strdup (bfd_get_filename (exec_bfd));
+  make_cleanup (free, filename);
+  mtime = bfd_get_mtime(exec_bfd);
+  res = stat (filename, &st);
+
+  if (mtime && mtime != st.st_mtime)
+    exec_file_command (filename, 0);
 #endif
 }
 \f
@@ -172,6 +266,19 @@ read_memory (memaddr, myaddr, len)
     memory_error (status, memaddr);
 }
 
+void
+read_memory_section (memaddr, myaddr, len, bfd_section)
+     CORE_ADDR memaddr;
+     char *myaddr;
+     int len;
+     asection *bfd_section;
+{
+  int status;
+  status = target_read_memory_section (memaddr, myaddr, len, bfd_section);
+  if (status != 0)
+    memory_error (status, memaddr);
+}
+
 /* Like target_read_memory, but slightly different parameters.  */
 
 int
@@ -230,16 +337,47 @@ read_memory_integer (memaddr, len)
   return extract_signed_integer (buf, len);
 }
 
-unsigned LONGEST
+ULONGEST
 read_memory_unsigned_integer (memaddr, len)
      CORE_ADDR memaddr;
      int len;
 {
-  char buf[sizeof (unsigned LONGEST)];
+  char buf[sizeof (ULONGEST)];
 
   read_memory (memaddr, buf, len);
   return extract_unsigned_integer (buf, len);
 }
+
+void
+read_memory_string (memaddr, buffer, max_len)
+     CORE_ADDR memaddr;
+     char * buffer;
+     int max_len;
+{
+  register char * cp;
+  register int i;
+  int cnt;
+
+  cp = buffer;
+  while (1)
+    {
+      if (cp - buffer >= max_len)
+        {
+          buffer[max_len - 1] = '\0';
+          break;
+        }
+      cnt = max_len - (cp - buffer);
+      if (cnt > 8)
+       cnt = 8;
+      read_memory (memaddr + (int) (cp - buffer), cp, cnt);
+      for (i = 0; i < cnt && *cp; i++, cp++)
+        ; /* null body */
+
+      if (i < cnt && !*cp)
+        break;
+    }
+}
+
 \f
 #if 0
 /* Enable after 4.12.  It is not tested.  */
This page took 0.025202 seconds and 4 git commands to generate.