* breakpoint.c (break_command_1): Return void.

(break_command_really): Return void.  Rethrow
        exceptions instead of returning.
        (gdb_breakpoint): Remove the error_message parameter.
        Return void.  Rename to set_breakpoint.
        * gdb.h (gdb_breakpoint): Rename and move to...
	* breakpoint.h (set_breakpoint): ...here.
        * mi/mi-cmb-break.c (mi_cmd_break_insert): Restore
        event hooks even if exception is thrown.  Adjust to
        gdb_breakpoint interface changes.
This commit is contained in:
Vladimir Prus 2008-02-01 16:24:47 +00:00
parent ce0451adac
commit 98deb0daae
8 changed files with 97 additions and 64 deletions

View File

@ -1,3 +1,17 @@
2008-02-01 Vladimir Prus <vladimir@codesourcery.com>
* breakpoint.c (break_command_1): Return void.
(break_command_really): Return void. Rethrow
exceptions instead of returning.
(gdb_breakpoint): Remove the error_message parameter.
Return void. Rename to set_breakpoint.
* gdb.h (gdb_breakpoint): Rename and move to...
* breakpoint.h (set_breakpoint): ...here.
* mi/mi-cmb-break.c (mi_cmd_break_insert): Restore
event hooks even if exception is thrown. Adjust to
gdb_breakpoint interface changes.
2008-02-01 Thiago Jung Bauermann <bauerman@br.ibm.com> 2008-02-01 Thiago Jung Bauermann <bauerman@br.ibm.com>
* ppc-sysv-tdep.c (ppc64_sysv_abi_push_dummy_call): Write 32-bit * ppc-sysv-tdep.c (ppc64_sysv_abi_push_dummy_call): Write 32-bit

View File

