Re: embedded system and "target remote"

Matthias Pfaller <[email protected]>
Newsgroups gmane.comp.gdb.devel
Message-ID <[email protected]>
Hi,

I have done a patch that hands down thread information to remote.c.
As this is the first time I had a look at the gdb sources I'm pretty
sure my code is not suitable for integration...

The patch has (at least) the following problems:

- the thread id is needed in bp_target_info because this is what
remote.c will get. Because of this I now have the thread id in three
places (bp_location.thread, bp_location.overlay_target_info.thread and
bp_location.target_info.thread).

- there is no way to turn this off (I have no idea how this would
normally be handled)

- I have extended the Z0/Z1/z0/z1 to provide an additional parameter
(the thread id) when target_info.thread is >= 0.


regards, Matthias

PS: The stub code will hopefully follow in a couple of days.
-- 
Matthias Pfaller                          Software Entwicklung
marco Systemanalyse und Entwicklung GmbH  Tel   +49 8131 5161 41
Hans-Böckler-Str. 2, D 85221 Dachau       Fax   +49 8131 5161 66
http://www.marco.de/                      Email [email protected]
Geschäftsführer Martin Reuter             HRB 171775 Amtsgericht München
gdb-patch (text/plain, 4.3 KB)
--- ../orig/gdb/breakpoint.c
+++ ./gdb/breakpoint.c
@@ -7267,7 +7267,8 @@
     /* We compare bp_location.length in order to cover ranged breakpoints.  */
     return (breakpoint_address_match (loc1->pspace->aspace, loc1->address,
 				     loc2->pspace->aspace, loc2->address)
-	    && loc1->length == loc2->length);
+	    && loc1->length == loc2->length
+	    && loc1->thread == loc2->thread);
 }
 
 static void
@@ -7354,6 +7355,10 @@
   loc->cond_bytecode = NULL;
   loc->shlib_disabled = 0;
   loc->enabled = 1;
+  loc->thread = owner->thread;
+  loc->target_info.thread = owner->thread;
+  loc->overlay_target_info.thread = owner->thread;
+  loc->thread = owner->thread;
 
   switch (owner->type)
     {
@@ -8984,6 +8989,9 @@
   copy->loc->line_number = orig->loc->line_number;
   copy->loc->symtab = orig->loc->symtab;
   copy->loc->enabled = loc_enabled;
+  copy->loc->thread = orig->loc->thread;
+  copy->loc->target_info.thread = orig->loc->thread;
+  copy->loc->overlay_target_info.thread = orig->loc->thread;
   copy->frame_id = orig->frame_id;
   copy->thread = orig->thread;
   copy->pspace = orig->pspace;
@@ -9302,6 +9310,9 @@
 	{
 	  init_raw_breakpoint (b, gdbarch, sal, type, ops);
 	  b->thread = thread;
+	  b->loc->thread = thread;
+	  b->loc->target_info.thread = thread;
+	  b->loc->overlay_target_info.thread = thread;
 	  b->task = task;
 
 	  b->cond_string = cond_string;
@@ -9655,6 +9666,10 @@
   *task = 0;
   *rest = NULL;
 
+  /* default to current thread on non-stop targets */
+  if (target_is_non_stop_p ())
+    *thread = inferior_thread ()->global_num;
+
   while (tok && *tok)
     {
       const char *end_tok;
@@ -9946,6 +9961,9 @@
 	    }
 	  b->cond_string = cond_string;
 	  b->thread = thread;
+	  b->loc->thread = thread;
+	  b->loc->target_info.thread = thread;
+	  b->loc->overlay_target_info.thread = thread;
 	}
 
       /* Create a private copy of any extra string.  */
--- ../orig/gdb/breakpoint.h
+++ ./gdb/breakpoint.h
@@ -279,6 +279,9 @@
   /* Flag that is true if the breakpoint should be left in place even
      when GDB is not connected.  */
   int persist;
+
+  /* Thread identifier for which this breakpoint should be activated */
+  int thread;
 };
 
 /* GDB maintains two types of information about each breakpoint (or
@@ -399,7 +402,8 @@
   char duplicate;
 
   /* If we someday support real thread-specific breakpoints, then
-     the breakpoint location will need a thread identifier.  */
+     the breakpoint location will need a thread identifier. */
+  int thread;
 
   /* Data for specific breakpoint types.  These could be a union, but
      simplicity is more important than memory usage for breakpoints.  */
--- ../orig/gdb/remote.c
+++ ./gdb/remote.c
@@ -9300,7 +9300,12 @@
       addr = (ULONGEST) remote_address_masked (addr);
       p += hexnumstr (p, addr);
       xsnprintf (p, endbuf - p, ",%d", bpsize);
-
+      p += strlen(p);
+      if (bp_tgt->thread >= 0)
+        {
+	  *(p++) = ',';
+	  write_ptid (p, endbuf, global_thread_id_to_ptid (bp_tgt->thread));
+        }
       if (remote_supports_cond_breakpoints (ops))
 	remote_add_target_side_condition (gdbarch, bp_tgt, p, endbuf);
 
@@ -9358,6 +9363,12 @@
       addr = (ULONGEST) remote_address_masked (bp_tgt->placed_address);
       p += hexnumstr (p, addr);
       xsnprintf (p, endbuf - p, ",%d", bp_tgt->placed_size);
+      p += strlen(p);
+      if (bp_tgt->thread >= 0)
+        {
+	  *(p++) = ',';
+	  write_ptid (p, endbuf, global_thread_id_to_ptid (bp_tgt->thread));
+        }
 
       putpkt (rs->buf);
       getpkt (&rs->buf, &rs->buf_size, 0);
@@ -9619,6 +9630,12 @@
   addr = remote_address_masked (addr);
   p += hexnumstr (p, (ULONGEST) addr);
   xsnprintf (p, endbuf - p, ",%x", bpsize);
+  p += strlen(p);
+  if (bp_tgt->thread >= 0)
+    {
+      *(p++) = ',';
+      write_ptid (p, endbuf, global_thread_id_to_ptid (bp_tgt->thread));
+    }
 
   if (remote_supports_cond_breakpoints (self))
     remote_add_target_side_condition (gdbarch, bp_tgt, p, endbuf);
@@ -9675,6 +9692,12 @@
   addr = remote_address_masked (bp_tgt->placed_address);
   p += hexnumstr (p, (ULONGEST) addr);
   xsnprintf (p, endbuf  - p, ",%x", bp_tgt->placed_size);
+  p += strlen(p);
+  if (bp_tgt->thread >= 0)
+    {
+      *(p++) = ',';
+      write_ptid (p, endbuf, global_thread_id_to_ptid (bp_tgt->thread));
+    }
 
   putpkt (rs->buf);
   getpkt (&rs->buf, &rs->buf_size, 0);
smime.p7s (application/pkcs7-signature, 4.2 KB) - not displayed
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.