Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Mark Kettenis <mark.kettenis@xs4all.nl>
To: jhb@freebsd.org
Cc: gdb-patches@sourceware.org, palves@redhat.com
Subject: Re: [PATCH 1/3] Add fbsd_nat_add_target.
Date: Tue, 28 Apr 2015 01:06:00 -0000	[thread overview]
Message-ID: <201504272050.t3RKoCSV018211@glazunov.sibelius.xs4all.nl> (raw)
In-Reply-To: <4869684.VuRe0HgzJ9@ralph.baldwin.cx> (message from John Baldwin	on Mon, 27 Apr 2015 16:17:52 -0400)

> From: John Baldwin <jhb@freebsd.org>
> Date: Mon, 27 Apr 2015 16:17:52 -0400
> 
> On Monday, April 27, 2015 09:54:24 PM Mark Kettenis wrote:
> > > From: John Baldwin <jhb@freebsd.org>
> > > Date: Mon, 27 Apr 2015 15:16:50 -0400
> > > 
> > > On Monday, April 27, 2015 08:10:18 PM Pedro Alves wrote:
> > > > On 04/26/2015 02:24 AM, John Baldwin wrote:
> > > > > Add a wrapper for add_target in fbsd-nat.c to override target operations
> > > > > common to all native FreeBSD targets.
> > > > > 
> > > > > gdb/ChangeLog:
> > > > > 
> > > > > 	* fbsd-nat.c (fbsd_pid_to_exec_file): Mark static.
> > > > > 	(fbsd_find_memory_regions): Mark static.
> > > > > 	(fbsd_nat_add_target): New function.
> > > > > 	* fbsd-nat.h: Export fbsd_nat_add_target and remove prototypes for
> > > > > 	fbsd_pid_to_exec_file and fbsd_find_memory_regions.
> > > > > 	* amd64fbsd-nat.c (_initialize_amd64fbsd_nat): Use fbsd_nat_add_target.
> > > > > 	* i386fbsd-nat.c (_initialize_i386fbsd_nat): Likewise.
> > > > > 	* ppcfbsd-nat.c (_initialize_ppcfbsd_nat): Likewise.
> > > > > 	* sparc64fbsd-nat.c (_initialize_sparc64fbsd_nat): Likewise.
> > > > 
> > > > OOC, any reason you didn't instead do it like:
> > > > 
> > > > struct target_ops *
> > > > fbsd_nat_target (void)
> > > > {
> > > >   struct target_ops *t = inf_ptrace_target ();
> > > > 
> > > >   t->to_pid_to_exec_file = fbsd_pid_to_exec_file;
> > > >   t->to_find_memory_regions = fbsd_find_memory_regions;
> > > >   return t;
> > > > }
> > > > 
> > > > and then use fbsd_nat_target instead of inf_ptrace_target
> > > > directly?
> > > > 
> > > > This maps a little better to a C++ world.
> > > > 
> > > > linux-nat.c does it the way you did as it keeps a separate
> > > > linux_ops target instance around.
> > > 
> > > I was probably just using linux-nat.c as a reference.  One thing that
> > > confuses me about the linux-nat target is that it keeps linux_ops
> > > around so that it can call the original methods that it overrides,
> > > and yet for a few methods it also uses a local 'super_foo' variable
> > > to call an original method.  I think that those are both doing the
> > > same thing, but perhaps there is some subtlety I'm missing?
> > > 
> > > I do use a 'super_wait' to call ptrace's wait method in the second
> > > patch in this series, so I could certainly change this to return a
> > > target rather than modifying an existing one if that is preferred.
> > 
> > I'd say the linux-nat.c code is a bad example and recommend looking at
> > the obsd-nat.c code instead.  The linux-nat.c code is so complicated
> > because of all the workarounds needed to support threads.  The
> > linux_ops stuff is pretty much an artifact of those workarounds.  
> > 
> > I found that to add threads-support I did need to make modifications
> > to the _wait function that made it hard to re-use the
> > inf_ptrace_wait() code.  Sometimes code duplications just is the right
> > answer.
> 
> FWIW, obsd-nat.c (which I have looked at a bit), also uses a wrapper
> around add_target rather than creating a generic OpenBSD native target.
> To change the FreeBSD native targets I think would be an invasive change
> since they use platform-specific native targets that are pan-BSD as their
> initial target (e.g. amd64bsd_target) and customize from there.  To make
> fbsd_nat_target work I would need to rework things like amd64bsd_target
> to modify an existing target instead of returning a new one I think (which
> would also mean changing all the other BSD native targets).

Which is why I'm perfectly happy with your current 1/3 diff ;).

And I don't think your super_wait approach is a problem either.  Just
that I think that ultimately you'll end up with duplucating the core
of inf_ptrace_wait() in fbsd_wait().

I'm not really familliar enough with the implementation of the fork
following stuff in the FreeBSD kernel.  Looks significantly more
complicated to how this was done in HP-UX (which is the approach I
used for OpenBSD).  But then it seems more complete.

As far as I'm concerned you're the expert here and to me the series
looks reasonable as posted.

Cheers,

Mark


  reply	other threads:[~2015-04-27 20:50 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-26  1:25 John Baldwin
2015-04-27 19:24 ` Pedro Alves
2015-04-27 19:27   ` John Baldwin
2015-04-27 20:26     ` Mark Kettenis
2015-04-27 20:36       ` John Baldwin
2015-04-28  1:06         ` Mark Kettenis [this message]
2015-04-28  1:08           ` Pedro Alves

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=201504272050.t3RKoCSV018211@glazunov.sibelius.xs4all.nl \
    --to=mark.kettenis@xs4all.nl \
    --cc=gdb-patches@sourceware.org \
    --cc=jhb@freebsd.org \
    --cc=palves@redhat.com \
    /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