2002-04-09 Daniel Jacobowitz <drow@mvista.com>
authorDaniel Jacobowitz <drow@false.org>
Tue, 9 Apr 2002 23:52:06 +0000 (23:52 +0000)
committerDaniel Jacobowitz <drow@false.org>
Tue, 9 Apr 2002 23:52:06 +0000 (23:52 +0000)
        * 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.

gdb/ChangeLog
gdb/gdbserver/linux-low.c
gdb/gdbserver/remote-utils.c
gdb/gdbserver/server.c
gdb/gdbserver/server.h
gdb/gdbserver/target.h

index 330793fc90dff9fd2dd79488ef4f862e79e56695..5b1be44084f5608c448c271dceb3fd1961ee1f21 100644 (file)
@@ -1,3 +1,13 @@
+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.
+
 2002-04-09  Daniel Jacobowitz  <drow@mvista.com>
 
        * gdbserver/server.h: Include <string.h> if HAVE_STRING_H.
index 307fab21a13697056fd5c8a4018f46059d0cb331..8c729df2feb86307e721ac67bef4c4ae22bfe657 100644 (file)
@@ -481,6 +481,13 @@ linux_write_memory (CORE_ADDR memaddr, char *myaddr, int len)
 
   return 0;
 }
+
+static void
+linux_look_up_symbols (void)
+{
+  /* Don't need to look up any symbols yet.  */
+}
+
 \f
 static struct target_ops linux_target_ops = {
   linux_create_inferior,
@@ -493,6 +500,7 @@ static struct target_ops linux_target_ops = {
   linux_store_registers,
   linux_read_memory,
   linux_write_memory,
+  linux_look_up_symbols,
 };
 
 void
index c61f1e03b444d0578c1d1abd25166139dd6103ee..14734f161bdbc5239ccfb33d05a134612327362b 100644 (file)
@@ -205,6 +205,23 @@ unhexify (char *bin, const char *hex, int count)
   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 *mem_addr_ptr, unsigned int *len_ptr,
 
   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 94c27d3e4cd52ff45276906b1b15d844464425bb..3afab2b1d1117dc96e3338e696eb661690fc8e4d 100644 (file)
@@ -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 0d9ec4efc82a4a0fc08f7ab65c63606e22080475..3f0a543c7166f7daed57a78ff61dd8ca310839d0 100644 (file)
@@ -106,6 +106,7 @@ void decode_M_packet (char *from, CORE_ADDR * mem_addr_ptr,
 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 094f4ce4354cd5c8a16d6622bb722edce08d5134..685a801cb972b71023f093ab98db50fd307363e3 100644 (file)
@@ -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;