From afe8ab2206b453d775fe82aec2d3073181251a3e Mon Sep 17 00:00:00 2001 From: Vladimir Prus Date: Fri, 14 Dec 2007 18:15:47 +0000 Subject: [PATCH] Add support for pending breakpoints in MI. * gdb.h (gdb_breakpoint): Add parameter pending. * breakpoint.c (gdb_breakpoint): Add parameter pending. * mi/mi-cmd-break.c (mi_break_insert): Change comment to refer to manual. Add support for the -f flag, for pending breakpoint. --- gdb/ChangeLog | 9 ++++ gdb/breakpoint.c | 4 +- gdb/doc/ChangeLog | 6 +++ gdb/doc/gdb.texinfo | 16 +++--- gdb/gdb.h | 1 + gdb/mi/mi-cmd-break.c | 19 ++++---- gdb/testsuite/ChangeLog | 6 +++ gdb/testsuite/gdb.mi/mi-pending.c | 34 +++++++++++++ gdb/testsuite/gdb.mi/mi-pending.exp | 75 +++++++++++++++++++++++++++++ gdb/testsuite/gdb.mi/mi-pendshr.c | 32 ++++++++++++ 10 files changed, 185 insertions(+), 17 deletions(-) create mode 100644 gdb/testsuite/gdb.mi/mi-pending.c create mode 100644 gdb/testsuite/gdb.mi/mi-pending.exp create mode 100644 gdb/testsuite/gdb.mi/mi-pendshr.c diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b6ec8e1ad5..63ffe1cf5f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2007-12-14 Vladimir Prus + + Add support for pending breakpoints in MI. + * gdb.h (gdb_breakpoint): Add parameter pending. + * breakpoint.c (gdb_breakpoint): Add parameter pending. + * mi/mi-cmd-break.c (mi_break_insert): Change + comment to refer to manual. Add support for + the -f flag, for pending breakpoint. + 2007-12-14 Vladimir Prus * breakpoint.c (break_command_really): New, copied diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 0fd7e990f8..c28784e398 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -5451,12 +5451,14 @@ enum gdb_rc gdb_breakpoint (char *address, char *condition, int hardwareflag, int tempflag, int thread, int ignore_count, + int pending, char **error_message) { return break_command_really (address, condition, thread, 0 /* condition and thread are valid. */, tempflag, hardwareflag, - AUTO_BOOLEAN_FALSE /* no pending. */, + pending + ? AUTO_BOOLEAN_TRUE : AUTO_BOOLEAN_FALSE, 0); } diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 181146ec8f..01527fa062 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,9 @@ +2007-12-14 Vladimir Prus + + * gdb.texinfo (GDB/MI Breakpoint Commands): Document + the -f option for -break-insert, remove -r option, + and clarify specification of location. + 2007-11-30 Daniel Jacobowitz * gdb.texinfo (Debugging Programs with Multiple Processes): Correct diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 35cc0573c8..8b73e08d00 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -18163,13 +18163,13 @@ N.A. @subsubheading Synopsis @smallexample - -break-insert [ -t ] [ -h ] [ -r ] + -break-insert [ -t ] [ -h ] [ -f ] [ -c @var{condition} ] [ -i @var{ignore-count} ] - [ -p @var{thread} ] [ @var{line} | @var{addr} ] + [ -p @var{thread} ] [ @var{location} ] @end smallexample @noindent -If specified, @var{line}, can be one of: +If specified, @var{location}, can be one of: @itemize @bullet @item function @@ -18192,10 +18192,12 @@ Insert a hardware breakpoint. Make the breakpoint conditional on @var{condition}. @item -i @var{ignore-count} Initialize the @var{ignore-count}. -@item -r -Insert a regular breakpoint in all the functions whose names match the -given regular expression. Other flags are not applicable to regular -expressions. +@item -f +If @var{location} cannot be parsed (for example if it +refers to unknown files or functions), create a pending +breakpoint. Without this flag, @value{GDBN} will report +an error, and won't create a breakpoint, if @var{location} +cannot be parsed. @end table @subsubheading Result diff --git a/gdb/gdb.h b/gdb/gdb.h index 3ec7e0ee73..581aaefd6e 100644 --- a/gdb/gdb.h +++ b/gdb/gdb.h @@ -51,6 +51,7 @@ enum gdb_rc gdb_breakpoint_query (struct ui_out *uiout, int bnum, enum gdb_rc gdb_breakpoint (char *address, char *condition, int hardwareflag, int tempflag, int thread, int ignore_count, + int pending, char **error_message); /* Switch thread and print notification. */ diff --git a/gdb/mi/mi-cmd-break.c b/gdb/mi/mi-cmd-break.c index 228f08c5b6..ebdb730204 100644 --- a/gdb/mi/mi-cmd-break.c +++ b/gdb/mi/mi-cmd-break.c @@ -56,14 +56,8 @@ enum bp_type REGEXP_BP }; -/* Insert a breakpoint. The type of breakpoint is specified by the - first argument: -break-insert --> insert a regular - breakpoint. -break-insert -t --> insert a temporary - breakpoint. -break-insert -h --> insert an hardware - breakpoint. -break-insert -t -h --> insert a temporary - hw bp. - -break-insert -r --> insert a bp at functions matching - */ +/* Implements the -break-insert command. + See the MI manual for the list of possible options. */ enum mi_cmd_result mi_cmd_break_insert (char *command, char **argv, int argc) @@ -74,12 +68,13 @@ mi_cmd_break_insert (char *command, char **argv, int argc) int thread = -1; int ignore_count = 0; char *condition = NULL; + int pending = 0; enum gdb_rc rc; struct gdb_events *old_hooks; enum opt { HARDWARE_OPT, TEMP_OPT /*, REGEXP_OPT */ , CONDITION_OPT, - IGNORE_COUNT_OPT, THREAD_OPT + IGNORE_COUNT_OPT, THREAD_OPT, PENDING_OPT }; static struct mi_opt opts[] = { @@ -88,6 +83,7 @@ mi_cmd_break_insert (char *command, char **argv, int argc) {"c", CONDITION_OPT, 1}, {"i", IGNORE_COUNT_OPT, 1}, {"p", THREAD_OPT, 1}, + {"f", PENDING_OPT, 0}, { 0, 0, 0 } }; @@ -122,6 +118,9 @@ mi_cmd_break_insert (char *command, char **argv, int argc) case THREAD_OPT: thread = atol (optarg); break; + case PENDING_OPT: + pending = 1; + break; } } @@ -139,12 +138,14 @@ mi_cmd_break_insert (char *command, char **argv, int argc) rc = gdb_breakpoint (address, condition, 0 /*hardwareflag */ , temp_p, thread, ignore_count, + pending, &mi_error_message); break; case HW_BP: rc = gdb_breakpoint (address, condition, 1 /*hardwareflag */ , temp_p, thread, ignore_count, + pending, &mi_error_message); break; #if 0 diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 5a7047a309..41f52abd43 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2007-12-14 Vladimir Prus + + * gdb.mi/mi-pending.exp: New. + * gdb.mi/mi-pending.c: New. + * gdb.mi/mi-pendshr.c: New. + 2007-12-06 Jim Blandy * gdb.base/default.exp: Update expected output for 'info catch'. diff --git a/gdb/testsuite/gdb.mi/mi-pending.c b/gdb/testsuite/gdb.mi/mi-pending.c new file mode 100644 index 0000000000..c325093689 --- /dev/null +++ b/gdb/testsuite/gdb.mi/mi-pending.c @@ -0,0 +1,34 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2007 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Please email any bugs, comments, and/or additions to this file to: + bug-gdb@prep.ai.mit.edu */ + +#include + +int k = 0; + +extern void pendfunc (int x); + +int main() +{ + pendfunc (3); /* break main here */ + pendfunc (4); + k = 1; + pendfunc (3); + return 0; +} diff --git a/gdb/testsuite/gdb.mi/mi-pending.exp b/gdb/testsuite/gdb.mi/mi-pending.exp new file mode 100644 index 0000000000..34bb2a70e3 --- /dev/null +++ b/gdb/testsuite/gdb.mi/mi-pending.exp @@ -0,0 +1,75 @@ +# Copyright 2007 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +load_lib mi-support.exp +set MIFLAGS "-i=mi" + +if $tracelevel then { + strace $tracelevel +} + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +if {[skip_shlib_tests]} { + return 0 +} + +set testfile "mi-pending" +set libfile "mi-pendshr" +set srcfile $testfile.c +set libsrc $srcdir/$subdir/$libfile.c +set binfile $objdir/$subdir/$testfile +set lib_sl $objdir/$subdir/$libfile.sl + +set lib_opts debug +set exec_opts [list debug shlib=$lib_sl] + +if [get_compiler_info ${binfile}] { + return -1 +} + +if { [gdb_compile_shlib $libsrc $lib_sl $lib_opts] != "" + || [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != ""} { + untested "Could not compile either $libsrc or $srcdir/$subdir/$srcfile." + return -1 +} + +# Start with a fresh gdb. + +gdb_exit +mi_gdb_start +mi_gdb_reinitialize_dir $srcdir/$subdir +mi_gdb_load ${binfile} +gdb_load_shlibs $lib_sl + +if [target_info exists gdb_stub] { + gdb_step_for_stub; +} + +# Set pending breakpoint via MI +mi_gdb_test "-break-insert -f pendfunc1" \ + ".*\\^done,bkpt=\{number=\"1\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\\(p\\)\",addr=\"\",pending=\"pendfunc1\",times=\"0\"\}"\ + "MI pending breakpoint on pendfunc1" + +mi_run_cmd + +# Make sure we hit breakpoint. +mi_gdb_test "" \ + ".*\\*stopped,reason=\"breakpoint-hit\",bkptno=\"1\".*func=\"pendfunc1\".*" \ + "Run till MI pending breakpoint on pendfunc1" \ No newline at end of file diff --git a/gdb/testsuite/gdb.mi/mi-pendshr.c b/gdb/testsuite/gdb.mi/mi-pendshr.c new file mode 100644 index 0000000000..8353d4c096 --- /dev/null +++ b/gdb/testsuite/gdb.mi/mi-pendshr.c @@ -0,0 +1,32 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2007 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Please email any bugs, comments, and/or additions to this file to: + bug-gdb@prep.ai.mit.edu */ + +#include + +void pendfunc1 (int x) +{ + int y = x + 4; + printf ("in pendfunc1, x is %d\n", x); +} + +void pendfunc (int x) +{ + pendfunc1 (x); +}