PR gdb/8704
authorDaniel Jacobowitz <drow@false.org>
Wed, 25 Nov 2009 20:43:29 +0000 (20:43 +0000)
committerDaniel Jacobowitz <drow@false.org>
Wed, 25 Nov 2009 20:43:29 +0000 (20:43 +0000)
* breakpoint.c (find_condition_and_thread): Correct task error message.
* c-exp.y (yylex): Stop before "thread N", "task N", or abbreviations
of those.

doc/
* gdb.texinfo (Thread-Specific Breakpoints): Thread specifiers
are allowed after the breakpoint condition.

testsuite/
* gdb.base/condbreak.exp: Test combinations of "break *EXP",
"if", and "thread".  Correct matching in the previous test.

gdb/ChangeLog
gdb/breakpoint.c
gdb/c-exp.y
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/condbreak.exp

index e69bac2..cf5c907 100644 (file)
@@ -1,3 +1,11 @@
+2009-11-24  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       PR gdb/8704
+
+       * breakpoint.c (find_condition_and_thread): Correct task error message.
+       * c-exp.y (yylex): Stop before "thread N", "task N", or abbreviations
+       of those.
+
 2009-11-24  Joel Brobecker  <brobecker@adacore.com>
 
        * acinclude.m4: Include ../config/zlib.m4.
index 8a6813c..4340c5d 100644 (file)
@@ -6636,7 +6636,7 @@ find_condition_and_thread (char *tok, CORE_ADDR pc,
          if (tok == tmptok)
            error (_("Junk after task keyword."));
          if (!valid_task_id (*task))
-           error (_("Unknown task %d\n"), *task);
+           error (_("Unknown task %d."), *task);
        }
       else
        error (_("Junk at end of arguments."));
index 8ee323e..d657c92 100644 (file)
@@ -2250,6 +2250,24 @@ yylex (void)
       return 0;
     }
 
+  /* For the same reason (breakpoint conditions), "thread N"
+     terminates the expression.  "thread" could be an identifier, but
+     an identifier is never followed by a number without intervening
+     punctuation.  "task" is similar.  Handle abbreviations of these,
+     similarly to breakpoint.c:find_condition_and_thread.  */
+  if (namelen >= 1
+      && (strncmp (tokstart, "thread", namelen) == 0
+         || strncmp (tokstart, "task", namelen) == 0)
+      && (tokstart[namelen] == ' ' || tokstart[namelen] == '\t')
+      && ! scanning_macro_expansion ())
+    {
+      char *p = tokstart + namelen + 1;
+      while (*p == ' ' || *p == '\t')
+       p++;
+      if (*p >= '0' && *p <= '9')
+       return 0;
+    }
+
   lexptr += namelen;
 
   tryname:
index 8571bc9..7c15124 100644 (file)
@@ -1,3 +1,10 @@
+2009-11-24  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       PR gdb/8704
+
+       * gdb.texinfo (Thread-Specific Breakpoints): Thread specifiers
+       are allowed after the breakpoint condition.
+
 2009-11-23  Tom Tromey  <tromey@redhat.com>
 
        PR python/10782:
index c1ccfc7..74cbedf 100644 (file)
@@ -5214,8 +5214,8 @@ breakpoint, the breakpoint applies to @emph{all} threads of your
 program.
 
 You can use the @code{thread} qualifier on conditional breakpoints as
-well; in this case, place @samp{thread @var{threadno}} before the
-breakpoint condition, like this:
+well; in this case, place @samp{thread @var{threadno}} before or
+after the breakpoint condition, like this:
 
 @smallexample
 (@value{GDBP}) break frik.c:13 thread 28 if bartab > lim
index 021466f..fddb912 100644 (file)
@@ -1,3 +1,10 @@
+2009-11-24  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       PR gdb/8704
+
+       * gdb.base/condbreak.exp: Test combinations of "break *EXP",
+       "if", and "thread".  Correct matching in the previous test.
+
 2009-11-25  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * gdb.cp/extern-c.cc, gdb.cp/extern-c.exp: New test.
index 2fdeb69..8a9dfbc 100644 (file)
@@ -207,10 +207,10 @@ gdb_expect {
 setup_xfail hppa2.0w-*-* 11512CLLbs
 send_gdb "continue\n"
 gdb_expect {
-    -re "Continuing\\..*Breakpoint \[0-9\]+, marker2 \\(a=43\\) at .*$srcfile1:($bp_location8|$bp_location9).*($bp_location8|$bp_location9)\[\t \]+.*" {
+    -re "Continuing\\..*Breakpoint \[0-9\]+, marker2 \\(a=43\\) at .*$srcfile1:($bp_location8|$bp_location9).*($bp_location8|$bp_location9)\[\t \]+.*$gdb_prompt $" {
        pass "run until breakpoint at marker2"
     }
-    -re "Continuing\\..*Breakpoint \[0-9\]+, $hex in marker2 \\(a=43\\) at .*$srcfile1:($bp_location8|$bp_location9).*($bp_location8|$bp_location9)\[\t \]+.*" {
+    -re "Continuing\\..*Breakpoint \[0-9\]+, $hex in marker2 \\(a=43\\) at .*$srcfile1:($bp_location8|$bp_location9).*($bp_location8|$bp_location9)\[\t \]+.*$gdb_prompt $" {
        xfail "run until breakpoint at marker2"
     }
     -re "$gdb_prompt $" {
@@ -220,3 +220,30 @@ gdb_expect {
        fail "(timeout) run until breakpoint at marker2"
     }
 }
+
+# Test combinations of conditional and thread-specific breakpoints.
+gdb_test "break main if (1==1) thread 999" \
+    "Unknown thread 999\\."
+gdb_test "break main thread 999 if (1==1)" \
+    "Unknown thread 999\\."
+
+# Verify that both if and thread can be distinguished from a breakpoint
+# address expression.
+gdb_test "break *main if (1==1) thread 999" \
+    "Unknown thread 999\\."
+gdb_test "break *main thread 999 if (1==1)" \
+    "Unknown thread 999\\."
+
+# Similarly for task.
+gdb_test "break *main if (1==1) task 999" \
+    "Unknown task 999\\."
+gdb_test "break *main task 999 if (1==1)" \
+    "Unknown task 999\\."
+
+# GDB accepts abbreviations for "thread" and "task".
+gdb_test "break *main if (1==1) t 999" \
+    "Unknown thread 999\\."
+gdb_test "break *main if (1==1) th 999" \
+    "Unknown thread 999\\."
+gdb_test "break *main if (1==1) ta 999" \
+    "Unknown task 999\\."