This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[patch/rfc] Add child_to_xfer_partial; Was: ia64 portion of libunwindpatch
- From: Andrew Cagney <ac131313 at redhat dot com>
- To: "J. Johnston" <jjohnstn at redhat dot com>
- Cc: Andrew Cagney <ac131313 at redhat dot com>,Daniel Jacobowitz <drow at mvista dot com>,Kevin Buettner <kevinb at redhat dot com>,Marcel Moolenaar <marcel at xcllnt dot net>, gdb-patches at sources dot redhat dot com
- Date: Thu, 06 Nov 2003 17:32:03 -0500
- Subject: [patch/rfc] Add child_to_xfer_partial; Was: ia64 portion of libunwindpatch
- References: <3F986E31.8050201@redhat.com> <1031024175718.ZM3475@localhost.localdomain> <3F996D88.9060505@redhat.com> <1031024185625.ZM9827@localhost.localdomain> <3F9F0180.2010702@redhat.com> <20031029012833.GA11070@nevyn.them.org> <3FA043B2.6090401@redhat.com> <3FA7F97B.4090909@redhat.com>
Jeff,
This adds a child_xfer_partial method to "inftarg.c". I've included a
hook vis:
+#if 0
+ 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, writebuf,
+ readbuf, offset, len);
+#endif
so that, in theory, all you need do is define that in the linux specific
nm-*.h file.
I think this will make plugging in additional xfer methods easier. How
does it look?
Anyone else?
Andrew
PS: You'll notice that it also contains lurking code to add support for
an auxv transfer.
PPS: Note that I need to better test it.
2003-11-06 Andrew Cagney <cagney@redhat.com>
* inftarg.c (child_xfer_partial): New function
(init_child_ops): Set "to_xfer_partial".
Index: inftarg.c
===================================================================
RCS file: /cvs/src/src/gdb/inftarg.c,v
retrieving revision 1.18
diff -u -r1.18 inftarg.c
--- inftarg.c 21 Sep 2003 01:26:45 -0000 1.18
+++ inftarg.c 6 Nov 2003 22:20:17 -0000
@@ -551,7 +551,45 @@
*/
return NULL;
}
-
+
+/* Perform a partial transfer to/from the specified object. */
+
+static LONGEST
+child_xfer_partial (struct target_ops *ops,
+ enum target_object object,
+ const char *annex, const void *writebuf,
+ void *readbuf, 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;
+
+#if 0
+ 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, writebuf,
+ readbuf, offset, len);
+#endif
+
+#if 0
+ case TARGET_OBJECT_AUXV:
+ return native_xfer_auxv (PIDGET (inferior_ptid), writebuf, readbuf,
+ offset, len);
+#endif
+
+ default:
+ return -1;
+ }
+}
#if !defined(CHILD_PID_TO_STR)
char *
@@ -578,6 +616,7 @@
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;