This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: [RFC] Use target vector inheritance for GNU/Linux
- From: Andrew Cagney <cagney at gnu dot org>
- To: Daniel Jacobowitz <drow at false dot org>
- Cc: gdb-patches at sources dot redhat dot com
- Date: Sun, 12 Dec 2004 12:51:29 -0500
- Subject: Re: [RFC] Use target vector inheritance for GNU/Linux
- References: <20041205184549.GA19814@nevyn.them.org>
-LONGEST
-ia64_linux_xfer_unwind_table (struct target_ops *ops,
- enum target_object object,
- const char *annex,
- void *readbuf, const void *writebuf,
- ULONGEST offset, LONGEST len)
+LONGEST (*saved_xfer_partial) (struct target_ops *, enum target_object,
+ const char *, void *, const void *,
+ ULONGEST, LONGEST);
+
+static LONGEST
+ia64_linux_xfer_partial (struct target_ops *ops,
+ enum target_object object,
+ const char *annex,
+ void *readbuf, const void *writebuf,
+ ULONGEST offset, LONGEST len)
{
- return syscall (__NR_getunwind, readbuf, len);
+ if (object == TARGET_OBJECT_UNWIND_TABLE && writebuf == NULL && offset == 0)
+ return syscall (__NR_getunwind, readbuf, len);
+
+ return saved_xfer_partial (ops, object, annex, readbuf, writebuf,
+ offset, len);
+}
Can you rename saved_xfer_partial to super_xfer_partial_hack and add a
FIXME. It should be calling super.xfer_partial but that's not available :-(
+#ifndef FETCH_INFERIOR_REGISTERS
+
+/* Fetch register REGNUM from the inferior. */
+
+static void
+fetch_register (int regnum)
+{
Why is this wrapped in in an #ifdef?
+/* Create a generic GNU/Linux target vector. If T is non-NULL, base
+ the new target vector on it. */
+
+struct target_ops *
+linux_target (struct target_ops *t)
Can this be renamed to inf_linux_target (to be consistent with the other
inf_*_target() methods?
A new function, linux_target, is added to linux-nat.c. Then any GNU/Linux
target can call it, and pass the result to add_target - after specializing
whatever methods it needs to. Sometimes it's necessary to specialize a
method between inf_ptrace_target and linux_target, so it accepts an optional
argument. This wouldn't be necessary if all target methods took a
target_ops parameter, so they could call the overridden method.
As in this?
+void
+_initialize_i386_linux_nat (void)
+{
+ struct target_ops *t = inf_ptrace_target ();
+
+ /* Override the default ptrace resume method. */
+ t->to_resume = i386_linux_resume;
+
+ /* Fill in the generic GNU/Linux methods. */
+ t = linux_target (t);
which is violating the inheritance structure. Can you instead add a
one-of method (deprecated_set_super_linux_resume?) to handle this case?
We can then see about fixing the problem (I'm left wondering if that
method is still needed).
+ /* FIXME drow/2004-12-04: For now, these functions must keep the standard
+ names because only some GNU/Linux targets use inf-ptrace.o. When all
+ have been converted, these functions can be renamed and made static. */
Is this still true? I thought the patch was so large because it touched
all the linux targets.
Andrew