This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH: Improve gdbserver access to remote symbol lookup


This gives gdbserver's brand new target stack a hook to query GDB for
symbols via 'qSymbol' - which works great, by the way.  Committed after
testing.

-- 
Daniel Jacobowitz                           Carnegie Mellon University
MontaVista Software                         Debian GNU/Linux Developer

2002-04-09  Daniel Jacobowitz  <drow@mvista.com>

	* linux-low.c (linux_look_up_symbols): New hook.
	(linux_target_ops): Add linux_look_up_symbols.
	* remote-utils.c (decode_address): New function.
	(look_up_one_symbol): New function.
	* server.c (handle_query): Call target look_up_symbols hook.
	* server.h (look_up_one_symbol): Add prototype.
	* target.h (struct target_ops): Add look_up_symbols hook.

Index: linux-low.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/linux-low.c,v
retrieving revision 1.12
diff -u -p -r1.12 linux-low.c
--- linux-low.c	9 Apr 2002 22:44:43 -0000	1.12
+++ linux-low.c	9 Apr 2002 23:44:52 -0000
@@ -481,6 +481,13 @@ linux_write_memory (CORE_ADDR memaddr, c
 
   return 0;
 }
+
+static void
+linux_look_up_symbols (void)
+{
+  /* Don't need to look up any symbols yet.  */
+}
+
 
 static struct target_ops linux_target_ops = {
   linux_create_inferior,
@@ -493,6 +500,7 @@ static struct target_ops linux_target_op
   linux_store_registers,
   linux_read_memory,
   linux_write_memory,
+  linux_look_up_symbols,
 };
 
 void
Index: remote-utils.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/remote-utils.c,v
retrieving revision 1.13
diff -u -p -r1.13 remote-utils.c
--- remote-utils.c	9 Apr 2002 21:16:16 -0000	1.13
+++ remote-utils.c	9 Apr 2002 23:44:52 -0000
@@ -205,6 +205,23 @@ unhexify (char *bin, const char *hex, in
   return i;
 }
 
+static void
+decode_address (CORE_ADDR *addrp, const char *start, int len)
+{
+  CORE_ADDR addr;
+  char ch;
+  int i;
+
+  addr = 0;
+  for (i = 0; i < len; i++)
+    {
+      ch = start[i];
+      addr = addr << 4;
+      addr = addr | (fromhex (ch) & 0x0f);
+    }
+  *addrp = addr;
+}
+
 /* Convert number NIB to a hex digit.  */
 
 static int
@@ -581,3 +598,42 @@ decode_M_packet (char *from, CORE_ADDR *
 
   convert_ascii_to_int (&from[i++], to, *len_ptr);
 }
+
+int
+look_up_one_symbol (const char *name, CORE_ADDR *addrp)
+{
+  char own_buf[266], *p, *q;
+  int len;
+
+  /* Send the request.  */
+  strcpy (own_buf, "qSymbol:");
+  hexify (own_buf + strlen ("qSymbol:"), name, strlen (name));
+  if (putpkt (own_buf) < 0)
+    return -1;
+
+  /* FIXME:  Eventually add buffer overflow checking (to getpkt?)  */
+  len = getpkt (own_buf);
+  if (len < 0)
+    return -1;
+
+  if (strncmp (own_buf, "qSymbol:", strlen ("qSymbol:")) != 0)
+    {
+      /* Malformed response.  */
+      if (remote_debug)
+	fprintf (stderr, "Malformed response to qSymbol, ignoring.\n");
+      return -1;
+    }
+
+  p = own_buf + strlen ("qSymbol:");
+  q = p;
+  while (*q && *q != ':')
+    q++;
+
+  /* Make sure we found a value for the symbol.  */
+  if (p == q || *q == '\0')
+    return 0;
+
+  decode_address (addrp, p, q - p);
+  return 1;
+}
+
Index: server.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/server.c,v
retrieving revision 1.9
diff -u -p -r1.9 server.c
--- server.c	9 Apr 2002 21:16:16 -0000	1.9
+++ server.c	9 Apr 2002 23:44:53 -0000
@@ -63,13 +63,9 @@ handle_query (char *own_buf)
 {
   if (strcmp ("qSymbol::", own_buf) == 0)
     {
-#if 0
-      strcpy (own_buf, "qSymbol:");
-      hexify (own_buf + strlen ("qSymbol:"), "main", 4);
-      putpkt (own_buf);
-      getpkt (own_buf);
-      fprintf (stderr, "Got %s", own_buf);
-#endif
+      if (the_target->look_up_symbols != NULL)
+	(*the_target->look_up_symbols) ();
+
       strcpy (own_buf, "OK");
       return;
     }
Index: server.h
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/server.h,v
retrieving revision 1.8
diff -u -p -r1.8 server.h
--- server.h	9 Apr 2002 22:58:00 -0000	1.8
+++ server.h	9 Apr 2002 23:44:53 -0000
@@ -106,6 +106,7 @@ void decode_M_packet (char *from, CORE_A
 int unhexify (char *bin, const char *hex, int count);
 int hexify (char *hex, const char *bin, int count);
 
+int look_up_one_symbol (const char *name, CORE_ADDR *addrp);
 
 /* Functions from ``signals.c''.  */
 enum target_signal target_signal_from_host (int hostsig);
Index: target.h
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/target.h,v
retrieving revision 1.1
diff -u -p -r1.1 target.h
--- target.h	9 Apr 2002 21:17:45 -0000	1.1
+++ target.h	9 Apr 2002 23:44:53 -0000
@@ -94,6 +94,13 @@ struct target_ops
      Returns 0 on success and errno on failure.  */
 
   int (*write_memory) (CORE_ADDR memaddr, char *myaddr, int len);
+
+  /* Query GDB for the values of any symbols we're interested in.
+     This function is called whenever we receive a "qSymbols::"
+     query, which corresponds to every time more symbols (might)
+     become available.  */
+
+  void (*look_up_symbols) (void);
 };
 
 extern struct target_ops *the_target;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]