@ -90,7 +90,7 @@ static void watch_command (char *, int);
static int can_use_hardware_watchpoint (struct value *); static int can_use_hardware_watchpoint (struct value *);
static int break_command_1 (char *, int, int); static void break_command_1 (char *, int, int);
static void mention (struct breakpoint *); static void mention (struct breakpoint *);
@ -5285,7 +5285,7 @@ find_condition_and_thread (char *tok, CORE_ADDR pc,
and thread specified by the COND_STRING and THREAD and thread specified by the COND_STRING and THREAD
parameters. */ parameters. */
static int static void
break_command_really (char *arg, char *cond_string, int thread, break_command_really (char *arg, char *cond_string, int thread,
int parse_condition_and_thread, int parse_condition_and_thread,
int tempflag, int hardwareflag, int tempflag, int hardwareflag,
@ -5323,8 +5323,7 @@ break_command_really (char *arg, char *cond_string, int thread,
switch (e.reason) switch (e.reason)
{ {
case RETURN_QUIT: case RETURN_QUIT:
exception_print (gdb_stderr, e); throw_exception (e);
return e.reason;
case RETURN_ERROR: case RETURN_ERROR:
switch (e.error) switch (e.error)
{ {
@ -5342,7 +5341,7 @@ break_command_really (char *arg, char *cond_string, int thread,
selects no, then simply return the error code. */ selects no, then simply return the error code. */
if (pending_break_support == AUTO_BOOLEAN_AUTO && if (pending_break_support == AUTO_BOOLEAN_AUTO &&
!nquery ("Make breakpoint pending on future shared library load? ")) !nquery ("Make breakpoint pending on future shared library load? "))
return e.reason; return;
/* At this point, either the user was queried about setting /* At this point, either the user was queried about setting
a pending breakpoint and selected yes, or pending a pending breakpoint and selected yes, or pending
@ -5356,12 +5355,11 @@ break_command_really (char *arg, char *cond_string, int thread,
pending = 1; pending = 1;
break; break;
default: default:
exception_print (gdb_stderr, e); throw_exception (e);
return e.reason;
} }
default: default:
if (!sals.nelts) if (!sals.nelts)
return GDB_RC_FAIL; return;
} }
/* Create a chain of things that always need to be cleaned up. */ /* Create a chain of things that always need to be cleaned up. */
@ -5457,8 +5455,6 @@ break_command_really (char *arg, char *cond_string, int thread,
discard_cleanups (breakpoint_chain); discard_cleanups (breakpoint_chain);
/* But cleanup everything else. */ /* But cleanup everything else. */
do_cleanups (old_chain); do_cleanups (old_chain);
return GDB_RC_OK;
} }
/* Set a breakpoint. /* Set a breakpoint.
@ -5468,34 +5464,33 @@ break_command_really (char *arg, char *cond_string, int thread,
and if breakpoint is temporary, using BP_HARDWARE_FLAG and if breakpoint is temporary, using BP_HARDWARE_FLAG
and BP_TEMPFLAG. */ and BP_TEMPFLAG. */
static int static void
break_command_1 (char *arg, int flag, int from_tty) break_command_1 (char *arg, int flag, int from_tty)
{ {
int hardwareflag = flag & BP_HARDWAREFLAG; int hardwareflag = flag & BP_HARDWAREFLAG;
int tempflag = flag & BP_TEMPFLAG; int tempflag = flag & BP_TEMPFLAG;
return break_command_really (arg, break_command_really (arg,
NULL, 0, 1 /* parse arg */, NULL, 0, 1 /* parse arg */,
tempflag, hardwareflag, tempflag, hardwareflag,
0 /* Ignore count */, 0 /* Ignore count */,
pending_break_support, from_tty); pending_break_support, from_tty);
} }
enum gdb_rc void
gdb_breakpoint (char *address, char *condition, set_breakpoint (char *address, char *condition,
int hardwareflag, int tempflag, int hardwareflag, int tempflag,
int thread, int ignore_count, int thread, int ignore_count,
int pending, int pending)
char **error_message)
{ {
return break_command_really (address, condition, thread, break_command_really (address, condition, thread,
0 /* condition and thread are valid. */, 0 /* condition and thread are valid. */,
tempflag, hardwareflag, tempflag, hardwareflag,
ignore_count, ignore_count,
pending pending
? AUTO_BOOLEAN_TRUE : AUTO_BOOLEAN_FALSE, ? AUTO_BOOLEAN_TRUE : AUTO_BOOLEAN_FALSE,
0); 0);
} }

View File

@ -710,6 +710,11 @@ extern void awatch_command_wrapper (char *, int);
extern void rwatch_command_wrapper (char *, int); extern void rwatch_command_wrapper (char *, int);
extern void tbreak_command (char *, int); extern void tbreak_command (char *, int);
extern void set_breakpoint (char *address, char *condition,
int hardwareflag, int tempflag,
int thread, int ignore_count,
int pending);
extern void insert_breakpoints (void); extern void insert_breakpoints (void);
extern int remove_breakpoints (void); extern int remove_breakpoints (void);

View File

@ -47,13 +47,6 @@ enum gdb_rc {
enum gdb_rc gdb_breakpoint_query (struct ui_out *uiout, int bnum, enum gdb_rc gdb_breakpoint_query (struct ui_out *uiout, int bnum,
char **error_message); char **error_message);
/* Create a breakpoint at ADDRESS (a GDB source and line). */
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. */ /* Switch thread and print notification. */
enum gdb_rc gdb_thread_select (struct ui_out *uiout, char *tidstr, enum gdb_rc gdb_thread_select (struct ui_out *uiout, char *tidstr,
char **error_message); char **error_message);

View File

@ -26,6 +26,7 @@
#include "mi-getopt.h" #include "mi-getopt.h"
#include "gdb-events.h" #include "gdb-events.h"
#include "gdb.h" #include "gdb.h"
#include "exceptions.h"
enum enum
{ {
@ -69,7 +70,7 @@ mi_cmd_break_insert (char *command, char **argv, int argc)
int ignore_count = 0; int ignore_count = 0;
char *condition = NULL; char *condition = NULL;
int pending = 0; int pending = 0;
enum gdb_rc rc; struct gdb_exception e;
struct gdb_events *old_hooks; struct gdb_events *old_hooks;
enum opt enum opt
{ {
@ -132,41 +133,42 @@ mi_cmd_break_insert (char *command, char **argv, int argc)
/* Now we have what we need, let's insert the breakpoint! */ /* Now we have what we need, let's insert the breakpoint! */
old_hooks = deprecated_set_gdb_event_hooks (&breakpoint_hooks); old_hooks = deprecated_set_gdb_event_hooks (&breakpoint_hooks);
switch (type) /* Make sure we restore hooks even if exception is thrown. */
TRY_CATCH (e, RETURN_MASK_ALL)
{ {
case REG_BP: switch (type)
rc = gdb_breakpoint (address, condition, {
0 /*hardwareflag */ , temp_p, case REG_BP:
thread, ignore_count, set_breakpoint (address, condition,
pending, 0 /*hardwareflag */ , temp_p,
&mi_error_message); thread, ignore_count,
break; pending);
case HW_BP: break;
rc = gdb_breakpoint (address, condition, case HW_BP:
1 /*hardwareflag */ , temp_p, set_breakpoint (address, condition,
thread, ignore_count, 1 /*hardwareflag */ , temp_p,
pending, thread, ignore_count,
&mi_error_message); pending);
break; break;
#if 0 #if 0
case REGEXP_BP: case REGEXP_BP:
if (temp_p) if (temp_p)
error (_("mi_cmd_break_insert: Unsupported tempoary regexp breakpoint")); error (_("mi_cmd_break_insert: Unsupported tempoary regexp breakpoint"));
else else
rbreak_command_wrapper (address, FROM_TTY); rbreak_command_wrapper (address, FROM_TTY);
return MI_CMD_DONE; return MI_CMD_DONE;
break; break;
#endif #endif
default: default:
internal_error (__FILE__, __LINE__, internal_error (__FILE__, __LINE__,
_("mi_cmd_break_insert: Bad switch.")); _("mi_cmd_break_insert: Bad switch."));
}
} }
deprecated_set_gdb_event_hooks (old_hooks); deprecated_set_gdb_event_hooks (old_hooks);
if (e.reason < 0)
throw_exception (e);
if (rc == GDB_RC_FAIL) return MI_CMD_DONE;
return MI_CMD_ERROR;
else
return MI_CMD_DONE;
} }
enum wp_type enum wp_type

View File

@ -1,3 +1,10 @@
2008-02-01 Vladimir Prus <vladimir@codesourcery.com>
* gdb.mi/basic.c (return_1): New function.
* gdb.mi/mi-break.exp: Make sure that failed -break-insert
don't cause future evaluations of function to report
creation of internal breakpoints.
2008-02-01 Vladimir Prus <vladimir@codesourcery.com> 2008-02-01 Vladimir Prus <vladimir@codesourcery.com>
* gdb.mi/mi-break.exp (test_error): New. * gdb.mi/mi-break.exp (test_error): New.

View File

@ -51,6 +51,11 @@ void callme (int i)
printf ("callme\n"); printf ("callme\n");
} }
int return_1 ()
{
return 1;
}
main () main ()
{ {
callee1 (2, "A string argument.", 3.5); callee1 (2, "A string argument.", 3.5);

View File

@ -181,6 +181,18 @@ proc test_error {} {
mi_gdb_test "-break-insert function_that_does_not_exist" \ mi_gdb_test "-break-insert function_that_does_not_exist" \
".*\\^error,msg=\"Function \\\\\"function_that_does_not_exist\\\\\" not defined.\"" \ ".*\\^error,msg=\"Function \\\\\"function_that_does_not_exist\\\\\" not defined.\"" \
"breakpoint at nonexistent function" "breakpoint at nonexistent function"
# We used to have a bug whereby -break-insert that failed would not
# clear some event hooks. As result, whenever we evaluate expression
# containing function call, the internal breakpoint created to handle
# function call would be reported, messing up MI output.
mi_gdb_test "-var-create V * return_1()" \
"\\^done,name=\"V\",numchild=\"0\",value=\"1\",type=\"int\"" \
"create varobj for function call"
mi_gdb_test "-var-update *" \
"\\^done,changelist=\\\[\\\]" \
"update varobj for function call"
} }
test_tbreak_creation_and_listing test_tbreak_creation_and_listing