[06/11,v5] Add target/symbol.h

Message ID 1406888377-25795-7-git-send-email-gbenson@redhat.com
State Superseded
Headers

Commit Message

Gary Benson Aug. 1, 2014, 10:19 a.m. UTC
  This adds target/symbol.h.  This file declares a function that the
shared code can use and that the clients must implement.  It also
changes some shared code to use these functions.

gdb/
2014-08-01  Tom Tromey  <tromey@redhat.com>
	    Gary Benson  <gbenson@redhat.com>

	* target/symbol.h: New file.
	* Makefile.in (HFILES_NO_SRCDIR): Add target/symbol.h.
	* target.h: Include target/symbol.h.
	* target.c (target_look_up_symbol): New function.
	* common/agent.c: Include target/symbol.h.
	[!GDBSERVER]: Don't include objfiles.h.
	(agent_look_up_symbols): Use target_look_up_symbol.

gdb/gdbserver/
2014-08-01  Tom Tromey  <tromey@redhat.com>
	    Gary Benson  <gbenson@redhat.com>

	* target.c: Include target/symbol.h.
	(target_look_up_symbol): New function.
---
 gdb/ChangeLog           |   11 +++++++++++
 gdb/Makefile.in         |    2 +-
 gdb/common/agent.c      |   14 ++------------
 gdb/gdbserver/ChangeLog |    6 ++++++
 gdb/gdbserver/target.c  |   12 ++++++++++++
 gdb/target.c            |   14 ++++++++++++++
 gdb/target.h            |    1 +
 gdb/target/symbol.h     |   36 ++++++++++++++++++++++++++++++++++++
 8 files changed, 83 insertions(+), 13 deletions(-)
 create mode 100644 gdb/target/symbol.h
  

Comments

Doug Evans Aug. 6, 2014, 6:08 p.m. UTC | #1
Gary Benson writes:
 > This adds target/symbol.h.  This file declares a function that the
 > shared code can use and that the clients must implement.  It also
 > changes some shared code to use these functions.
 > 
 > gdb/
 > 2014-08-01  Tom Tromey  <tromey@redhat.com>
 > 	    Gary Benson  <gbenson@redhat.com>
 > 
 > 	* target/symbol.h: New file.
 > 	* Makefile.in (HFILES_NO_SRCDIR): Add target/symbol.h.
 > 	* target.h: Include target/symbol.h.
 > 	* target.c (target_look_up_symbol): New function.
 > 	* common/agent.c: Include target/symbol.h.
 > 	[!GDBSERVER]: Don't include objfiles.h.
 > 	(agent_look_up_symbols): Use target_look_up_symbol.
 > 
 > gdb/gdbserver/
 > 2014-08-01  Tom Tromey  <tromey@redhat.com>
 > 	    Gary Benson  <gbenson@redhat.com>
 > 
 > 	* target.c: Include target/symbol.h.
 > 	(target_look_up_symbol): New function.
 > [...]
 > diff --git a/gdb/target/symbol.h b/gdb/target/symbol.h
 > new file mode 100644
 > index 0000000..bb37b72
 > --- /dev/null
 > +++ b/gdb/target/symbol.h
 > @@ -0,0 +1,36 @@
 > +/* Declarations of target symbol functions.
 > +
 > +   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 TARGET_SYMBOL_H
 > +#define TARGET_SYMBOL_H
 > +
 > +struct objfile;
 > +
 > +/* Find a symbol that matches NAME.  Limit the search to OBJFILE if
 > +   OBJFILE is non-NULL and the implementation supports limiting the
 > +   search to specific object files.  If a match is found, store the
 > +   matching symbol's address in ADDR and return nonzero.  Return zero
 > +   if no symbol matching NAME is found.  Raise an exception if OBJFILE
 > +   is non-NULL and the implementation does not support limiting
 > +   searches to specific object files.  */
 > +
 > +extern int target_look_up_symbol (const char *name, CORE_ADDR *addr,
 > +				  struct objfile *objfile);
 > +
 > +#endif /* TARGET_SYMBOL_H */
 > -- 
 > 1.7.1

Can this comment spell out that either a mangled or demangled
form of the symbol is allowed for NAME?
[assuming that that is indeed the case]

Also, the target/target.h memory routines return zero for success
and a non-zero error code for failure.  E.g.,

+/* Read LEN bytes of target memory at address MEMADDR, placing the
+   results in GDB's memory at MYADDR.  Return zero for success,
+   nonzero if any error occurs.  Implementations of this function may
+   define and use their own error codes, but functions in the common,
+   nat and target directories must treat the return code as opaque.
+   No guarantee is made about the contents of the data at MYADDR if
+   any error occurs.  */
+
+extern int target_read_memory (CORE_ADDR memaddr, gdb_byte *myaddr,
+			       ssize_t len);

