From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30219 invoked by alias); 8 Nov 2007 11:12:30 -0000 Received: (qmail 30208 invoked by uid 22791); 8 Nov 2007 11:12:29 -0000 X-Spam-Check-By: sourceware.org Received: from zigzag.lvk.cs.msu.su (HELO zigzag.lvk.cs.msu.su) (158.250.17.23) by sourceware.org (qpsmtpd/0.31) with ESMTP; Thu, 08 Nov 2007 11:12:26 +0000 Received: from Debian-exim by zigzag.lvk.cs.msu.su with spam-scanned (Exim 4.50) id 1Iq5J1-00030o-W9 for gdb-patches@sources.redhat.com; Thu, 08 Nov 2007 14:12:22 +0300 Received: from localhost ([127.0.0.1] helo=ip6-localhost) by zigzag.lvk.cs.msu.su with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA:32) (Exim 4.50) id 1Iq5J1-00030k-IB for gdb-patches@sources.redhat.com; Thu, 08 Nov 2007 14:12:15 +0300 From: Vladimir Prus To: gdb-patches@sources.redhat.com Subject: Pending breakpoints in MI Date: Thu, 08 Nov 2007 11:12:00 -0000 User-Agent: KMail/1.9.6 MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_O8uMH3BfBpfEMkA" Message-Id: <200711081412.14452.ghost@cs.msu.su> Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2007-11/txt/msg00162.txt.bz2 --Boundary-00=_O8uMH3BfBpfEMkA Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 492 At the moment, it's not possible to set pending breakpoint via MI. This patch fixed it. Now if one does -break-insert -f symbol_in_shared_lib GDB will create a pending breakpoint if symbol_in_shared_lib is not yet seen. The -f stands for "future". We can't use -p since that grabbed by thread option (which cannot be -t since that's grabbed by temporary option). Apple branch uses -f as well, as we might as well be compatible (even if the code is completely different). OK? - Volodya --Boundary-00=_O8uMH3BfBpfEMkA Content-Type: text/x-diff; charset="utf-8"; name="pending_mi_3_breakpoints.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="pending_mi_3_breakpoints.diff" Content-length: 7980 --- gdb/breakpoint.c (/patches/pending_mi_2_code_duplication) (revision 45) +++ gdb/breakpoint.c (/patches/pending_mi_3_breakpoints) (revision 45) @@ -5648,12 +5648,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); } --- gdb/gdb.h (/patches/pending_mi_2_code_duplication) (revision 45) +++ gdb/gdb.h (/patches/pending_mi_3_breakpoints) (revision 45) @@ -51,6 +51,7 @@ enum gdb_rc gdb_breakpoint_query (struct 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. */ --- gdb/testsuite/gdb.mi/mi-pending.exp (/patches/pending_mi_2_code_duplication) (revision 45) +++ gdb/testsuite/gdb.mi/mi-pending.exp (/patches/pending_mi_3_breakpoints) (revision 45) @@ -0,0 +1,75 @@ +# Copyright 2003, 2004, 2005, 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 --- gdb/testsuite/gdb.mi/mi-pending.c (/patches/pending_mi_2_code_duplication) (revision 45) +++ gdb/testsuite/gdb.mi/mi-pending.c (/patches/pending_mi_3_breakpoints) (revision 45) @@ -0,0 +1,34 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2004, 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; +} --- gdb/testsuite/gdb.mi/mi-pendshr.c (/patches/pending_mi_2_code_duplication) (revision 45) +++ gdb/testsuite/gdb.mi/mi-pendshr.c (/patches/pending_mi_3_breakpoints) (revision 45) @@ -0,0 +1,32 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2004, 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); +} --- gdb/mi/mi-cmd-break.c (/patches/pending_mi_2_code_duplication) (revision 45) +++ gdb/mi/mi-cmd-break.c (/patches/pending_mi_3_breakpoints) (revision 45) @@ -63,7 +63,10 @@ enum bp_type breakpoint. -break-insert -t -h --> insert a temporary hw bp. -break-insert -r --> insert a bp at functions matching - */ + + + The -f flag makes GDB create a pending breakpoint if no + locations for breakpoint are found now. */ enum mi_cmd_result mi_cmd_break_insert (char *command, char **argv, int argc) @@ -74,12 +77,13 @@ mi_cmd_break_insert (char *command, char 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 +92,7 @@ mi_cmd_break_insert (char *command, char {"c", CONDITION_OPT, 1}, {"i", IGNORE_COUNT_OPT, 1}, {"p", THREAD_OPT, 1}, + {"f", PENDING_OPT, 0}, { 0, 0, 0 } }; @@ -122,6 +127,9 @@ mi_cmd_break_insert (char *command, char case THREAD_OPT: thread = atol (optarg); break; + case PENDING_OPT: + pending = 1; + break; } } @@ -139,12 +147,14 @@ mi_cmd_break_insert (char *command, char 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 --Boundary-00=_O8uMH3BfBpfEMkA--