[5/9,v7] Introduce common-regcache.h

Message ID 1409320299-6812-6-git-send-email-gbenson@redhat.com
State Committed
Headers

Commit Message

Gary Benson Aug. 29, 2014, 1:51 p.m. UTC
  This introduces common-regcache.h.  This contains two functions that
allow nat/linux-btrace.c to be simplified.  A better long term
solution would be unify the regcache code, but this is sufficient for
now.

This patch differs from the version I posted on August 1
(https://sourceware.org/ml/gdb-patches/2014-08/msg00010.html) in that
some suggested documentation changes have been made and that various
updates were required to reflect regcache changes recently committed
by Andreas Arnez.

gdb/ChangeLog:

	* common/common-regcache.h: New file.
	* Makefile.in (HFILES_NO_SRCDIR): Add common/common-regcache.h.
	* regcache.h: Include common-regcache.h.
	(regcache_read_pc): Don't declare.
	* regcache.c (get_thread_regcache_for_ptid): New function.
	* nat/linux-btrace.c: Don't include regcache.h.
	Include common-regcache.h.
	(perf_event_read_bts): Use get_thread_regcache_for_ptid.

gdb/gdbserver/ChangeLog:

	* regcache.h: Include common-regcache.h.
	(regcache_read_pc): Don't declare.
	* regcache.c (get_thread_regcache_for_ptid): New function.
---
 gdb/ChangeLog                |   12 ++++++++++++
 gdb/Makefile.in              |    3 ++-
 gdb/common/common-regcache.h |   35 +++++++++++++++++++++++++++++++++++
 gdb/gdbserver/ChangeLog      |    7 +++++++
 gdb/gdbserver/regcache.c     |    8 ++++++++
 gdb/gdbserver/regcache.h     |    4 ++--
 gdb/nat/linux-btrace.c       |    8 ++------
 gdb/regcache.c               |    7 +++++++
 gdb/regcache.h               |    3 ++-
 9 files changed, 77 insertions(+), 10 deletions(-)
 create mode 100644 gdb/common/common-regcache.h
  

Comments

Pedro Alves Sept. 10, 2014, 1:09 p.m. UTC | #1
On 08/29/2014 02:51 PM, Gary Benson wrote:
> This introduces common-regcache.h.  This contains two functions that
> allow nat/linux-btrace.c to be simplified.  A better long term
> solution would be unify the regcache code, but this is sufficient for
> now.
> 
> This patch differs from the version I posted on August 1
> (https://sourceware.org/ml/gdb-patches/2014-08/msg00010.html) in that
> some suggested documentation changes have been made and that various
> updates were required to reflect regcache changes recently committed
> by Andreas Arnez.
> 
> gdb/ChangeLog:
> 
> 	* common/common-regcache.h: New file.
> 	* Makefile.in (HFILES_NO_SRCDIR): Add common/common-regcache.h.
> 	* regcache.h: Include common-regcache.h.
> 	(regcache_read_pc): Don't declare.
> 	* regcache.c (get_thread_regcache_for_ptid): New function.
> 	* nat/linux-btrace.c: Don't include regcache.h.
> 	Include common-regcache.h.
> 	(perf_event_read_bts): Use get_thread_regcache_for_ptid.
> 
> gdb/gdbserver/ChangeLog:
> 
> 	* regcache.h: Include common-regcache.h.
> 	(regcache_read_pc): Don't declare.
> 	* regcache.c (get_thread_regcache_for_ptid): New function.
> diff --git a/gdb/gdbserver/regcache.h b/gdb/gdbserver/regcache.h
> index 891fead..0c933f3 100644
> --- a/gdb/gdbserver/regcache.h
> +++ b/gdb/gdbserver/regcache.h
> @@ -19,6 +19,8 @@
>  #ifndef REGCACHE_H
>  #define REGCACHE_H
>  
> +#include "common-regcache.h"
> +
>  struct thread_info;
>  struct target_desc;
>  
> @@ -91,8 +93,6 @@ void registers_to_string (struct regcache *regcache, char *buf);
>  
>  void registers_from_string (struct regcache *regcache, char *buf);
>  
> -CORE_ADDR regcache_read_pc (struct regcache *regcache);
> -

Like in the target patches, please leave breadcrumbs pointing
to the shared header (here and elsewhere).

Otherwise looks good to me too.

Thanks,
Pedro Alves
  
Doug Evans Sept. 10, 2014, 6 p.m. UTC | #2
Gary Benson writes:
 > This introduces common-regcache.h.  This contains two functions that
 > allow nat/linux-btrace.c to be simplified.  A better long term
 > solution would be unify the regcache code, but this is sufficient for
 > now.
 > 
 > This patch differs from the version I posted on August 1
 > (https://sourceware.org/ml/gdb-patches/2014-08/msg00010.html) in that
 > some suggested documentation changes have been made and that various
 > updates were required to reflect regcache changes recently committed
 > by Andreas Arnez.
 > 
 > gdb/ChangeLog:
 > 
 > 	* common/common-regcache.h: New file.
 > 	* Makefile.in (HFILES_NO_SRCDIR): Add common/common-regcache.h.
 > 	* regcache.h: Include common-regcache.h.
 > 	(regcache_read_pc): Don't declare.
 > 	* regcache.c (get_thread_regcache_for_ptid): New function.
 > 	* nat/linux-btrace.c: Don't include regcache.h.
 > 	Include common-regcache.h.
 > 	(perf_event_read_bts): Use get_thread_regcache_for_ptid.
 > 
 > gdb/gdbserver/ChangeLog:
 > 
 > 	* regcache.h: Include common-regcache.h.
 > 	(regcache_read_pc): Don't declare.
 > 	* regcache.c (get_thread_regcache_for_ptid): New function.
 >[...]
 > diff --git a/gdb/common/common-regcache.h b/gdb/common/common-regcache.h
 > new file mode 100644
 > index 0000000..aef6bfd
 > --- /dev/null
 > +++ b/gdb/common/common-regcache.h
 > @@ -0,0 +1,35 @@
 > +/* Cache and manage the values of registers
 > +
 > +   Copyright (C) 1986-2014 Free Software Foundation, Inc.
 > +
 > +   This file is part of GDB.
 > +
 > +   This program is free software; you can redistribute it and/or modify
 > +   it under the terms of the GNU General Public License as published by
 > +   the Free Software Foundation; either version 3 of the License, or
 > +   (at your option) any later version.
 > +
 > +   This program is distributed in the hope that it will be useful,
 > +   but WITHOUT ANY WARRANTY; without even the implied warranty of
 > +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 > +   GNU General Public License for more details.
 > +
 > +   You should have received a copy of the GNU General Public License
 > +   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 > +
 > +#ifndef COMMON_REGCACHE_H
 > +#define COMMON_REGCACHE_H
 > +
 > +/* This header is a stopgap until we have an independent regcache.  */
 > +
 > +/* Return the register cache associated with the thread specified
 > +   by PTID.  This function must be provided by the client.  */

Hi.
Can you add a comment here explaining the ownership of the memory
object returned?
E.g., is it cached "internally" to the function so that the caller
doesn't have to free it?

Thanks!

 > +
 > +extern struct regcache *get_thread_regcache_for_ptid (ptid_t ptid);
 > +
 > +/* Read the PC register.  This function must be provided by the
 > +   client.  */
 > +
 > +extern CORE_ADDR regcache_read_pc (struct regcache *regcache);
 > +
 > +#endif /* COMMON_REGCACHE_H */
  
Gary Benson Sept. 11, 2014, 11:02 a.m. UTC | #3
Doug Evans wrote:
> Gary Benson writes:
> > +/* Return the register cache associated with the thread specified
> > +   by PTID.  This function must be provided by the client.  */
> 
> Can you add a comment here explaining the ownership of the memory
> object returned?  E.g., is it cached "internally" to the function
> so that the caller doesn't have to free it?

That seems odd.  We don't document other similar functions this way:
I'm thinking GDB's get_current_arch, current_inferior, target_gdbarch,
or gdbserver's current_process, current_target_desc.  It seems the
pattern is to note if the caller must free the object and to remain
quiet otherwise.

How about I change the comment to "Return _a_pointer_to_ the register
cache..."?  (underlines for emphasis here).

Cheers,
Gary
  
Doug Evans Sept. 11, 2014, 5:12 p.m. UTC | #4
On Thu, Sep 11, 2014 at 4:02 AM, Gary Benson <gbenson@redhat.com> wrote:
> Doug Evans wrote:
>> Gary Benson writes:
>> > +/* Return the register cache associated with the thread specified
>> > +   by PTID.  This function must be provided by the client.  */
>>
>> Can you add a comment here explaining the ownership of the memory
>> object returned?  E.g., is it cached "internally" to the function
>> so that the caller doesn't have to free it?
>
> That seems odd.  We don't document other similar functions this way:
> I'm thinking GDB's get_current_arch, current_inferior, target_gdbarch,
> or gdbserver's current_process, current_target_desc.  It seems the
> pattern is to note if the caller must free the object and to remain
> quiet otherwise.

Yeah, but I never liked such things being implicit.
I can't trust a missing "caller must free" as being intentional.
[One can equally argue the presence of "caller must free" (or "not
free") isn't necessarily trustable, but such things don't change that
often.]

With a name like "get_current_foo", the "current" makes things less
implicit (at least to me).

If we were using c++ then object ownership can (often, though not
always) be more clearly expressed and then such things can be more
reasonably left as being implicit in comments.
But we don't have that so if we're going to be cleaning things up, and
maybe even paying a little attention to API design, I figure IWBN to
have things be clearer than they are today.

[Plus I get bitten time and again by taking gdb's existing practice as
something we actually want to keep. :-)]

> How about I change the comment to "Return _a_pointer_to_ the register
> cache..."?  (underlines for emphasis here).

If one was going to add emphasis, I'd emphasize _the_. :-)
  
Gary Benson Sept. 12, 2014, 9:45 a.m. UTC | #5
Doug Evans wrote:
> On Thu, Sep 11, 2014 at 4:02 AM, Gary Benson <gbenson@redhat.com> wrote:
> > Doug Evans wrote:
> > > Gary Benson writes:
> > > > +/* Return the register cache associated with the thread specified
> > > > +   by PTID.  This function must be provided by the client.  */
> > >
> > > Can you add a comment here explaining the ownership of the
> > > memory object returned?  E.g., is it cached "internally" to
> > > the function so that the caller doesn't have to free it?
> >
> > That seems odd.  We don't document other similar functions this
> > way: I'm thinking GDB's get_current_arch, current_inferior,
> > target_gdbarch, or gdbserver's current_process,
> > current_target_desc.  It seems the pattern is to note if the
> > caller must free the object and to remain quiet otherwise.
> 
> Yeah, but I never liked such things being implicit.  I can't trust a
> missing "caller must free" as being intentional.  [One can equally
> argue the presence of "caller must free" (or "not free") isn't
> necessarily trustable, but such things don't change that often.]
> 
> With a name like "get_current_foo", the "current" makes things less
> implicit (at least to me).
> 
> If we were using c++ then object ownership can (often, though not
> always) be more clearly expressed and then such things can be more
> reasonably left as being implicit in comments.  But we don't have
> that so if we're going to be cleaning things up, and maybe even
> paying a little attention to API design, I figure IWBN to have
> things be clearer than they are today.
> 
> [Plus I get bitten time and again by taking gdb's existing practice
> as something we actually want to keep. :-)]
> 
> > How about I change the comment to "Return _a_pointer_to_ the
> > register cache..."?  (underlines for emphasis here).
> 
> If one was going to add emphasis, I'd emphasize _the_. :-)

I tried to figure out how to succinctly write what you're asking me
to here but I'm stuck.  Is there a function documented in this way
in GDB I can use as an example?

In the interests of keeping things moving I've pushed the patch with
this comment:

   Return a pointer to the register cache associated with the
   thread specified by PTID.  This function must be provided by
   the client.

Thanks,
Gary
  
Doug Evans Sept. 12, 2014, 4:28 p.m. UTC | #6
On Fri, Sep 12, 2014 at 2:45 AM, Gary Benson <gbenson@redhat.com> wrote:
> I tried to figure out how to succinctly write what you're asking me
> to here but I'm stuck.  Is there a function documented in this way
> in GDB I can use as an example?
>
> In the interests of keeping things moving I've pushed the patch with
> this comment:
>
>    Return a pointer to the register cache associated with the
>    thread specified by PTID.  This function must be provided by
>    the client.

Fine by me.
  

Patch

diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index 49b7c74..b9e766f 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -938,7 +938,8 @@  target/wait.h target/waitstatus.h nat/linux-nat.h nat/linux-waitpid.h \
 common/print-utils.h common/rsp-low.h nat/i386-dregs.h x86-linux-nat.h \
 i386-linux-nat.h common/common-defs.h common/errors.h common/common-types.h \
 common/common-debug.h common/cleanups.h common/gdb_setjmp.h \
-common/common-exceptions.h target/target.h target/symbol.h
+common/common-exceptions.h target/target.h target/symbol.h \
+common/common-regcache.h
 
 # Header files that already have srcdir in them, or which are in objdir.
 
diff --git a/gdb/common/common-regcache.h b/gdb/common/common-regcache.h
new file mode 100644
index 0000000..aef6bfd
--- /dev/null
+++ b/gdb/common/common-regcache.h
@@ -0,0 +1,35 @@ 
+/* Cache and manage the values of registers
+
+   Copyright (C) 1986-2014 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef COMMON_REGCACHE_H
+#define COMMON_REGCACHE_H
+
+/* This header is a stopgap until we have an independent regcache.  */
+
+/* Return the register cache associated with the thread specified
+   by PTID.  This function must be provided by the client.  */
+
+extern struct regcache *get_thread_regcache_for_ptid (ptid_t ptid);
+
+/* Read the PC register.  This function must be provided by the
+   client.  */
+
+extern CORE_ADDR regcache_read_pc (struct regcache *regcache);
+
+#endif /* COMMON_REGCACHE_H */
diff --git a/gdb/gdbserver/regcache.c b/gdb/gdbserver/regcache.c
index fda2069..ad66ff7 100644
--- a/gdb/gdbserver/regcache.c
+++ b/gdb/gdbserver/regcache.c
@@ -60,6 +60,14 @@  get_thread_regcache (struct thread_info *thread, int fetch)
   return regcache;
 }
 
+/* See common/common-regcache.h.  */
+
+struct regcache *
+get_thread_regcache_for_ptid (ptid_t ptid)
+{
+  return get_thread_regcache (find_thread_ptid (ptid), 1);
+}
+
 void
 regcache_invalidate_thread (struct thread_info *thread)
 {
diff --git a/gdb/gdbserver/regcache.h b/gdb/gdbserver/regcache.h
index 891fead..0c933f3 100644
--- a/gdb/gdbserver/regcache.h
+++ b/gdb/gdbserver/regcache.h
@@ -19,6 +19,8 @@ 
 #ifndef REGCACHE_H
 #define REGCACHE_H
 
+#include "common-regcache.h"
+
 struct thread_info;
 struct target_desc;
 
@@ -91,8 +93,6 @@  void registers_to_string (struct regcache *regcache, char *buf);
 
 void registers_from_string (struct regcache *regcache, char *buf);
 
-CORE_ADDR regcache_read_pc (struct regcache *regcache);
-
 void regcache_write_pc (struct regcache *regcache, CORE_ADDR pc);
 
 /* Return a pointer to the description of register ``n''.  */
diff --git a/gdb/nat/linux-btrace.c b/gdb/nat/linux-btrace.c
index f6fdbda..cf98582 100644
--- a/gdb/nat/linux-btrace.c
+++ b/gdb/nat/linux-btrace.c
@@ -26,7 +26,7 @@ 
 #endif
 
 #include "linux-btrace.h"
-#include "regcache.h"
+#include "common-regcache.h"
 #include "gdbthread.h"
 #include "gdb_wait.h"
 #include "i386-cpuid.h"
@@ -180,11 +180,7 @@  perf_event_read_bts (struct btrace_target_info* tinfo, const uint8_t *begin,
   gdb_assert (start <= end);
 
   /* The first block ends at the current pc.  */
-#ifdef GDBSERVER
-  regcache = get_thread_regcache (find_thread_ptid (tinfo->ptid), 1);
-#else
-  regcache = get_thread_regcache (tinfo->ptid);
-#endif
+  regcache = get_thread_regcache_for_ptid (tinfo->ptid);
   block.end = regcache_read_pc (regcache);
 
   /* The buffer may contain a partial record as its last entry (i.e. when the
diff --git a/gdb/regcache.c b/gdb/regcache.c
index 05b8fb9..9b6c794 100644
--- a/gdb/regcache.c
+++ b/gdb/regcache.c
@@ -536,6 +536,13 @@  get_current_regcache (void)
   return get_thread_regcache (inferior_ptid);
 }
 
+/* See common/common-regcache.h.  */
+
+struct regcache *
+get_thread_regcache_for_ptid (ptid_t ptid)
+{
+  return get_thread_regcache (ptid);
+}
 
 /* Observer for the target_changed event.  */
 
diff --git a/gdb/regcache.h b/gdb/regcache.h
index 0361f22..37cffe3 100644
--- a/gdb/regcache.h
+++ b/gdb/regcache.h
@@ -20,6 +20,8 @@ 
 #ifndef REGCACHE_H
 #define REGCACHE_H
 
+#include "common-regcache.h"
+
 struct regcache;
 struct gdbarch;
 struct address_space;
@@ -135,7 +137,6 @@  void regcache_cooked_write_part (struct regcache *regcache, int regnum,
 
 /* Special routines to read/write the PC.  */
 
-extern CORE_ADDR regcache_read_pc (struct regcache *regcache);
 extern void regcache_write_pc (struct regcache *regcache, CORE_ADDR pc);
 
 /* Transfer a raw register [0..NUM_REGS) between the regcache and the