2004-06-07 Randolph Chung <tausq@debian.org>
[deliverable/binutils-gdb.git] / gdb / inftarg.c
index 05036b6267ab69bb10a98378ccf59197676b0a10..a0e5dc5e5c38992d06eea87795ec07eaa645ebbe 100644 (file)
@@ -1,7 +1,7 @@
 /* Target-vector operations for controlling Unix child processes, for GDB.
 
    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999,
-   2000, 2002, 2003 Free Software Foundation, Inc.
+   2000, 2002, 2003, 2004 Free Software Foundation, Inc.
 
    Contributed by Cygnus Support.
 
@@ -34,7 +34,7 @@
 #include <signal.h>
 #include <sys/types.h>
 #include <fcntl.h>
-
+#include "observer.h"
 #include "gdb_wait.h"
 #include "inflow.h"
 
@@ -73,7 +73,7 @@ static void ptrace_me (void);
 
 static void ptrace_him (int);
 
-static void child_create_inferior (char *, char *, char **);
+static void child_create_inferior (char *, char *, char **, int);
 
 static void child_mourn_inferior (void);
 
@@ -222,7 +222,7 @@ child_attach (char *args, int from_tty)
          printf_unfiltered ("Attaching to program: %s, %s\n", exec_file,
                             target_pid_to_str (pid_to_ptid (pid)));
        else
-         printf_unfiltered ("Attaching to %s\n", 
+         printf_unfiltered ("Attaching to %s\n",
                             target_pid_to_str (pid_to_ptid (pid)));
 
        gdb_flush (gdb_stdout);
@@ -232,6 +232,10 @@ child_attach (char *args, int from_tty)
 
     inferior_ptid = pid_to_ptid (pid);
     push_target (&child_ops);
+
+    /* Do this first, before anything has had a chance to query the
+       inferiors symbol table or similar.  */
+    observer_notify_inferior_created (&current_target, from_tty);
   }
 #endif /* ATTACH_DETACH */
 }
@@ -356,7 +360,8 @@ ptrace_him (int pid)
    ENV is the environment vector to pass.  Errors reported with error().  */
 
 static void
-child_create_inferior (char *exec_file, char *allargs, char **env)
+child_create_inferior (char *exec_file, char *allargs, char **env,
+                      int from_tty)
 {
 #ifdef HPUXHPPA
   fork_inferior (exec_file, allargs, env, ptrace_me, ptrace_him, pre_fork_inferior, NULL);
@@ -364,6 +369,7 @@ child_create_inferior (char *exec_file, char *allargs, char **env)
   fork_inferior (exec_file, allargs, env, ptrace_me, ptrace_him, NULL, NULL);
 #endif
   /* We are at the first instruction we care about.  */
+  observer_notify_inferior_created (&current_target, from_tty);
   /* Pedal to the metal... */
   proceed ((CORE_ADDR) -1, TARGET_SIGNAL_0, 0);
 }
@@ -551,7 +557,51 @@ child_core_file_to_sym_file (char *core)
    */
   return NULL;
 }
-\f
+
+/* Perform a partial transfer to/from the specified object.  For
+   memory transfers, fall back to the old memory xfer functions.  */
+
+static LONGEST
+child_xfer_partial (struct target_ops *ops, enum target_object object,
+                   const char *annex, void *readbuf,
+                   const void *writebuf, ULONGEST offset, LONGEST len)
+{
+  switch (object)
+    {
+    case TARGET_OBJECT_MEMORY:
+      if (readbuf)
+       return child_xfer_memory (offset, readbuf, len, 0/*write*/,
+                                 NULL, ops);
+      if (writebuf)
+       return child_xfer_memory (offset, readbuf, len, 1/*write*/,
+                                 NULL, ops);
+      return -1;
+
+    case TARGET_OBJECT_UNWIND_TABLE:
+#ifndef NATIVE_XFER_UNWIND_TABLE
+#define NATIVE_XFER_UNWIND_TABLE(OPS,OBJECT,ANNEX,WRITEBUF,READBUF,OFFSET,LEN) (-1)
+#endif
+      return NATIVE_XFER_UNWIND_TABLE (ops, object, annex, readbuf, writebuf,
+                                      offset, len);
+
+    case TARGET_OBJECT_AUXV:
+#ifndef NATIVE_XFER_AUXV
+#define NATIVE_XFER_AUXV(OPS,OBJECT,ANNEX,WRITEBUF,READBUF,OFFSET,LEN) (-1)
+#endif
+      return NATIVE_XFER_AUXV (ops, object, annex, readbuf, writebuf,
+                              offset, len);
+
+    case TARGET_OBJECT_WCOOKIE:
+#ifndef NATIVE_XFER_WCOOKIE
+#define NATIVE_XFER_WCOOKIE(OPS,OBJECT,ANNEX,WRITEBUF,READBUF,OFFSET,LEN) (-1)
+#endif
+      return NATIVE_XFER_WCOOKIE (ops, object, annex, readbuf, writebuf,
+                                 offset, len);
+
+    default:
+      return -1;
+    }
+}
 
 #if !defined(CHILD_PID_TO_STR)
 char *
@@ -578,6 +628,7 @@ init_child_ops (void)
   child_ops.to_store_registers = store_inferior_registers;
   child_ops.to_prepare_to_store = child_prepare_to_store;
   child_ops.to_xfer_memory = child_xfer_memory;
+  child_ops.to_xfer_partial = child_xfer_partial;
   child_ops.to_files_info = child_files_info;
   child_ops.to_insert_breakpoint = memory_insert_breakpoint;
   child_ops.to_remove_breakpoint = memory_remove_breakpoint;
@@ -618,10 +669,10 @@ init_child_ops (void)
 }
 
 /* Take over the 'find_mapped_memory' vector from inftarg.c. */
-extern void 
-inftarg_set_find_memory_regions (int (*func) (int (*) (CORE_ADDR, 
-                                                      unsigned long, 
-                                                      int, int, int, 
+extern void
+inftarg_set_find_memory_regions (int (*func) (int (*) (CORE_ADDR,
+                                                      unsigned long,
+                                                      int, int, int,
                                                       void *),
                                              void *))
 {
@@ -629,7 +680,7 @@ inftarg_set_find_memory_regions (int (*func) (int (*) (CORE_ADDR,
 }
 
 /* Take over the 'make_corefile_notes' vector from inftarg.c. */
-extern void 
+extern void
 inftarg_set_make_corefile_notes (char * (*func) (bfd *, int *))
 {
   child_ops.to_make_corefile_notes = func;
This page took 0.025427 seconds and 4 git commands to generate.