Do we want to be consistent here, and have the same results for
target_look_up_symbol? [and throughout the target API]
  
Gary Benson Aug. 7, 2014, 10:42 a.m. UTC | #2
Doug Evans wrote:
> Gary Benson writes:
> > +/* Find a symbol that matches NAME.  Limit the search to OBJFILE if
> > +   OBJFILE is non-NULL and the implementation supports limiting the
> > +   search to specific object files.  If a match is found, store the
> > +   matching symbol's address in ADDR and return nonzero.  Return zero
> > +   if no symbol matching NAME is found.  Raise an exception if OBJFILE
> > +   is non-NULL and the implementation does not support limiting
> > +   searches to specific object files.  */
> > +
> > +extern int target_look_up_symbol (const char *name, CORE_ADDR *addr,
> > +				  struct objfile *objfile);
> 
> Can this comment spell out that either a mangled or demangled
> form of the symbol is allowed for NAME?
> [assuming that that is indeed the case]

It is the case.  I'll update the comment.

> Also, the target/target.h memory routines return zero for success
> and a non-zero error code for failure.  E.g.,
> 
> +/* Read LEN bytes of target memory at address MEMADDR, placing the
> +   results in GDB's memory at MYADDR.  Return zero for success,
> +   nonzero if any error occurs.  Implementations of this function may
> +   define and use their own error codes, but functions in the common,
> +   nat and target directories must treat the return code as opaque.
> +   No guarantee is made about the contents of the data at MYADDR if
> +   any error occurs.  */
> +
> +extern int target_read_memory (CORE_ADDR memaddr, gdb_byte *myaddr,
> +			       ssize_t len);
> 
> Do we want to be consistent here, and have the same results for
> target_look_up_symbol? [and throughout the target API]

That seems reasonable to me, I'll make the change.

Thanks,
Gary
  
Pedro Alves Aug. 20, 2014, 11:16 a.m. UTC | #3
On 08/01/2014 11:19 AM, Gary Benson wrote:
> This adds target/symbol.h.  This file declares a function that the
> shared code can use and that the clients must implement.  It also
> changes some shared code to use these functions.

A small parens:

I have to say that calling this new method target_foo looks kind of
awkward to me.  Unlike other target methods and helpers, that extract
info out of the target or tell the target to do something,
this goes in the other direction -- this is the target/backend/server
calling back to the client/symbol side for something.  Put another way,
seems like this method would never ultimately go through target_ops.

Thanks,
Pedro Alves
  
Gary Benson Aug. 20, 2014, 12:14 p.m. UTC | #4
Pedro Alves wrote:
> On 08/01/2014 11:19 AM, Gary Benson wrote:
> > This adds target/symbol.h.  This file declares a function that the
> > shared code can use and that the clients must implement.  It also
> > changes some shared code to use these functions.
> 
> A small parens:
> 
> I have to say that calling this new method target_foo looks kind
> of awkward to me.  Unlike other target methods and helpers, that
> extract info out of the target or tell the target to do something,
> this goes in the other direction -- this is the target/backend/
> server calling back to the client/symbol side for something.  Put
> another way, seems like this method would never ultimately go
> through target_ops.

Can you suggest a more suitable name?

Thanks,
Gary
  
Pedro Alves Aug. 20, 2014, 2:17 p.m. UTC | #5
On 08/20/2014 01:14 PM, Gary Benson wrote:
> Pedro Alves wrote:
>> On 08/01/2014 11:19 AM, Gary Benson wrote:
>>> This adds target/symbol.h.  This file declares a function that the
>>> shared code can use and that the clients must implement.  It also
>>> changes some shared code to use these functions.
>>
>> A small parens:
>>
>> I have to say that calling this new method target_foo looks kind
>> of awkward to me.  Unlike other target methods and helpers, that
>> extract info out of the target or tell the target to do something,
>> this goes in the other direction -- this is the target/backend/
>> server calling back to the client/symbol side for something.  Put
>> another way, seems like this method would never ultimately go
>> through target_ops.
> 
> Can you suggest a more suitable name?

find_minimal_symbol_address ?

I'd suggest moving this out of target.c too.  E.g., to a
new gdbserver/symbol.c or some such.
  

Patch

diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index 090c912..fea7550 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -936,7 +936,7 @@  ctf.h nat/i386-cpuid.h nat/i386-gcc-cpuid.h target/resume.h \
 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 target/target.h
+common/common-debug.h target/target.h target/symbol.h
 
 # Header files that already have srcdir in them, or which are in objdir.
 
