From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15197 invoked by alias); 1 Feb 2004 01:22:31 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 15105 invoked from network); 1 Feb 2004 01:22:30 -0000 Received: from unknown (HELO nevyn.them.org) (66.93.172.17) by sources.redhat.com with SMTP; 1 Feb 2004 01:22:30 -0000 Received: from drow by nevyn.them.org with local (Exim 4.30 #1 (Debian)) id 1An6Ji-0005xu-16; Sat, 31 Jan 2004 20:22:30 -0500 Date: Sun, 01 Feb 2004 01:22:00 -0000 From: Daniel Jacobowitz To: gdb-patches@sources.redhat.com Cc: cagney@redhat.com Subject: [rfa] qSymbol in remote_wait Message-ID: <20040201012229.GA22861@nevyn.them.org> Mail-Followup-To: gdb-patches@sources.redhat.com, cagney@redhat.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.1i X-SW-Source: 2004-02/txt/msg00000.txt.bz2 Hi Andrew, As Amit Kale mentioned in December, to support NPTL gdbserver needs to look up symbols during remote_wait. The existing qSymbol model assumes that only at objfile loads (i.e. during td_ta_new) do we need to look up symbols; NPTL looks up symbols lazily when it needs them, which includes at the creation of the first child thread. This patch (which, I know, needs a matching change for the manual) allows qSymbol: queries as a response to remote_wait, in much the same way as the file I/O protocol. Is this OK? If so I'll write up the documentation change. -- Daniel Jacobowitz MontaVista Software Debian GNU/Linux Developer 2004-01-31 Daniel Jacobowitz * remote.c (handle_remote_qsymbol): New function, broken out from remote_check_symbols. (remote_check_symbols): Call it. (remote_wait): Handle qSymbol. (remote_async_wait): Likewise. Index: remote.c =================================================================== RCS file: /cvs/src/src/gdb/remote.c,v retrieving revision 1.128 diff -u -p -r1.128 remote.c --- remote.c 26 Jan 2004 23:07:00 -0000 1.128 +++ remote.c 1 Feb 2004 01:18:27 -0000 @@ -2075,17 +2075,36 @@ init_all_packet_configs (void) /* Symbol look-up. */ static void -remote_check_symbols (struct objfile *objfile) +handle_remote_qsymbol (char *reply) { struct remote_state *rs = get_remote_state (); - char *msg, *reply, *tmp; + char *msg = alloca (rs->remote_packet_size); + char *tmp; struct minimal_symbol *sym; int end; + tmp = &reply[8]; + end = hex2bin (tmp, msg, strlen (tmp) / 2); + msg[end] = '\0'; + sym = lookup_minimal_symbol (msg, NULL, NULL); + if (sym == NULL) + sprintf (msg, "qSymbol::%s", &reply[8]); + else + sprintf (msg, "qSymbol:%s:%s", + paddr_nz (SYMBOL_VALUE_ADDRESS (sym)), + &reply[8]); + putpkt (msg); +} + +static void +remote_check_symbols (struct objfile *objfile) +{ + struct remote_state *rs = get_remote_state (); + char *reply; + if (remote_protocol_qSymbol.support == PACKET_DISABLE) return; - msg = alloca (rs->remote_packet_size); reply = alloca (rs->remote_packet_size); /* Invite target to request symbol lookups. */ @@ -2096,18 +2115,8 @@ remote_check_symbols (struct objfile *ob while (strncmp (reply, "qSymbol:", 8) == 0) { - tmp = &reply[8]; - end = hex2bin (tmp, msg, strlen (tmp) / 2); - msg[end] = '\0'; - sym = lookup_minimal_symbol (msg, NULL, NULL); - if (sym == NULL) - sprintf (msg, "qSymbol::%s", &reply[8]); - else - sprintf (msg, "qSymbol:%s:%s", - paddr_nz (SYMBOL_VALUE_ADDRESS (sym)), - &reply[8]); - putpkt (msg); - getpkt (reply, (rs->remote_packet_size), 0); + handle_remote_qsymbol (reply); + getpkt (reply, rs->remote_packet_size, 0); } } @@ -2993,6 +3002,11 @@ Packet: '%s'\n", case 'O': /* Console output */ remote_console_output (buf + 1); continue; + case 'q': + if (strncmp (buf, "qSymbol:", 8) != 0) + goto invalid; + handle_remote_qsymbol (buf); + continue; case '\0': if (last_sent_signal != TARGET_SIGNAL_0) { @@ -3011,6 +3025,7 @@ Packet: '%s'\n", } /* else fallthrough */ default: +invalid: warning ("Invalid remote reply: %s", buf); continue; } @@ -3185,6 +3200,11 @@ remote_async_wait (ptid_t ptid, struct t still be waiting on the inferior afterwards. */ status->kind = TARGET_WAITKIND_IGNORE; goto got_status; + case 'q': + if (strncmp (buf, "qSymbol:", 8) != 0) + goto invalid; + handle_remote_qsymbol (buf); + continue; case '\0': if (last_sent_signal != TARGET_SIGNAL_0) { @@ -3203,6 +3223,7 @@ remote_async_wait (ptid_t ptid, struct t } /* else fallthrough */ default: +invalid: warning ("Invalid remote reply: %s", buf); continue; }