Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Andrew Cagney <cagney@gnu.org>
To: Mark Kettenis <kettenis@gnu.org>
Cc: drow@false.org, gdb-patches@sources.redhat.com
Subject: Re: [RFC] Use target vector inheritance for GNU/Linux
Date: Mon, 13 Dec 2004 20:45:00 -0000	[thread overview]
Message-ID: <41BDFE94.9060401@gnu.org> (raw)
In-Reply-To: <200412122107.iBCL7KEi011314@elgar.sibelius.xs4all.nl>

Mark Kettenis wrote:

>    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 :-(
> 
> Can you explain what you're hinting at here Andrew?  What makes this
> specific saved_xfer_partial so different from the other saved_xxx
> instances that the patch introduces?

Nothing?  Changing those to be consistent with this would be a logical 
next step.

>    +#ifndef FETCH_INFERIOR_REGISTERS
>    +
>    +/* Fetch register REGNUM from the inferior.  */
>    +
>    +static void
>    +fetch_register (int regnum)
>    +{
> 
>    Why is this wrapped in in an #ifdef?
> 
> Some of the Linux target still need the crufty old code to read
> registers using PTRACE_PEEKUSR.  The new inf-ptrace.c doesn't provide
> that functionality, so I guess Daniel inlined that bit of code here.
> This is related to the FIXME below, and of course only temporary.

So a fixme or other comment needs to be added at the point of this macro?

>    +/* 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?
> 
> Apparently I don't agre with this since I already introduced
> i386bsd_target and sparc_target; linux_target is consistent with that.

You also added inf_ttrace_target.

>    > 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).
> 
> No it isn't.  At a very low level, all Linux ports are slightly
> different.  Most ports will need to adjust the generic ptrace target
> before it can be inherited by the generic Linux target.  In fact I
> think that when the FETCH_INFERIOR_REGISTERS issue above is sorted
> out, you'll see that *all* Linux ports will need to do this trick of
> adjusting the ptrace target before passing it to linux_target().
> 
> (And yes, I'm fairly certain the method is still needed.  While the
> problem may have been fixed in recent kernels, there are many older
> Linux kernels out there.)

You're on the right track, however the inheritance structure that the C 
code is trying to mimic is:

i386LinuxInferior IS-A LinuxInferior IS-A PtraceInferior

with the i386LinuxInferior.resume method overriding LinuxInferior.resume 
(which overrid PtraceInferior.resume); and not:

LinuxInferior IS-A i386LinuxInferior IS-A PtraceInferior

That the current inferior code doesn't facilitate this is a recognized 
problem, but not one that we should get hung-up over.  Hence my 
suggestion of deprecated_set_super_linux_resume as a workaround until 
that is fixed.

Andrew


  reply	other threads:[~2004-12-13 20:44 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-12-05 18:48 Daniel Jacobowitz
2004-12-06 14:41 ` Mark Kettenis
2004-12-06 14:43   ` Daniel Jacobowitz
2004-12-12 17:53 ` Andrew Cagney
2004-12-12 17:59 ` Andrew Cagney
2004-12-12 21:45   ` Mark Kettenis
2004-12-13 20:45     ` Andrew Cagney [this message]
2004-12-13 22:29       ` Mark Kettenis
2004-12-13 22:57         ` Andrew Cagney
2004-12-14  2:06           ` Mark Kettenis
2004-12-14 15:41             ` Andrew Cagney
2004-12-15  0:07               ` Mark Kettenis

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=41BDFE94.9060401@gnu.org \
    --to=cagney@gnu.org \
    --cc=drow@false.org \
    --cc=gdb-patches@sources.redhat.com \
    --cc=kettenis@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox