* 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:
parent
ce0451adac
commit
98deb0daae
@ -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
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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.
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user