diff --git a/gdb/common/agent.c b/gdb/common/agent.c
index 5c19454..d68e50e 100644
--- a/gdb/common/agent.c
+++ b/gdb/common/agent.c
@@ -21,9 +21,9 @@ 
 #include "server.h"
 #else
 #include "defs.h"
-#include "objfiles.h"
 #endif
 #include "target/target.h"
+#include "target/symbol.h"
 #include <unistd.h>
 #include "agent.h"
 #include "filestuff.h"
@@ -98,18 +98,8 @@  agent_look_up_symbols (void *arg)
     {
       CORE_ADDR *addrp =
 	(CORE_ADDR *) ((char *) &ipa_sym_addrs + symbol_list[i].offset);
-#ifdef GDBSERVER
-
-      if (look_up_one_symbol (symbol_list[i].name, addrp, 1) == 0)
-#else
-      struct bound_minimal_symbol sym =
-	lookup_minimal_symbol (symbol_list[i].name, NULL,
-			       (struct objfile *) arg);
 
-      if (sym.minsym != NULL)
-	*addrp = BMSYMBOL_VALUE_ADDRESS (sym);
-      else
-#endif
+      if (target_look_up_symbol (symbol_list[i].name, addrp, arg) == 0)
 	{
 	  DEBUG_AGENT ("symbol `%s' not found\n", symbol_list[i].name);
 	  return -1;
diff --git a/gdb/gdbserver/target.c b/gdb/gdbserver/target.c
index 6ba375c..ad249a0 100644
--- a/gdb/gdbserver/target.c
+++ b/gdb/gdbserver/target.c
@@ -20,6 +20,7 @@ 
 
 #include "server.h"
 #include "tracepoint.h"
+#include "target/symbol.h"
 
 struct target_ops *the_target;
 
@@ -168,6 +169,17 @@  target_resume (ptid_t ptid, int step, enum gdb_signal signal)
   (*the_target->resume) (&resume_info, 1);
 }
 
+/* See target/symbol.h.  */
+
+int
+target_look_up_symbol (const char *name, CORE_ADDR *addr,
+		       struct objfile *objfile)
+{
+  gdb_assert (objfile == NULL);
+
+  return look_up_one_symbol (name, addr, 1);
+}
+
 int
 start_non_stop (int nonstop)
 {
diff --git a/gdb/target.c b/gdb/target.c
index 1773eff..fd5a806 100644
--- a/gdb/target.c
+++ b/gdb/target.c
@@ -1292,6 +1292,20 @@  target_read_uint32 (CORE_ADDR memaddr, unsigned int *result)
   return 0;
 }
 
+/* See target/symbol.h.  */
+
+int
+target_look_up_symbol (const char *name, CORE_ADDR *addr,
+		       struct objfile *objfile)
+{
+  struct bound_minimal_symbol sym
+    = lookup_minimal_symbol (name, NULL, objfile);
+
+  if (sym.minsym != NULL)
+    *addr = BMSYMBOL_VALUE_ADDRESS (sym);
+  return sym.minsym != NULL;
+}
+
 /* Like target_read_memory, but specify explicitly that this is a read
    from the target's raw memory.  That is, this read bypasses the
    dcache, breakpoint shadowing, etc.  */
diff --git a/gdb/target.h b/gdb/target.h
index 1a10744..f16c84c 100644
--- a/gdb/target.h
+++ b/gdb/target.h
@@ -62,6 +62,7 @@  struct dcache_struct;
 #include "target/resume.h"
 #include "target/wait.h"
 #include "target/waitstatus.h"
+#include "target/symbol.h"
 #include "bfd.h"
 #include "symtab.h"
 #include "memattr.h"
diff --git a/gdb/target/symbol.h b/gdb/target/symbol.h
new file mode 100644
index 0000000..bb37b72
--- /dev/null
+++ b/gdb/target/symbol.h
@@ -0,0 +1,36 @@ 
+/* Declarations of target symbol functions.
+
+   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 TARGET_SYMBOL_H
+#define TARGET_SYMBOL_H
+
+struct objfile;
+
+/* Find a symbol that matches NAME.  Limit the search to OBJFILE if
+   OBJFILE is non-NULL and the implementation supports limiting the
+   search to specific object files.  If a match is found, store the
+   matching symbol's address in ADDR and return nonzero.  Return zero
+   if no symbol matching NAME is found.  Raise an exception if OBJFILE
+   is non-NULL and the implementation does not support limiting
+   searches to specific object files.  */
+
+extern int target_look_up_symbol (const char *name, CORE_ADDR *addr,
+				  struct objfile *objfile);
+
+#endif /* TARGET_SYMBOL_H */