/* Everything about breakpoints, for GDB.
- Copyright 1986, 87, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 1999
+ Copyright 1986, 87, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 1999, 2000
Free Software Foundation, Inc.
This file is part of GDB.
#include "annotate.h"
#include "symfile.h"
#include "objfiles.h"
+#include "linespec.h"
+#ifdef UI_OUT
+#include "ui-out.h"
+#endif
#include "gdb-events.h"
static void until_break_command_continuation (struct continuation_arg *arg);
-static void
-catch_command_1 PARAMS ((char *, int, int));
+static void catch_command_1 (char *, int, int);
-static void
-enable_delete_command PARAMS ((char *, int));
+static void enable_delete_command (char *, int);
-static void
-enable_delete_breakpoint PARAMS ((struct breakpoint *));
+static void enable_delete_breakpoint (struct breakpoint *);
-static void
-enable_once_command PARAMS ((char *, int));
+static void enable_once_command (char *, int);
-static void
-enable_once_breakpoint PARAMS ((struct breakpoint *));
+static void enable_once_breakpoint (struct breakpoint *);
-static void
-disable_command PARAMS ((char *, int));
+static void disable_command (char *, int);
-static void
-enable_command PARAMS ((char *, int));
+static void enable_command (char *, int);
-static void
-map_breakpoint_numbers PARAMS ((char *, void (*)(struct breakpoint *)));
+static void map_breakpoint_numbers (char *, void (*)(struct breakpoint *));
-static void
-ignore_command PARAMS ((char *, int));
+static void ignore_command (char *, int);
-static int breakpoint_re_set_one PARAMS ((PTR));
+static int breakpoint_re_set_one (PTR);
-static void
-clear_command PARAMS ((char *, int));
+static void clear_command (char *, int);
-static void
-catch_command PARAMS ((char *, int));
+static void catch_command (char *, int);
-static void
-handle_gnu_4_16_catch_command PARAMS ((char *, int, int));
+static void handle_gnu_4_16_catch_command (char *, int, int);
-static struct symtabs_and_lines
-get_catch_sals PARAMS ((int));
+static struct symtabs_and_lines get_catch_sals (int);
-static void
-watch_command PARAMS ((char *, int));
+static void watch_command (char *, int);
-static int
-can_use_hardware_watchpoint PARAMS ((struct value *));
+static int can_use_hardware_watchpoint (struct value *);
-static void break_at_finish_command PARAMS ((char *, int));
-static void break_at_finish_at_depth_command PARAMS ((char *, int));
+static void break_at_finish_command (char *, int);
+static void break_at_finish_at_depth_command (char *, int);
-void
-tbreak_command PARAMS ((char *, int));
+void tbreak_command (char *, int);
-static void tbreak_at_finish_command PARAMS ((char *, int));
+static void tbreak_at_finish_command (char *, int);
-static void
-break_command_1 PARAMS ((char *, int, int));
+static void break_command_1 (char *, int, int);
-static void
-mention PARAMS ((struct breakpoint *));
+static void mention (struct breakpoint *);
-struct breakpoint *
- set_raw_breakpoint PARAMS ((struct symtab_and_line));
+struct breakpoint *set_raw_breakpoint (struct symtab_and_line);
-static void
-check_duplicates PARAMS ((CORE_ADDR, asection *));
+static void check_duplicates (CORE_ADDR, asection *);
-static void
-describe_other_breakpoints PARAMS ((CORE_ADDR, asection *));
+static void describe_other_breakpoints (CORE_ADDR, asection *);
-static void
-breakpoints_info PARAMS ((char *, int));
+static void breakpoints_info (char *, int);
-static void
-breakpoint_1 PARAMS ((int, int));
+static void breakpoint_1 (int, int);
-static bpstat
- bpstat_alloc PARAMS ((struct breakpoint *, bpstat));
+static bpstat bpstat_alloc (struct breakpoint *, bpstat);
-static int breakpoint_cond_eval PARAMS ((PTR));
+static int breakpoint_cond_eval (PTR);
-static void
-cleanup_executing_breakpoints PARAMS ((PTR));
+static void cleanup_executing_breakpoints (PTR);
-static void
-commands_command PARAMS ((char *, int));
+static void commands_command (char *, int);
-static void
-condition_command PARAMS ((char *, int));
+static void condition_command (char *, int);
-static int
-get_number_trailer PARAMS ((char **, int));
+static int get_number_trailer (char **, int);
-void
-set_breakpoint_count PARAMS ((int));
+void set_breakpoint_count (int);
#if 0
-static struct breakpoint *
- create_temp_exception_breakpoint PARAMS ((CORE_ADDR));
+static struct breakpoint *create_temp_exception_breakpoint (CORE_ADDR);
#endif
typedef enum
}
insertion_state_t;
-static int
-remove_breakpoint PARAMS ((struct breakpoint *, insertion_state_t));
+static int remove_breakpoint (struct breakpoint *, insertion_state_t);
-static enum print_stop_action print_it_typical PARAMS ((bpstat));
+static enum print_stop_action print_it_typical (bpstat);
static enum print_stop_action print_bp_stop_message (bpstat bs);
}
args_for_catchpoint_enable;
-static int watchpoint_check PARAMS ((PTR));
+static int watchpoint_check (PTR);
-static int cover_target_enable_exception_callback PARAMS ((PTR));
+static int cover_target_enable_exception_callback (PTR);
-static void maintenance_info_breakpoints PARAMS ((char *, int));
+static void maintenance_info_breakpoints (char *, int);
#ifdef GET_LONGJMP_TARGET
-static void create_longjmp_breakpoint PARAMS ((char *));
+static void create_longjmp_breakpoint (char *);
#endif
-static int hw_breakpoint_used_count PARAMS ((void));
+static int hw_breakpoint_used_count (void);
-static int hw_watchpoint_used_count PARAMS ((enum bptype, int *));
+static int hw_watchpoint_used_count (enum bptype, int *);
-static void hbreak_command PARAMS ((char *, int));
+static void hbreak_command (char *, int);
-static void thbreak_command PARAMS ((char *, int));
+static void thbreak_command (char *, int);
-static void watch_command_1 PARAMS ((char *, int, int));
+static void watch_command_1 (char *, int, int);
-static void rwatch_command PARAMS ((char *, int));
+static void rwatch_command (char *, int);
-static void awatch_command PARAMS ((char *, int));
+static void awatch_command (char *, int);
-static void do_enable_breakpoint PARAMS ((struct breakpoint *, enum bpdisp));
+static void do_enable_breakpoint (struct breakpoint *, enum bpdisp);
-static void solib_load_unload_1 PARAMS ((char *hookname,
- int tempflag,
- char *dll_pathname,
- char *cond_string,
- enum bptype bp_kind));
+static void solib_load_unload_1 (char *hookname,
+ int tempflag,
+ char *dll_pathname,
+ char *cond_string, enum bptype bp_kind);
-static void create_fork_vfork_event_catchpoint PARAMS ((int tempflag,
- char *cond_string,
- enum bptype bp_kind));
+static void create_fork_vfork_event_catchpoint (int tempflag,
+ char *cond_string,
+ enum bptype bp_kind);
-static void break_at_finish_at_depth_command_1 PARAMS ((char *arg,
- int flag,
- int from_tty));
+static void break_at_finish_at_depth_command_1 (char *arg,
+ int flag, int from_tty);
-static void break_at_finish_command_1 PARAMS ((char *arg,
- int flag,
- int from_tty));
+static void break_at_finish_command_1 (char *arg, int flag, int from_tty);
-static void stop_command PARAMS ((char *arg, int from_tty));
+static void stop_command (char *arg, int from_tty);
-static void stopin_command PARAMS ((char *arg, int from_tty));
+static void stopin_command (char *arg, int from_tty);
-static void stopat_command PARAMS ((char *arg, int from_tty));
+static void stopat_command (char *arg, int from_tty);
-static char *ep_find_event_name_end PARAMS ((char *arg));
+static char *ep_find_event_name_end (char *arg);
-static char *ep_parse_optional_if_clause PARAMS ((char **arg));
+static char *ep_parse_optional_if_clause (char **arg);
-static char *ep_parse_optional_filename PARAMS ((char **arg));
+static char *ep_parse_optional_filename (char **arg);
#if defined(CHILD_INSERT_EXEC_CATCHPOINT)
-static void catch_exec_command_1 PARAMS ((char *arg, int tempflag,
- int from_tty));
+static void catch_exec_command_1 (char *arg, int tempflag, int from_tty);
#endif
-static void create_exception_catchpoint
- PARAMS ((int tempflag, char *cond_string,
- enum exception_event_kind ex_event,
- struct symtab_and_line * sal));
+static void create_exception_catchpoint
+ (int tempflag, char *cond_string,
+ enum exception_event_kind ex_event, struct symtab_and_line *sal);
-static void catch_exception_command_1
- PARAMS ((enum exception_event_kind ex_event,
- char *arg, int tempflag, int from_tty));
+static void catch_exception_command_1
+ (enum exception_event_kind ex_event, char *arg, int tempflag, int from_tty);
-static void tcatch_command PARAMS ((char *arg, int from_tty));
+static void tcatch_command (char *arg, int from_tty);
-static void ep_skip_leading_whitespace PARAMS ((char **s));
+static void ep_skip_leading_whitespace (char **s);
/* Prototypes for exported functions. */
-static void
-awatch_command PARAMS ((char *, int));
+static void awatch_command (char *, int);
-static void
-do_enable_breakpoint PARAMS ((struct breakpoint *, enum bpdisp));
+static void do_enable_breakpoint (struct breakpoint *, enum bpdisp);
/* If FALSE, gdb will not use hardware support for watchpoints, even
if such is available. */
static int can_use_hw_watchpoints;
-void _initialize_breakpoint PARAMS ((void));
+void _initialize_breakpoint (void);
-void set_breakpoint_count PARAMS ((int));
+void set_breakpoint_count (int);
extern int addressprint; /* Print machine addresses? */
/* Set breakpoint count to NUM. */
void
-set_breakpoint_count (num)
- int num;
+set_breakpoint_count (int num)
{
breakpoint_count = num;
set_internalvar (lookup_internalvar ("bpnum"),
/* Used in run_command to zero the hit count when a new run starts. */
void
-clear_breakpoint_hit_counts ()
+clear_breakpoint_hit_counts (void)
{
struct breakpoint *b;
TRAILER is a character which can be found after the number; most
commonly this is `-'. If you don't want a trailer, use \0. */
static int
-get_number_trailer (pp, trailer)
- char **pp;
- int trailer;
+get_number_trailer (char **pp, int trailer)
{
int retval = 0; /* default */
char *p = *pp;
/* Like get_number_trailer, but don't allow a trailer. */
int
-get_number (pp)
- char **pp;
+get_number (char **pp)
{
return get_number_trailer (pp, '\0');
}
*/
int
-get_number_or_range (pp)
- char **pp;
+get_number_or_range (char **pp)
{
static int last_retval, end_value;
static char *end_ptr;
/* condition N EXP -- set break condition of breakpoint N to EXP. */
static void
-condition_command (arg, from_tty)
- char *arg;
- int from_tty;
+condition_command (char *arg, int from_tty)
{
register struct breakpoint *b;
char *p;
{
if (b->cond)
{
- free ((PTR) b->cond);
+ xfree (b->cond);
b->cond = 0;
}
if (b->cond_string != NULL)
- free ((PTR) b->cond_string);
+ xfree (b->cond_string);
if (*p == 0)
{
/* ARGSUSED */
static void
-commands_command (arg, from_tty)
- char *arg;
- int from_tty;
+commands_command (char *arg, int from_tty)
{
register struct breakpoint *b;
char *p;
shadow contents, not the breakpoints themselves. From breakpoint.c. */
int
-read_memory_nobpt (memaddr, myaddr, len)
- CORE_ADDR memaddr;
- char *myaddr;
- unsigned len;
+read_memory_nobpt (CORE_ADDR memaddr, char *myaddr, unsigned len)
{
int status;
struct breakpoint *b;
or an `errno' value if could not write the inferior. */
int
-insert_breakpoints ()
+insert_breakpoints (void)
{
register struct breakpoint *b, *temp;
int return_val = 0; /* return success code. */
b->type == bp_read_watchpoint ||
b->type == bp_access_watchpoint)
&& b->enable == enabled
+ && b->disposition != del_at_next_stop
&& !b->inserted
&& !b->duplicate)
{
if (VALUE_LVAL (v) == lval_memory
&& ! VALUE_LAZY (v))
{
- CORE_ADDR addr;
- int len, type;
-
- addr = VALUE_ADDRESS (v) + VALUE_OFFSET (v);
- len = TYPE_LENGTH (VALUE_TYPE (v));
- type = hw_write;
- if (b->type == bp_read_watchpoint)
- type = hw_read;
- else if (b->type == bp_access_watchpoint)
- type = hw_access;
-
- val = target_insert_watchpoint (addr, len, type);
- if (val == -1)
+ struct type *vtype = check_typedef (VALUE_TYPE (v));
+
+ /* We only watch structs and arrays if user asked
+ for it explicitly, never if they just happen to
+ appear in the middle of some value chain. */
+ if (v == b->val_chain
+ || (TYPE_CODE (vtype) != TYPE_CODE_STRUCT
+ && TYPE_CODE (vtype) != TYPE_CODE_ARRAY))
{
- b->inserted = 0;
- break;
+ CORE_ADDR addr;
+ int len, type;
+
+ addr = VALUE_ADDRESS (v) + VALUE_OFFSET (v);
+ len = TYPE_LENGTH (VALUE_TYPE (v));
+ type = hw_write;
+ if (b->type == bp_read_watchpoint)
+ type = hw_read;
+ else if (b->type == bp_access_watchpoint)
+ type = hw_access;
+
+ val = target_insert_watchpoint (addr, len, type);
+ if (val == -1)
+ {
+ /* Don't exit the loop, try to insert
+ every value on the value chain. That's
+ because we will be removing all the
+ watches below, and removing a
+ watchpoint we didn't insert could have
+ adverse effects. */
+ b->inserted = 0;
+ }
+ val = 0;
}
- val = 0;
}
}
/* Failure to insert a watchpoint on any memory value in the
}
else
{
- printf_filtered ("Hardware watchpoint %d deleted", b->number);
+ printf_filtered ("Hardware watchpoint %d deleted ", b->number);
printf_filtered ("because the program has left the block \n");
printf_filtered ("in which its expression is valid.\n");
if (b->related_breakpoint)
/* Restore the frame and level. */
if ((saved_frame != selected_frame) ||
(saved_level != selected_frame_level))
- select_and_print_frame (saved_frame, saved_level);
+ select_frame (saved_frame, saved_level);
if (val)
return_val = val; /* remember failure */
int
-remove_breakpoints ()
+remove_breakpoints (void)
{
register struct breakpoint *b;
int val;
}
int
-reattach_breakpoints (pid)
- int pid;
+remove_hw_watchpoints (void)
+{
+ register struct breakpoint *b;
+ int val;
+
+ ALL_BREAKPOINTS (b)
+ {
+ if (b->inserted
+ && (b->type == bp_hardware_watchpoint
+ || b->type == bp_read_watchpoint
+ || b->type == bp_access_watchpoint))
+ {
+ val = remove_breakpoint (b, mark_uninserted);
+ if (val != 0)
+ return val;
+ }
+ }
+ return 0;
+}
+
+int
+reattach_breakpoints (int pid)
{
register struct breakpoint *b;
int val;
}
void
-update_breakpoints_after_exec ()
+update_breakpoints_after_exec (void)
{
struct breakpoint *b;
struct breakpoint *temp;
}
int
-detach_breakpoints (pid)
- int pid;
+detach_breakpoints (int pid)
{
register struct breakpoint *b;
int val;
}
static int
-remove_breakpoint (b, is)
- struct breakpoint *b;
- insertion_state_t is;
+remove_breakpoint (struct breakpoint *b, insertion_state_t is)
{
int val;
/* Check to see if breakpoint is in an overlay section;
if so, we should remove the breakpoint at the LMA address.
If that is not equal to the raw address, then we should
- presumable remove the breakpoint there as well. */
+ presumably remove the breakpoint there as well. */
if (overlay_debugging && b->section &&
section_is_overlay (b->section))
{
if (VALUE_LVAL (v) == lval_memory
&& ! VALUE_LAZY (v))
{
- CORE_ADDR addr;
- int len, type;
+ struct type *vtype = check_typedef (VALUE_TYPE (v));
- addr = VALUE_ADDRESS (v) + VALUE_OFFSET (v);
- len = TYPE_LENGTH (VALUE_TYPE (v));
- type = hw_write;
- if (b->type == bp_read_watchpoint)
- type = hw_read;
- else if (b->type == bp_access_watchpoint)
- type = hw_access;
-
- val = target_remove_watchpoint (addr, len, type);
- if (val == -1)
- b->inserted = 1;
- val = 0;
+ if (v == b->val_chain
+ || (TYPE_CODE (vtype) != TYPE_CODE_STRUCT
+ && TYPE_CODE (vtype) != TYPE_CODE_ARRAY))
+ {
+ CORE_ADDR addr;
+ int len, type;
+
+ addr = VALUE_ADDRESS (v) + VALUE_OFFSET (v);
+ len = TYPE_LENGTH (VALUE_TYPE (v));
+ type = hw_write;
+ if (b->type == bp_read_watchpoint)
+ type = hw_read;
+ else if (b->type == bp_access_watchpoint)
+ type = hw_access;
+
+ val = target_remove_watchpoint (addr, len, type);
+ if (val == -1)
+ b->inserted = 1;
+ val = 0;
+ }
}
}
/* Failure to remove any of the hardware watchpoints comes here. */
/* Clear the "inserted" flag in all breakpoints. */
void
-mark_breakpoints_out ()
+mark_breakpoints_out (void)
{
register struct breakpoint *b;
void
-breakpoint_init_inferior (context)
- enum inf_context context;
+breakpoint_init_inferior (enum inf_context context)
{
register struct breakpoint *b, *temp;
static int warning_needed = 0;
the target, to advance the PC past the breakpoint. */
enum breakpoint_here
-breakpoint_here_p (pc)
- CORE_ADDR pc;
+breakpoint_here_p (CORE_ADDR pc)
{
register struct breakpoint *b;
int any_breakpoint_here = 0;
at PC. */
int
-breakpoint_inserted_here_p (pc)
- CORE_ADDR pc;
+breakpoint_inserted_here_p (CORE_ADDR pc)
{
register struct breakpoint *b;
bp_call_dummy breakpoint. */
int
-frame_in_dummy (frame)
- struct frame_info *frame;
+frame_in_dummy (struct frame_info *frame)
{
struct breakpoint *b;
return 0;
}
-/* breakpoint_match_thread (PC, PID) returns true if the breakpoint at PC
- is valid for process/thread PID. */
+/* breakpoint_thread_match (PC, PID) returns true if the breakpoint at
+ PC is valid for process/thread PID. */
int
-breakpoint_thread_match (pc, pid)
- CORE_ADDR pc;
- int pid;
+breakpoint_thread_match (CORE_ADDR pc, int pid)
{
struct breakpoint *b;
int thread;
in breakpoint.h. */
int
-ep_is_catchpoint (ep)
- struct breakpoint *ep;
+ep_is_catchpoint (struct breakpoint *ep)
{
return
(ep->type == bp_catch_load)
}
int
-ep_is_shlib_catchpoint (ep)
- struct breakpoint *ep;
+ep_is_shlib_catchpoint (struct breakpoint *ep)
{
return
(ep->type == bp_catch_load)
}
int
-ep_is_exception_catchpoint (ep)
- struct breakpoint *ep;
+ep_is_exception_catchpoint (struct breakpoint *ep)
{
return
(ep->type == bp_catch_catch)
Also free any storage that is part of a bpstat. */
void
-bpstat_clear (bsp)
- bpstat *bsp;
+bpstat_clear (bpstat *bsp)
{
bpstat p;
bpstat q;
q = p->next;
if (p->old_val != NULL)
value_free (p->old_val);
- free ((PTR) p);
+ xfree (p);
p = q;
}
*bsp = NULL;
is part of the bpstat is copied as well. */
bpstat
-bpstat_copy (bs)
- bpstat bs;
+bpstat_copy (bpstat bs)
{
bpstat p = NULL;
bpstat tmp;
/* Find the bpstat associated with this breakpoint */
bpstat
-bpstat_find_breakpoint (bsp, breakpoint)
- bpstat bsp;
- struct breakpoint *breakpoint;
+bpstat_find_breakpoint (bpstat bsp, struct breakpoint *breakpoint)
{
if (bsp == NULL)
return NULL;
See wait_for_inferior's use of this function. */
struct breakpoint *
-bpstat_find_step_resume_breakpoint (bsp)
- bpstat bsp;
+bpstat_find_step_resume_breakpoint (bpstat bsp)
{
if (bsp == NULL)
error ("Internal error (bpstat_find_step_resume_breakpoint)");
Return 0 if passed a bpstat which does not indicate any breakpoints. */
int
-bpstat_num (bsp)
- bpstat *bsp;
+bpstat_num (bpstat *bsp)
{
struct breakpoint *b;
/* Modify BS so that the actions will not be performed. */
void
-bpstat_clear_actions (bs)
- bpstat bs;
+bpstat_clear_actions (bpstat bs)
{
for (; bs != NULL; bs = bs->next)
{
/* Stub for cleaning up our state if we error-out of a breakpoint command */
/* ARGSUSED */
static void
-cleanup_executing_breakpoints (ignore)
- PTR ignore;
+cleanup_executing_breakpoints (PTR ignore)
{
executing_breakpoint_commands = 0;
}
the global "breakpoint_proceeded" after each command. */
void
-bpstat_do_actions (bsp)
- bpstat *bsp;
+bpstat_do_actions (bpstat *bsp)
{
bpstat bs;
struct cleanup *old_chain;
analysis. */
static enum print_stop_action
-print_it_typical (bs)
- bpstat bs;
+print_it_typical (bpstat bs)
{
+#ifdef UI_OUT
+ struct cleanup *old_chain;
+ struct ui_stream *stb;
+ stb = ui_out_stream_new (uiout);
+ old_chain = make_cleanup_ui_out_stream_delete (stb);
+#endif /* UI_OUT */
/* bs->breakpoint_at can be NULL if it was a momentary breakpoint
which has since been deleted. */
if (bs->breakpoint_at == NULL)
{
case bp_breakpoint:
case bp_hardware_breakpoint:
+#ifdef UI_OUT
+ annotate_breakpoint (bs->breakpoint_at->number);
+ ui_out_text (uiout, "\nBreakpoint ");
+ if (interpreter_p && strcmp (interpreter_p, "mi") == 0)
+ ui_out_field_string (uiout, "reason", "breakpoint-hit");
+ ui_out_field_int (uiout, "bkptno", bs->breakpoint_at->number);
+ ui_out_text (uiout, ", ");
+ return PRINT_SRC_AND_LOC;
+#else
/* I think the user probably only wants to see one breakpoint
number, not all of them. */
annotate_breakpoint (bs->breakpoint_at->number);
printf_filtered ("\nBreakpoint %d, ", bs->breakpoint_at->number);
return PRINT_SRC_AND_LOC;
+#endif
break;
case bp_shlib_event:
if (bs->old_val != NULL)
{
annotate_watchpoint (bs->breakpoint_at->number);
+#ifdef UI_OUT
+ if (interpreter_p && strcmp (interpreter_p, "mi") == 0)
+ ui_out_field_string (uiout, "reason", "watchpoint-trigger");
+ mention (bs->breakpoint_at);
+ ui_out_list_begin (uiout, "value");
+ ui_out_text (uiout, "\nOld value = ");
+ value_print (bs->old_val, stb->stream, 0, Val_pretty_default);
+ ui_out_field_stream (uiout, "old", stb);
+ ui_out_text (uiout, "\nNew value = ");
+ value_print (bs->breakpoint_at->val, stb->stream, 0, Val_pretty_default);
+ ui_out_field_stream (uiout, "new", stb);
+ ui_out_list_end (uiout);
+ ui_out_text (uiout, "\n");
+#else
mention (bs->breakpoint_at);
printf_filtered ("\nOld value = ");
value_print (bs->old_val, gdb_stdout, 0, Val_pretty_default);
value_print (bs->breakpoint_at->val, gdb_stdout, 0,
Val_pretty_default);
printf_filtered ("\n");
+#endif
value_free (bs->old_val);
bs->old_val = NULL;
}
break;
case bp_read_watchpoint:
+#ifdef UI_OUT
+ if (interpreter_p && strcmp (interpreter_p, "mi") == 0)
+ ui_out_field_string (uiout, "reason", "read-watchpoint-trigger");
+ mention (bs->breakpoint_at);
+ ui_out_list_begin (uiout, "value");
+ ui_out_text (uiout, "\nValue = ");
+ value_print (bs->breakpoint_at->val, stb->stream, 0, Val_pretty_default);
+ ui_out_field_stream (uiout, "value", stb);
+ ui_out_list_end (uiout);
+ ui_out_text (uiout, "\n");
+#else
mention (bs->breakpoint_at);
printf_filtered ("\nValue = ");
value_print (bs->breakpoint_at->val, gdb_stdout, 0,
Val_pretty_default);
printf_filtered ("\n");
+#endif
return PRINT_UNKNOWN;
break;
case bp_access_watchpoint:
+#ifdef UI_OUT
+ if (bs->old_val != NULL)
+ {
+ annotate_watchpoint (bs->breakpoint_at->number);
+ if (interpreter_p && strcmp (interpreter_p, "mi") == 0)
+ ui_out_field_string (uiout, "reason", "access-watchpoint-trigger");
+ mention (bs->breakpoint_at);
+ ui_out_list_begin (uiout, "value");
+ ui_out_text (uiout, "\nOld value = ");
+ value_print (bs->old_val, stb->stream, 0, Val_pretty_default);
+ ui_out_field_stream (uiout, "old", stb);
+ value_free (bs->old_val);
+ bs->old_val = NULL;
+ ui_out_text (uiout, "\nNew value = ");
+ }
+ else
+ {
+ mention (bs->breakpoint_at);
+ if (interpreter_p && strcmp (interpreter_p, "mi") == 0)
+ ui_out_list_begin (uiout, "value");
+ ui_out_field_string (uiout, "reason", "access-watchpoint-trigger");
+ ui_out_text (uiout, "\nValue = ");
+ }
+ value_print (bs->breakpoint_at->val, stb->stream, 0,Val_pretty_default);
+ ui_out_field_stream (uiout, "new", stb);
+ ui_out_list_end (uiout);
+ ui_out_text (uiout, "\n");
+#else
if (bs->old_val != NULL)
{
annotate_watchpoint (bs->breakpoint_at->number);
value_print (bs->breakpoint_at->val, gdb_stdout, 0,
Val_pretty_default);
printf_filtered ("\n");
+#endif
return PRINT_UNKNOWN;
break;
here. */
case bp_finish:
+#ifdef UI_OUT
+ if (interpreter_p && strcmp (interpreter_p, "mi") == 0)
+ ui_out_field_string (uiout, "reason", "function-finished");
+#endif
+ return PRINT_UNKNOWN;
+ break;
+
case bp_until:
+#ifdef UI_OUT
+ if (interpreter_p && strcmp (interpreter_p, "mi") == 0)
+ ui_out_field_string (uiout, "reason", "location-reached");
+#endif
+ return PRINT_UNKNOWN;
+ break;
+
case bp_none:
case bp_longjmp:
case bp_longjmp_resume:
further info to be printed.*/
enum print_stop_action
-bpstat_print (bs)
- bpstat bs;
+bpstat_print (bpstat bs)
{
int val;
make it pass through catch_errors. */
static int
-breakpoint_cond_eval (exp)
- PTR exp;
+breakpoint_cond_eval (PTR exp)
{
value_ptr mark = value_mark ();
int i = !value_true (evaluate_expression ((struct expression *) exp));
/* Allocate a new bpstat and chain it to the current one. */
static bpstat
-bpstat_alloc (b, cbs)
- register struct breakpoint *b;
- bpstat cbs; /* Current "bs" value */
+bpstat_alloc (struct breakpoint *b, bpstat cbs /* Current "bs" value */ )
{
bpstat bs;
/* Check watchpoint condition. */
static int
-watchpoint_check (p)
- PTR p;
+watchpoint_check (PTR p)
{
bpstat bs = (bpstat) p;
struct breakpoint *b;
in this case, by the time we call print_it_typical() this bp
will be deleted already. So we have no choice but print the
information here. */
+#ifdef UI_OUT
+ if (interpreter_p && strcmp (interpreter_p, "mi") == 0)
+ ui_out_field_string (uiout, "reason", "watchpoint-scope");
+ ui_out_text (uiout, "\nWatchpoint ");
+ ui_out_field_int (uiout, "wpnum", bs->breakpoint_at->number);
+ ui_out_text (uiout, " deleted because the program has left the block in\n\
+which its expression is valid.\n");
+#else
printf_filtered ("\
Watchpoint %d deleted because the program has left the block in\n\
which its expression is valid.\n", bs->breakpoint_at->number);
+#endif
if (b->related_breakpoint)
b->related_breakpoint->disposition = del_at_next_stop;
commands, FIXME??? fields. */
bpstat
-bpstat_stop_status (pc, not_a_breakpoint)
- CORE_ADDR *pc;
- int not_a_breakpoint;
+bpstat_stop_status (CORE_ADDR *pc, int not_a_breakpoint)
{
register struct breakpoint *b, *temp;
CORE_ADDR bp_addr;
if (VALUE_LVAL (v) == lval_memory
&& ! VALUE_LAZY (v))
{
- CORE_ADDR vaddr;
-
- vaddr = VALUE_ADDRESS (v) + VALUE_OFFSET (v);
- /* Exact match not required. Within range is sufficient.
- */
- if (addr >= vaddr &&
- addr < vaddr + TYPE_LENGTH (VALUE_TYPE (v)))
- found = 1;
+ struct type *vtype = check_typedef (VALUE_TYPE (v));
+
+ if (v == b->val_chain
+ || (TYPE_CODE (vtype) != TYPE_CODE_STRUCT
+ && TYPE_CODE (vtype) != TYPE_CODE_ARRAY))
+ {
+ CORE_ADDR vaddr;
+
+ vaddr = VALUE_ADDRESS (v) + VALUE_OFFSET (v);
+ /* Exact match not required. Within range is
+ sufficient. */
+ if (addr >= vaddr &&
+ addr < vaddr + TYPE_LENGTH (VALUE_TYPE (v)))
+ found = 1;
+ }
}
}
if (found)
/* Stop. */
break;
case WP_VALUE_CHANGED:
+ if (b->type == bp_read_watchpoint)
+ {
+ /* Don't stop: read watchpoints shouldn't fire if
+ the value has changed. This is for targets which
+ cannot set read-only watchpoints. */
+ bs->print_it = print_it_noop;
+ bs->stop = 0;
+ continue;
+ }
+ ++(b->hit_count);
+ break;
case WP_VALUE_NOT_CHANGED:
/* Stop. */
++(b->hit_count);
\f
/* Tell what to do about this bpstat. */
struct bpstat_what
-bpstat_what (bs)
- bpstat bs;
+bpstat_what (bpstat bs)
{
/* Classify each bpstat as one of the following. */
enum class
back and decide something of a lower priority is better. The
ordering is:
- kc < clr sgl shl slr sn sr ss ts
+ kc < clr sgl shl shlr slr sn sr ss ts
sgl < clrs shl shlr slr sn sr ss ts
slr < err shl shlr sn sr ss ts
clr < clrs err shl shlr sn sr ss ts
/*bp_noisy */
{sn, sn, sn, sn, sn, sn, sn, sr, ts, shl, shlr},
/*long_jump */
- {slr, ss, sn, slr, err, err, err, sr, ts, shl, shlr},
+ {slr, ss, sn, slr, slr, err, err, sr, ts, shl, shlr},
/*long_resume */
{clr, ss, sn, clrs, err, err, err, sr, ts, shl, shlr},
/*step_resume */
just to things like whether watchpoints are set. */
int
-bpstat_should_step ()
+bpstat_should_step (void)
{
struct breakpoint *b;
ALL_BREAKPOINTS (b)
/* Nonzero if there are enabled hardware watchpoints. */
int
-bpstat_have_active_hw_watchpoints ()
+bpstat_have_active_hw_watchpoints (void)
{
struct breakpoint *b;
ALL_BREAKPOINTS (b)
function returns another bpstat which contains only the catchpoints
on that first list, if any. */
void
-bpstat_get_triggered_catchpoints (ep_list, cp_list)
- bpstat ep_list;
- bpstat *cp_list;
+bpstat_get_triggered_catchpoints (bpstat ep_list, bpstat *cp_list)
{
struct bpstats root_bs[1];
bpstat bs = root_bs;
catchpoint triggers. Clients who may wish to know the name
later must get it from the catchpoint itself.) */
if (ep->triggered_dll_pathname != NULL)
- free (ep->triggered_dll_pathname);
+ xfree (ep->triggered_dll_pathname);
if (ep->type == bp_catch_load)
dll_pathname = SOLIB_LOADED_LIBRARY_PATHNAME (inferior_pid);
else
{"del", "dstp", "dis", "keep"};
static char bpenables[] = "nynny";
char wrap_indent[80];
+#ifdef UI_OUT
+ struct ui_stream *stb = ui_out_stream_new (uiout);
+ struct cleanup *old_chain = make_cleanup_ui_out_stream_delete (stb);
+#endif
annotate_record ();
+#ifdef UI_OUT
+ ui_out_list_begin (uiout, "bkpt");
+#endif
/* 1 */
annotate_field (0);
+#ifdef UI_OUT
+ ui_out_field_int (uiout, "number", b->number);
+#else
printf_filtered ("%-3d ", b->number);
+#endif
/* 2 */
annotate_field (1);
|| ((int) b->type != bptypes[(int) b->type].type))
internal_error ("bptypes table does not describe type #%d.",
(int) b->type);
+#ifdef UI_OUT
+ ui_out_field_string (uiout, "type", bptypes[(int) b->type].description);
+#else
printf_filtered ("%-14s ", bptypes[(int) b->type].description);
+#endif
/* 3 */
annotate_field (2);
+#ifdef UI_OUT
+ ui_out_field_string (uiout, "disp", bpdisps[(int) b->disposition]);
+#else
printf_filtered ("%-4s ", bpdisps[(int) b->disposition]);
+#endif
/* 4 */
annotate_field (3);
+#ifdef UI_OUT
+ ui_out_field_fmt (uiout, "enabled", "%c", bpenables[(int) b->enable]);
+ ui_out_spaces (uiout, 2);
+#else
printf_filtered ("%-3c ", bpenables[(int) b->enable]);
+#endif
/* 5 and 6 */
strcpy (wrap_indent, " ");
/* Field 4, the address, is omitted (which makes the columns
not line up too nicely with the headers, but the effect
is relatively readable). */
+#ifdef UI_OUT
+ if (addressprint)
+ ui_out_field_skip (uiout, "addr");
+ annotate_field (5);
+ print_expression (b->exp, stb->stream);
+ ui_out_field_stream (uiout, "what", stb);
+#else
annotate_field (5);
print_expression (b->exp, gdb_stdout);
+#endif
break;
case bp_catch_load:
/* Field 4, the address, is omitted (which makes the columns
not line up too nicely with the headers, but the effect
is relatively readable). */
+#ifdef UI_OUT
+ if (addressprint)
+ ui_out_field_skip (uiout, "addr");
+ annotate_field (5);
+ if (b->dll_pathname == NULL)
+ {
+ ui_out_field_string (uiout, "what", "<any library>");
+ ui_out_spaces (uiout, 1);
+ }
+ else
+ {
+ ui_out_text (uiout, "library \"");
+ ui_out_field_string (uiout, "what", b->dll_pathname);
+ ui_out_text (uiout, "\" ");
+ }
+#else
annotate_field (5);
if (b->dll_pathname == NULL)
printf_filtered ("<any library> ");
else
printf_filtered ("library \"%s\" ", b->dll_pathname);
+#endif
break;
case bp_catch_fork:
/* Field 4, the address, is omitted (which makes the columns
not line up too nicely with the headers, but the effect
is relatively readable). */
+#ifdef UI_OUT
+ if (addressprint)
+ ui_out_field_skip (uiout, "addr");
+ annotate_field (5);
+ if (b->forked_inferior_pid != 0)
+ {
+ ui_out_text (uiout, "process ");
+ ui_out_field_int (uiout, "what", b->forked_inferior_pid);
+ ui_out_spaces (uiout, 1);
+ }
+#else
annotate_field (5);
if (b->forked_inferior_pid != 0)
printf_filtered ("process %d ", b->forked_inferior_pid);
break;
+#endif
case bp_catch_exec:
/* Field 4, the address, is omitted (which makes the columns
not line up too nicely with the headers, but the effect
is relatively readable). */
+#ifdef UI_OUT
+ if (addressprint)
+ ui_out_field_skip (uiout, "addr");
+ annotate_field (5);
+ if (b->exec_pathname != NULL)
+ {
+ ui_out_text (uiout, "program \"");
+ ui_out_field_string (uiout, "what", b->exec_pathname);
+ ui_out_text (uiout, "\" ");
+ }
+#else
annotate_field (5);
if (b->exec_pathname != NULL)
printf_filtered ("program \"%s\" ", b->exec_pathname);
+#endif
break;
case bp_catch_catch:
/* Field 4, the address, is omitted (which makes the columns
not line up too nicely with the headers, but the effect
is relatively readable). */
+#ifdef UI_OUT
+ if (addressprint)
+ ui_out_field_skip (uiout, "addr");
+ annotate_field (5);
+ ui_out_field_string (uiout, "what", "exception catch");
+ ui_out_spaces (uiout, 1);
+#else
annotate_field (5);
printf_filtered ("exception catch ");
+#endif
break;
case bp_catch_throw:
/* Field 4, the address, is omitted (which makes the columns
not line up too nicely with the headers, but the effect
is relatively readable). */
+#ifdef UI_OUT
+ if (addressprint)
+ ui_out_field_skip (uiout, "addr");
+ annotate_field (5);
+ ui_out_field_string (uiout, "what", "exception throw");
+ ui_out_spaces (uiout, 1);
+#else
annotate_field (5);
printf_filtered ("exception throw ");
+#endif
break;
case bp_breakpoint:
case bp_call_dummy:
case bp_shlib_event:
case bp_thread_event:
+#ifdef UI_OUT
+ if (addressprint)
+ {
+ annotate_field (4);
+ ui_out_field_core_addr (uiout, "addr", b->address);
+ }
+ annotate_field (5);
+ *last_addr = b->address;
+ if (b->source_file)
+ {
+ sym = find_pc_sect_function (b->address, b->section);
+ if (sym)
+ {
+ ui_out_text (uiout, "in ");
+ ui_out_field_string (uiout, "func",
+ SYMBOL_SOURCE_NAME (sym));
+ ui_out_wrap_hint (uiout, wrap_indent);
+ ui_out_text (uiout, " at ");
+ }
+ ui_out_field_string (uiout, "file", b->source_file);
+ ui_out_text (uiout, ":");
+ ui_out_field_int (uiout, "line", b->line_number);
+ }
+ else
+ {
+ print_address_symbolic (b->address, stb->stream, demangle, "");
+ ui_out_field_stream (uiout, "at", stb);
+ }
+#else
if (addressprint)
{
annotate_field (4);
}
else
print_address_symbolic (b->address, gdb_stdout, demangle, " ");
+#endif
break;
}
if (b->thread != -1)
{
+#ifdef UI_OUT
+ /* FIXME: This seems to be redundant and lost here; see the
+ "stop only in" line a little further down. */
+ ui_out_text (uiout, " thread ");
+ ui_out_field_int (uiout, "thread", b->thread);
+#else
printf_filtered (" thread %d", b->thread);
+#endif
}
+#ifdef UI_OUT
+ ui_out_text (uiout, "\n");
+#else
printf_filtered ("\n");
+#endif
if (b->frame)
{
annotate_field (6);
+#ifdef UI_OUT
+ ui_out_text (uiout, "\tstop only in stack frame at ");
+ ui_out_field_core_addr (uiout, "frame", b->frame);
+ ui_out_text (uiout, "\n");
+#else
printf_filtered ("\tstop only in stack frame at ");
print_address_numeric (b->frame, 1, gdb_stdout);
printf_filtered ("\n");
+#endif
}
if (b->cond)
{
annotate_field (7);
+#ifdef UI_OUT
+ ui_out_text (uiout, "\tstop only if ");
+ print_expression (b->cond, stb->stream);
+ ui_out_field_stream (uiout, "cond", stb);
+ ui_out_text (uiout, "\n");
+#else
printf_filtered ("\tstop only if ");
print_expression (b->cond, gdb_stdout);
printf_filtered ("\n");
+#endif
}
if (b->thread != -1)
{
/* FIXME should make an annotation for this */
+#ifdef UI_OUT
+ ui_out_text (uiout, "\tstop only in thread ");
+ ui_out_field_int (uiout, "thread", b->thread);
+ ui_out_text (uiout, "\n");
+#else
printf_filtered ("\tstop only in thread %d\n", b->thread);
+#endif
}
if (show_breakpoint_hit_counts && b->hit_count)
{
/* FIXME should make an annotation for this */
+#ifdef UI_OUT
+ if (ep_is_catchpoint (b))
+ ui_out_text (uiout, "\tcatchpoint");
+ else
+ ui_out_text (uiout, "\tbreakpoint");
+ ui_out_text (uiout, " already hit ");
+ ui_out_field_int (uiout, "times", b->hit_count);
+ if (b->hit_count == 1)
+ ui_out_text (uiout, " time\n");
+ else
+ ui_out_text (uiout, " times\n");
+#else
if (ep_is_catchpoint (b))
printf_filtered ("\tcatchpoint");
else
printf_filtered ("\tbreakpoint");
printf_filtered (" already hit %d time%s\n",
b->hit_count, (b->hit_count == 1 ? "" : "s"));
+#endif
}
+#ifdef UI_OUT
+ /* Output the count also if it is zero, but only if this is
+ mi. FIXME: Should have a better test for this. */
+ if (interpreter_p && strcmp (interpreter_p, "mi") == 0)
+ if (show_breakpoint_hit_counts && b->hit_count == 0)
+ ui_out_field_int (uiout, "times", b->hit_count);
+#endif
+
if (b->ignore_count)
{
annotate_field (8);
+#ifdef UI_OUT
+ ui_out_text (uiout, "\tignore next ");
+ ui_out_field_int (uiout, "ignore", b->ignore_count);
+ ui_out_text (uiout, " hits\n");
+#else
printf_filtered ("\tignore next %d hits\n", b->ignore_count);
+#endif
}
if ((l = b->commands))
{
annotate_field (9);
+#ifdef UI_OUT
+ ui_out_list_begin (uiout, "script");
+ print_command_lines (uiout, l, 4);
+ ui_out_list_end (uiout);
+#else
while (l)
{
print_command_line (l, 4, gdb_stdout);
l = l->next;
}
+#endif
}
+#ifdef UI_OUT
+ ui_out_list_end (uiout);
+ do_cleanups (old_chain);
+#endif
}
struct captured_breakpoint_query_args
is nonzero, process only watchpoints. */
static void
-breakpoint_1 (bnum, allflag)
- int bnum;
- int allflag;
+breakpoint_1 (int bnum, int allflag)
{
register struct breakpoint *b;
CORE_ADDR last_addr = (CORE_ADDR) -1;
int found_a_breakpoint = 0;
+#ifdef UI_OUT
+ if (addressprint)
+ ui_out_table_begin (uiout, 6, "BreakpointTable");
+ else
+ ui_out_table_begin (uiout, 5, "BreakpointTable");
+#endif /* UI_OUT */
+
ALL_BREAKPOINTS (b)
if (bnum == -1
|| bnum == b->number)
if (!found_a_breakpoint++)
{
annotate_breakpoints_headers ();
+#ifdef UI_OUT
+ annotate_field (0);
+ ui_out_table_header (uiout, 3, ui_left, "Num"); /* 1 */
+ annotate_field (1);
+ ui_out_table_header (uiout, 14, ui_left, "Type"); /* 2 */
+ annotate_field (2);
+ ui_out_table_header (uiout, 4, ui_left, "Disp"); /* 3 */
+ annotate_field (3);
+ ui_out_table_header (uiout, 3, ui_left, "Enb"); /* 4 */
+ if (addressprint)
+ {
+ annotate_field (4);
+ ui_out_table_header (uiout, 10, ui_left, "Address"); /* 5 */
+ }
+ annotate_field (5);
+ ui_out_table_header (uiout, 40, ui_noalign, "What"); /* 6 */
+ ui_out_table_body (uiout);
+#else
annotate_field (0);
printf_filtered ("Num ");
annotate_field (1);
}
annotate_field (5);
printf_filtered ("What\n");
+#endif /* UI_OUT */
annotate_breakpoints_table ();
}
if (!found_a_breakpoint)
{
+#ifdef UI_OUT
+ if (bnum == -1)
+ ui_out_message (uiout, 0, "No breakpoints or watchpoints.\n");
+ else
+ ui_out_message (uiout, 0, "No breakpoint or watchpoint number %d.\n",
+ bnum);
+#else
if (bnum == -1)
printf_filtered ("No breakpoints or watchpoints.\n");
else
printf_filtered ("No breakpoint or watchpoint number %d.\n", bnum);
+#endif /* UI_OUT */
}
else
{
set_next_address (last_addr);
}
+#ifdef UI_OUT
+ ui_out_table_end (uiout);
+#endif /* UI_OUT */
/* FIXME? Should this be moved up so that it is only called when
there have been breakpoints? */
annotate_breakpoints_table_end ();
/* ARGSUSED */
static void
-breakpoints_info (bnum_exp, from_tty)
- char *bnum_exp;
- int from_tty;
+breakpoints_info (char *bnum_exp, int from_tty)
{
int bnum = -1;
if (bnum_exp)
- bnum = parse_and_eval_address (bnum_exp);
+ bnum = parse_and_eval_long (bnum_exp);
breakpoint_1 (bnum, 0);
}
/* ARGSUSED */
static void
-maintenance_info_breakpoints (bnum_exp, from_tty)
- char *bnum_exp;
- int from_tty;
+maintenance_info_breakpoints (char *bnum_exp, int from_tty)
{
int bnum = -1;
if (bnum_exp)
- bnum = parse_and_eval_address (bnum_exp);
+ bnum = parse_and_eval_long (bnum_exp);
breakpoint_1 (bnum, 1);
}
/* Print a message describing any breakpoints set at PC. */
static void
-describe_other_breakpoints (pc, section)
- CORE_ADDR pc;
- asection *section;
+describe_other_breakpoints (CORE_ADDR pc, asection *section)
{
register int others = 0;
register struct breakpoint *b;
for the `break' command with no arguments. */
void
-set_default_breakpoint (valid, addr, symtab, line)
- int valid;
- CORE_ADDR addr;
- struct symtab *symtab;
- int line;
+set_default_breakpoint (int valid, CORE_ADDR addr, struct symtab *symtab,
+ int line)
{
default_breakpoint_valid = valid;
default_breakpoint_address = addr;
the official one, and the rest as duplicates. */
static void
-check_duplicates (address, section)
- CORE_ADDR address;
- asection *section;
+check_duplicates (CORE_ADDR address, asection *section)
{
register struct breakpoint *b;
register int count = 0;
your arguments BEFORE calling this routine! */
struct breakpoint *
-set_raw_breakpoint (sal)
- struct symtab_and_line sal;
+set_raw_breakpoint (struct symtab_and_line sal)
{
register struct breakpoint *b, *b1;
#ifdef GET_LONGJMP_TARGET
static void
-create_longjmp_breakpoint (func_name)
- char *func_name;
+create_longjmp_breakpoint (char *func_name)
{
struct symtab_and_line sal;
struct breakpoint *b;
set_longjmp_resume_breakpoint() to figure out where we are going. */
void
-enable_longjmp_breakpoint ()
+enable_longjmp_breakpoint (void)
{
register struct breakpoint *b;
}
void
-disable_longjmp_breakpoint ()
+disable_longjmp_breakpoint (void)
{
register struct breakpoint *b;
}
struct breakpoint *
-create_thread_event_breakpoint (address)
- CORE_ADDR address;
+create_thread_event_breakpoint (CORE_ADDR address)
{
struct breakpoint *b;
struct symtab_and_line sal;
#ifdef SOLIB_ADD
void
-remove_solib_event_breakpoints ()
+remove_solib_event_breakpoints (void)
{
register struct breakpoint *b, *temp;
}
struct breakpoint *
-create_solib_event_breakpoint (address)
- CORE_ADDR address;
+create_solib_event_breakpoint (CORE_ADDR address)
{
struct breakpoint *b;
struct symtab_and_line sal;
apply to enabled breakpoints, disabled ones can just stay disabled. */
void
-disable_breakpoints_in_shlibs (silent)
- int silent;
+disable_breakpoints_in_shlibs (int silent)
{
struct breakpoint *b;
int disabled_shlib_breaks = 0;
/* Try to reenable any breakpoints in shared libraries. */
void
-re_enable_breakpoints_in_shlibs ()
+re_enable_breakpoints_in_shlibs (void)
{
struct breakpoint *b;
#endif
static void
-solib_load_unload_1 (hookname, tempflag, dll_pathname, cond_string, bp_kind)
- char *hookname;
- int tempflag;
- char *dll_pathname;
- char *cond_string;
- enum bptype bp_kind;
+solib_load_unload_1 (char *hookname, int tempflag, char *dll_pathname,
+ char *cond_string, enum bptype bp_kind)
{
struct breakpoint *b;
struct symtabs_and_lines sals;
/* Make sure that all storage allocated in decode_line_1 gets freed
in case the following errors out. */
- old_chain = make_cleanup (free, sals.sals);
+ old_chain = make_cleanup (xfree, sals.sals);
if (canonical != (char **) NULL)
{
- make_cleanup (free, canonical);
+ make_cleanup (xfree, canonical);
canonical_strings_chain = make_cleanup (null_cleanup, 0);
if (canonical[0] != NULL)
- make_cleanup (free, canonical[0]);
+ make_cleanup (xfree, canonical[0]);
}
resolve_sal_pc (&sals.sals[0]);
}
void
-create_solib_load_event_breakpoint (hookname, tempflag,
- dll_pathname, cond_string)
- char *hookname;
- int tempflag;
- char *dll_pathname;
- char *cond_string;
+create_solib_load_event_breakpoint (char *hookname, int tempflag,
+ char *dll_pathname, char *cond_string)
{
solib_load_unload_1 (hookname, tempflag, dll_pathname,
cond_string, bp_catch_load);
}
void
-create_solib_unload_event_breakpoint (hookname, tempflag,
- dll_pathname, cond_string)
- char *hookname;
- int tempflag;
- char *dll_pathname;
- char *cond_string;
+create_solib_unload_event_breakpoint (char *hookname, int tempflag,
+ char *dll_pathname, char *cond_string)
{
solib_load_unload_1 (hookname,tempflag, dll_pathname,
cond_string, bp_catch_unload);
}
static void
-create_fork_vfork_event_catchpoint (tempflag, cond_string, bp_kind)
- int tempflag;
- char *cond_string;
- enum bptype bp_kind;
+create_fork_vfork_event_catchpoint (int tempflag, char *cond_string,
+ enum bptype bp_kind)
{
struct symtab_and_line sal;
struct breakpoint *b;
}
void
-create_fork_event_catchpoint (tempflag, cond_string)
- int tempflag;
- char *cond_string;
+create_fork_event_catchpoint (int tempflag, char *cond_string)
{
create_fork_vfork_event_catchpoint (tempflag, cond_string, bp_catch_fork);
}
void
-create_vfork_event_catchpoint (tempflag, cond_string)
- int tempflag;
- char *cond_string;
+create_vfork_event_catchpoint (int tempflag, char *cond_string)
{
create_fork_vfork_event_catchpoint (tempflag, cond_string, bp_catch_vfork);
}
void
-create_exec_event_catchpoint (tempflag, cond_string)
- int tempflag;
- char *cond_string;
+create_exec_event_catchpoint (int tempflag, char *cond_string)
{
struct symtab_and_line sal;
struct breakpoint *b;
}
static int
-hw_breakpoint_used_count ()
+hw_breakpoint_used_count (void)
{
register struct breakpoint *b;
int i = 0;
}
static int
-hw_watchpoint_used_count (type, other_type_used)
- enum bptype type;
- int *other_type_used;
+hw_watchpoint_used_count (enum bptype type, int *other_type_used)
{
register struct breakpoint *b;
int i = 0;
that gets deleted automatically... */
void
-set_longjmp_resume_breakpoint (pc, frame)
- CORE_ADDR pc;
- struct frame_info *frame;
+set_longjmp_resume_breakpoint (CORE_ADDR pc, struct frame_info *frame)
{
register struct breakpoint *b;
}
void
-disable_watchpoints_before_interactive_call_start ()
+disable_watchpoints_before_interactive_call_start (void)
{
struct breakpoint *b;
}
void
-enable_watchpoints_after_interactive_call_stop ()
+enable_watchpoints_after_interactive_call_stop (void)
{
struct breakpoint *b;
Restrict it to frame FRAME if FRAME is nonzero. */
struct breakpoint *
-set_momentary_breakpoint (sal, frame, type)
- struct symtab_and_line sal;
- struct frame_info *frame;
- enum bptype type;
+set_momentary_breakpoint (struct symtab_and_line sal, struct frame_info *frame,
+ enum bptype type)
{
register struct breakpoint *b;
b = set_raw_breakpoint (sal);
/* Tell the user we have just set a breakpoint B. */
static void
-mention (b)
- struct breakpoint *b;
+mention (struct breakpoint *b)
{
int say_where = 0;
+#ifdef UI_OUT
+ struct cleanup *old_chain;
+ struct ui_stream *stb;
+
+ stb = ui_out_stream_new (uiout);
+ old_chain = make_cleanup_ui_out_stream_delete (stb);
+#endif /* UI_OUT */
/* FIXME: This is misplaced; mention() is called by things (like hitting a
watchpoint) other than breakpoint creation. It should be possible to
case bp_none:
printf_filtered ("(apparently deleted?) Eventpoint %d: ", b->number);
break;
+#ifdef UI_OUT
+ case bp_watchpoint:
+ ui_out_text (uiout, "Watchpoint ");
+ ui_out_list_begin (uiout, "wpt");
+ ui_out_field_int (uiout, "number", b->number);
+ ui_out_text (uiout, ": ");
+ print_expression (b->exp, stb->stream);
+ ui_out_field_stream (uiout, "exp", stb);
+ ui_out_list_end (uiout);
+ break;
+ case bp_hardware_watchpoint:
+ ui_out_text (uiout, "Hardware watchpoint ");
+ ui_out_list_begin (uiout, "wpt");
+ ui_out_field_int (uiout, "number", b->number);
+ ui_out_text (uiout, ": ");
+ print_expression (b->exp, stb->stream);
+ ui_out_field_stream (uiout, "exp", stb);
+ ui_out_list_end (uiout);
+ break;
+#else
case bp_watchpoint:
printf_filtered ("Watchpoint %d: ", b->number);
print_expression (b->exp, gdb_stdout);
printf_filtered ("Hardware watchpoint %d: ", b->number);
print_expression (b->exp, gdb_stdout);
break;
+#endif
+#ifdef UI_OUT
+ case bp_read_watchpoint:
+ ui_out_text (uiout, "Hardware read watchpoint ");
+ ui_out_list_begin (uiout, "hw-rwpt");
+ ui_out_field_int (uiout, "number", b->number);
+ ui_out_text (uiout, ": ");
+ print_expression (b->exp, stb->stream);
+ ui_out_field_stream (uiout, "exp", stb);
+ ui_out_list_end (uiout);
+ break;
+ case bp_access_watchpoint:
+ ui_out_text (uiout, "Hardware access (read/write) watchpoint ");
+ ui_out_list_begin (uiout, "hw-awpt");
+ ui_out_field_int (uiout, "number", b->number);
+ ui_out_text (uiout, ": ");
+ print_expression (b->exp, stb->stream);
+ ui_out_field_stream (uiout, "exp", stb);
+ ui_out_list_end (uiout);
+ break;
+#else
case bp_read_watchpoint:
printf_filtered ("Hardware read watchpoint %d: ", b->number);
print_expression (b->exp, gdb_stdout);
b->number);
print_expression (b->exp, gdb_stdout);
break;
+#endif
case bp_breakpoint:
+#ifdef UI_OUT
+ if (interpreter_p && strcmp (interpreter_p, "mi") == 0)
+ {
+ say_where = 0;
+ break;
+ }
+#endif
printf_filtered ("Breakpoint %d", b->number);
say_where = 1;
break;
case bp_hardware_breakpoint:
+#ifdef UI_OUT
+ if (interpreter_p && strcmp (interpreter_p, "mi") == 0)
+ {
+ say_where = 0;
+ break;
+ }
+#endif
printf_filtered ("Hardware assisted breakpoint %d", b->number);
say_where = 1;
break;
TUIDO (((TuiOpaqueFuncPtr) tui_vAllSetHasBreakAt, b, 1));
TUIDO (((TuiOpaqueFuncPtr) tuiUpdateAllExecInfos));
}
+#ifdef UI_OUT
+ do_cleanups (old_chain);
+#endif
+#ifdef UI_OUT
+ if (interpreter_p && strcmp (interpreter_p, "mi") == 0)
+ return;
+#endif
printf_filtered ("\n");
}
\f
second bit : 0 normal breakpoint, 1 hardware breakpoint. */
static void
-break_command_1 (arg, flag, from_tty)
- char *arg;
- int flag, from_tty;
+break_command_1 (char *arg, int flag, int from_tty)
{
int tempflag, hardwareflag;
struct symtabs_and_lines sals;
old_chain = make_cleanup (null_cleanup, 0);
/* Make sure that all storage allocated to SALS gets freed. */
- make_cleanup (free, sals.sals);
+ make_cleanup (xfree, sals.sals);
/* Cleanup the addr_string array but not its contents. */
- make_cleanup (free, addr_string);
+ make_cleanup (xfree, addr_string);
/* Allocate space for all the cond expressions. */
cond = xcalloc (sals.nelts, sizeof (struct expression *));
- make_cleanup (free, cond);
+ make_cleanup (xfree, cond);
/* Allocate space for all the cond strings. */
cond_string = xcalloc (sals.nelts, sizeof (char **));
- make_cleanup (free, cond_string);
+ make_cleanup (xfree, cond_string);
/* ----------------------------- SNIP -----------------------------
Anything added to the cleanup chain beyond this point is assumed
for (i = 0; i < sals.nelts; i++)
{
if (addr_string[i] != NULL)
- make_cleanup (free, addr_string[i]);
+ make_cleanup (xfree, addr_string[i]);
}
/* Resolve all line numbers to PC's and verify that the addresses
{
tok = cond_start = end_tok + 1;
cond[i] = parse_exp_1 (&tok, block_for_pc (sals.sals[i].pc), 0);
- make_cleanup (free, cond[i]);
+ make_cleanup (xfree, cond[i]);
cond_end = tok;
cond_string[i] = savestring (cond_start, cond_end - cond_start);
- make_cleanup (free, cond_string[i]);
+ make_cleanup (xfree, cond_string[i]);
}
else if (toklen >= 1 && strncmp (tok, "thread", toklen) == 0)
{
old_chain = make_cleanup (null_cleanup, 0);
/* Always have a addr_string array, even if it is empty. */
- make_cleanup (free, addr_string);
+ make_cleanup (xfree, addr_string);
/* Make sure that all storage allocated to SALS gets freed. */
- make_cleanup (free, sals.sals);
+ make_cleanup (xfree, sals.sals);
/* Allocate space for all the cond expressions. */
cond = xcalloc (sals.nelts, sizeof (struct expression *));
- make_cleanup (free, cond);
+ make_cleanup (xfree, cond);
/* Allocate space for all the cond strings. */
cond_string = xcalloc (sals.nelts, sizeof (char **));
- make_cleanup (free, cond_string);
+ make_cleanup (xfree, cond_string);
/* ----------------------------- SNIP -----------------------------
Anything added to the cleanup chain beyond this point is assumed
for (i = 0; i < sals.nelts; i++)
{
if (addr_string[i] != NULL)
- make_cleanup (free, addr_string[i]);
+ make_cleanup (xfree, addr_string[i]);
}
/* Wait until now before checking for garbage at the end of the
cond[i] = parse_exp_1 (&tok, block_for_pc (sals.sals[i].pc), 0);
if (*tok != '\0')
error ("Garbage %s follows condition", tok);
- make_cleanup (free, cond[i]);
+ make_cleanup (xfree, cond[i]);
cond_string[i] = xstrdup (args->condition);
}
}
static void
-break_at_finish_at_depth_command_1 (arg, flag, from_tty)
- char *arg;
- int flag;
- int from_tty;
+break_at_finish_at_depth_command_1 (char *arg, int flag, int from_tty)
{
struct frame_info *frame;
CORE_ADDR low, high, selected_pc = 0;
- char *extra_args, *level_arg, *addr_string;
+ char *extra_args = NULL;
+ char *level_arg;
+ char *addr_string;
int extra_args_len = 0, if_arg = 0;
if (!arg ||
else
sprintf (addr_string, "*0x%s", paddr_nz (high));
break_command_1 (addr_string, flag, from_tty);
- free (addr_string);
+ xfree (addr_string);
}
else
error ("No function contains the specified address");
static void
-break_at_finish_command_1 (arg, flag, from_tty)
- char *arg;
- int flag;
- int from_tty;
+break_at_finish_command_1 (char *arg, int flag, int from_tty)
{
char *addr_string, *break_string, *beg_addr_string;
CORE_ADDR low, high;
struct symtabs_and_lines sals;
struct symtab_and_line sal;
struct cleanup *old_chain;
- char *extra_args;
+ char *extra_args = NULL;
int extra_args_len = 0;
int i, if_arg = 0;
sals = decode_line_1 (&addr_string, 1, (struct symtab *) NULL, 0,
(char ***) NULL);
- free (beg_addr_string);
- old_chain = make_cleanup (free, sals.sals);
+ xfree (beg_addr_string);
+ old_chain = make_cleanup (xfree, sals.sals);
for (i = 0; (i < sals.nelts); i++)
{
sal = sals.sals[i];
else
sprintf (break_string, "*0x%s", paddr_nz (high));
break_command_1 (break_string, flag, from_tty);
- free (break_string);
+ xfree (break_string);
}
else
error ("No function contains the specified address");
/* Helper function for break_command_1 and disassemble_command. */
void
-resolve_sal_pc (sal)
- struct symtab_and_line *sal;
+resolve_sal_pc (struct symtab_and_line *sal)
{
CORE_ADDR pc;
}
void
-break_command (arg, from_tty)
- char *arg;
- int from_tty;
+break_command (char *arg, int from_tty)
{
break_command_1 (arg, 0, from_tty);
}
static void
-break_at_finish_command (arg, from_tty)
- char *arg;
- int from_tty;
+break_at_finish_command (char *arg, int from_tty)
{
break_at_finish_command_1 (arg, 0, from_tty);
}
static void
-break_at_finish_at_depth_command (arg, from_tty)
- char *arg;
- int from_tty;
+break_at_finish_at_depth_command (char *arg, int from_tty)
{
break_at_finish_at_depth_command_1 (arg, 0, from_tty);
}
void
-tbreak_command (arg, from_tty)
- char *arg;
- int from_tty;
+tbreak_command (char *arg, int from_tty)
{
break_command_1 (arg, BP_TEMPFLAG, from_tty);
}
static void
-tbreak_at_finish_command (arg, from_tty)
- char *arg;
- int from_tty;
+tbreak_at_finish_command (char *arg, int from_tty)
{
break_at_finish_command_1 (arg, BP_TEMPFLAG, from_tty);
}
static void
-hbreak_command (arg, from_tty)
- char *arg;
- int from_tty;
+hbreak_command (char *arg, int from_tty)
{
break_command_1 (arg, BP_HARDWAREFLAG, from_tty);
}
static void
-thbreak_command (arg, from_tty)
- char *arg;
- int from_tty;
+thbreak_command (char *arg, int from_tty)
{
break_command_1 (arg, (BP_TEMPFLAG | BP_HARDWAREFLAG), from_tty);
}
static void
-stop_command (arg, from_tty)
- char *arg;
- int from_tty;
+stop_command (char *arg, int from_tty)
{
printf_filtered ("Specify the type of breakpoint to set.\n\
Usage: stop in <function | address>\n\
}
static void
-stopin_command (arg, from_tty)
- char *arg;
- int from_tty;
+stopin_command (char *arg, int from_tty)
{
int badInput = 0;
}
static void
-stopat_command (arg, from_tty)
- char *arg;
- int from_tty;
+stopat_command (char *arg, int from_tty)
{
int badInput = 0;
hw_read: watch read,
hw_access: watch access (read or write) */
static void
-watch_command_1 (arg, accessflag, from_tty)
- char *arg;
- int accessflag;
- int from_tty;
+watch_command_1 (char *arg, int accessflag, int from_tty)
{
struct breakpoint *b;
struct symtab_and_line sal;
#endif
static int
-can_use_hardware_watchpoint (v)
- struct value *v;
+can_use_hardware_watchpoint (struct value *v)
{
int found_memory_cnt = 0;
+ struct value *head = v;
/* Did the user specifically forbid us to use hardware watchpoints? */
if (!can_use_hw_watchpoints)
{
/* Ahh, memory we actually used! Check if we can cover
it with hardware watchpoints. */
- CORE_ADDR vaddr = VALUE_ADDRESS (v) + VALUE_OFFSET (v);
- int len = TYPE_LENGTH (VALUE_TYPE (v));
+ struct type *vtype = check_typedef (VALUE_TYPE (v));
+
+ /* We only watch structs and arrays if user asked for it
+ explicitly, never if they just happen to appear in a
+ middle of some value chain. */
+ if (v == head
+ || (TYPE_CODE (vtype) != TYPE_CODE_STRUCT
+ && TYPE_CODE (vtype) != TYPE_CODE_ARRAY))
+ {
+ CORE_ADDR vaddr = VALUE_ADDRESS (v) + VALUE_OFFSET (v);
+ int len = TYPE_LENGTH (VALUE_TYPE (v));
- if (!TARGET_REGION_OK_FOR_HW_WATCHPOINT (vaddr, len))
- return 0;
- else
- found_memory_cnt++;
+ if (!TARGET_REGION_OK_FOR_HW_WATCHPOINT (vaddr, len))
+ return 0;
+ else
+ found_memory_cnt++;
+ }
}
}
else if (v->lval != not_lval && v->modifiable == 0)
return found_memory_cnt;
}
+#ifdef UI_OUT
+void
+watch_command_wrapper (char *arg, int from_tty)
+{
+ watch_command (arg, from_tty);
+}
+#endif
static void
-watch_command (arg, from_tty)
- char *arg;
- int from_tty;
+watch_command (char *arg, int from_tty)
{
watch_command_1 (arg, hw_write, from_tty);
}
+#ifdef UI_OUT
+void
+rwatch_command_wrapper (char *arg, int from_tty)
+{
+ rwatch_command (arg, from_tty);
+}
+#endif
static void
-rwatch_command (arg, from_tty)
- char *arg;
- int from_tty;
+rwatch_command (char *arg, int from_tty)
{
watch_command_1 (arg, hw_read, from_tty);
}
+#ifdef UI_OUT
+void
+awatch_command_wrapper (char *arg, int from_tty)
+{
+ awatch_command (arg, from_tty);
+}
+#endif
static void
-awatch_command (arg, from_tty)
- char *arg;
- int from_tty;
+awatch_command (char *arg, int from_tty)
{
watch_command_1 (arg, hw_access, from_tty);
}
static void
until_break_command_continuation (struct continuation_arg *arg)
{
- /* Do all the exec cleanups, which at this point should only be the
- one set up in the first part of the until_break_command
- function. */
- do_exec_cleanups (ALL_CLEANUPS);
+ struct cleanup *cleanups;
+
+ cleanups = (struct cleanup *) arg->data.pointer;
+ do_exec_cleanups (cleanups);
}
/* ARGSUSED */
void
-until_break_command (arg, from_tty)
- char *arg;
- int from_tty;
+until_break_command (char *arg, int from_tty)
{
struct symtabs_and_lines sals;
struct symtab_and_line sal;
struct frame_info *prev_frame = get_prev_frame (selected_frame);
struct breakpoint *breakpoint;
struct cleanup *old_chain;
+ struct continuation_arg *arg1;
+
clear_proceed_status ();
error ("Couldn't get information on specified line.");
sal = sals.sals[0];
- free ((PTR) sals.sals); /* malloc'd, so freed */
+ xfree (sals.sals); /* malloc'd, so freed */
if (*arg)
error ("Junk at end of arguments.");
breakpoint = set_momentary_breakpoint (sal, selected_frame, bp_until);
if (!event_loop_p || !target_can_async_p ())
- old_chain = make_cleanup ((make_cleanup_func) delete_breakpoint,
- breakpoint);
+ old_chain = make_cleanup_delete_breakpoint (breakpoint);
else
- make_exec_cleanup ((make_cleanup_func) delete_breakpoint, breakpoint);
+ old_chain = make_exec_cleanup_delete_breakpoint (breakpoint);
/* If we are running asynchronously, and the target supports async
execution, we are not waiting for the target to stop, in the call
if (event_loop_p && target_can_async_p ())
{
- /* In this case we don't need args for the continuation, because
- all it needs to do is do the cleanups in the
- exec_cleanup_chain, which will be only those inserted by this
- function. We can get away by using ALL_CLEANUPS. */
- add_continuation (until_break_command_continuation, NULL);
+ /* In this case the arg for the continuation is just the point
+ in the exec_cleanups chain from where to start doing
+ cleanups, because all the continuation does is the cleanups in
+ the exec_cleanup_chain. */
+ arg1 =
+ (struct continuation_arg *) xmalloc (sizeof (struct continuation_arg));
+ arg1->next = NULL;
+ arg1->data.pointer = old_chain;
+
+ add_continuation (until_break_command_continuation, arg1);
}
/* Keep within the current frame */
sal.pc = prev_frame->pc;
breakpoint = set_momentary_breakpoint (sal, prev_frame, bp_until);
if (!event_loop_p || !target_can_async_p ())
- make_cleanup ((make_cleanup_func) delete_breakpoint, breakpoint);
+ make_cleanup_delete_breakpoint (breakpoint);
else
- make_exec_cleanup ((make_cleanup_func) delete_breakpoint, breakpoint);
+ make_exec_cleanup_delete_breakpoint (breakpoint);
}
proceed (-1, TARGET_SIGNAL_DEFAULT, 0);
/* These aren't used; I don't konw what they were for. */
/* Set a breakpoint at the catch clause for NAME. */
static int
-catch_breakpoint (name)
- char *name;
+catch_breakpoint (char *name)
{
}
static int
-disable_catch_breakpoint ()
+disable_catch_breakpoint (void)
{
}
static int
-delete_catch_breakpoint ()
+delete_catch_breakpoint (void)
{
}
static int
-enable_catch_breakpoint ()
+enable_catch_breakpoint (void)
{
}
#endif /* 0 */
/* For each catch clause identified in ARGS, run FUNCTION
with that clause as an argument. */
static struct symtabs_and_lines
-map_catch_names (args, function)
- char *args;
- int (*function) ();
+map_catch_names (char *args, int (*function) ())
{
register char *p = args;
register char *p1;
/* This shares a lot of code with `print_frame_label_vars' from stack.c. */
static struct symtabs_and_lines
-get_catch_sals (this_level_only)
- int this_level_only;
+get_catch_sals (int this_level_only)
{
register struct blockvector *bl;
register struct block *block;
}
static void
-ep_skip_leading_whitespace (s)
- char **s;
+ep_skip_leading_whitespace (char **s)
{
if ((s == NULL) || (*s == NULL))
return;
the token is returned. Else, NULL is returned. */
static char *
-ep_find_event_name_end (arg)
- char *arg;
+ep_find_event_name_end (char *arg)
{
char *s = arg;
char *event_name_end = NULL;
if clause in the arg string. */
static char *
-ep_parse_optional_if_clause (arg)
- char **arg;
+ep_parse_optional_if_clause (char **arg)
{
char *cond_string;
Note that clients needing to preserve the returned filename for
future access should copy it to their own buffers. */
static char *
-ep_parse_optional_filename (arg)
- char **arg;
+ep_parse_optional_filename (char **arg)
{
static char filename[1024];
char *arg_p = *arg;
catch_fork_kind;
#if defined(CHILD_INSERT_FORK_CATCHPOINT) || defined(CHILD_INSERT_VFORK_CATCHPOINT)
-static void catch_fork_command_1 PARAMS ((catch_fork_kind fork_kind,
- char *arg,
- int tempflag,
- int from_tty));
+static void catch_fork_command_1 (catch_fork_kind fork_kind,
+ char *arg, int tempflag, int from_tty);
static void
-catch_fork_command_1 (fork_kind, arg, tempflag, from_tty)
- catch_fork_kind fork_kind;
- char *arg;
- int tempflag;
- int from_tty;
+catch_fork_command_1 (catch_fork_kind fork_kind, char *arg, int tempflag,
+ int from_tty)
{
char *cond_string = NULL;
#if defined(CHILD_INSERT_EXEC_CATCHPOINT)
static void
-catch_exec_command_1 (arg, tempflag, from_tty)
- char *arg;
- int tempflag;
- int from_tty;
+catch_exec_command_1 (char *arg, int tempflag, int from_tty)
{
char *cond_string = NULL;
#if defined(SOLIB_ADD)
static void
-catch_load_command_1 (arg, tempflag, from_tty)
- char *arg;
- int tempflag;
- int from_tty;
+catch_load_command_1 (char *arg, int tempflag, int from_tty)
{
char *dll_pathname = NULL;
char *cond_string = NULL;
}
static void
-catch_unload_command_1 (arg, tempflag, from_tty)
- char *arg;
- int tempflag;
- int from_tty;
+catch_unload_command_1 (char *arg, int tempflag, int from_tty)
{
char *dll_pathname = NULL;
char *cond_string = NULL;
exception event callback */
static void
-create_exception_catchpoint (tempflag, cond_string, ex_event, sal)
- int tempflag;
- char *cond_string;
- enum exception_event_kind ex_event;
- struct symtab_and_line *sal;
+create_exception_catchpoint (int tempflag, char *cond_string,
+ enum exception_event_kind ex_event,
+ struct symtab_and_line *sal)
{
struct breakpoint *b;
int thread = -1; /* All threads. */
/* Deal with "catch catch" and "catch throw" commands */
static void
-catch_exception_command_1 (ex_event, arg, tempflag, from_tty)
- enum exception_event_kind ex_event;
- char *arg;
- int tempflag;
- int from_tty;
+catch_exception_command_1 (enum exception_event_kind ex_event, char *arg,
+ int tempflag, int from_tty)
{
char *cond_string = NULL;
struct symtab_and_line *sal = NULL;
inside a catch_errors */
static int
-cover_target_enable_exception_callback (arg)
- PTR arg;
+cover_target_enable_exception_callback (PTR arg)
{
args_for_catchpoint_enable *args = arg;
struct symtab_and_line *sal;
static void
-handle_gnu_4_16_catch_command (arg, tempflag, from_tty)
- char *arg;
- int tempflag;
- int from_tty;
+handle_gnu_4_16_catch_command (char *arg, int tempflag, int from_tty)
{
/* First, translate ARG into something we can deal with in terms
of breakpoints. */
warning ("Multiple breakpoints were set.");
warning ("Use the \"delete\" command to delete unwanted breakpoints.");
}
- free ((PTR) sals.sals);
+ xfree (sals.sals);
}
#if 0
/* This creates a temporary internal breakpoint
just to placate infrun */
static struct breakpoint *
-create_temp_exception_breakpoint (pc)
- CORE_ADDR pc;
+create_temp_exception_breakpoint (CORE_ADDR pc)
{
struct symtab_and_line sal;
struct breakpoint *b;
#endif
static void
-catch_command_1 (arg, tempflag, from_tty)
- char *arg;
- int tempflag;
- int from_tty;
+catch_command_1 (char *arg, int tempflag, int from_tty)
{
/* The first argument may be an event name, such as "start" or "load".
/* Used by the gui, could be made a worker for other things. */
struct breakpoint *
-set_breakpoint_sal (sal)
- struct symtab_and_line sal;
+set_breakpoint_sal (struct symtab_and_line sal)
{
struct breakpoint *b;
b = set_raw_breakpoint (sal);
/* These aren't used; I don't know what they were for. */
/* Disable breakpoints on all catch clauses described in ARGS. */
static void
-disable_catch (args)
- char *args;
+disable_catch (char *args)
{
/* Map the disable command to catch clauses described in ARGS. */
}
/* Enable breakpoints on all catch clauses described in ARGS. */
static void
-enable_catch (args)
- char *args;
+enable_catch (char *args)
{
/* Map the disable command to catch clauses described in ARGS. */
}
/* Delete breakpoints on all catch clauses in the active scope. */
static void
-delete_catch (args)
- char *args;
+delete_catch (char *args)
{
/* Map the delete command to catch clauses described in ARGS. */
}
#endif /* 0 */
static void
-catch_command (arg, from_tty)
- char *arg;
- int from_tty;
+catch_command (char *arg, int from_tty)
{
catch_command_1 (arg, 0, from_tty);
}
\f
static void
-tcatch_command (arg, from_tty)
- char *arg;
- int from_tty;
+tcatch_command (char *arg, int from_tty)
{
catch_command_1 (arg, 1, from_tty);
}
static void
-clear_command (arg, from_tty)
- char *arg;
- int from_tty;
+clear_command (char *arg, int from_tty)
{
register struct breakpoint *b, *b1;
int default_match;
if (from_tty)
putchar_unfiltered ('\n');
}
- free ((PTR) sals.sals);
+ xfree (sals.sals);
}
\f
/* Delete breakpoint in BS if they are `delete' breakpoints and
This is called after any breakpoint is hit, or after errors. */
void
-breakpoint_auto_delete (bs)
- bpstat bs;
+breakpoint_auto_delete (bpstat bs)
{
struct breakpoint *b, *temp;
structures. */
void
-delete_breakpoint (bpt)
- struct breakpoint *bpt;
+delete_breakpoint (struct breakpoint *bpt)
{
register struct breakpoint *b;
register bpstat bs;
free_command_lines (&bpt->commands);
if (bpt->cond)
- free (bpt->cond);
+ xfree (bpt->cond);
if (bpt->cond_string != NULL)
- free (bpt->cond_string);
+ xfree (bpt->cond_string);
if (bpt->addr_string != NULL)
- free (bpt->addr_string);
+ xfree (bpt->addr_string);
if (bpt->exp != NULL)
- free (bpt->exp);
+ xfree (bpt->exp);
if (bpt->exp_string != NULL)
- free (bpt->exp_string);
+ xfree (bpt->exp_string);
if (bpt->val != NULL)
value_free (bpt->val);
if (bpt->source_file != NULL)
- free (bpt->source_file);
+ xfree (bpt->source_file);
if (bpt->dll_pathname != NULL)
- free (bpt->dll_pathname);
+ xfree (bpt->dll_pathname);
if (bpt->triggered_dll_pathname != NULL)
- free (bpt->triggered_dll_pathname);
+ xfree (bpt->triggered_dll_pathname);
if (bpt->exec_pathname != NULL)
- free (bpt->exec_pathname);
+ xfree (bpt->exec_pathname);
/* Be sure no bpstat's are pointing at it after it's been freed. */
/* FIXME, how can we find all bpstat's?
bp, we mark it as deleted before freeing its storage. */
bpt->type = bp_none;
- free ((PTR) bpt);
+ xfree (bpt);
+}
+
+static void
+do_delete_breakpoint_cleanup (void *b)
+{
+ delete_breakpoint (b);
+}
+
+struct cleanup *
+make_cleanup_delete_breakpoint (struct breakpoint *b)
+{
+ return make_cleanup (do_delete_breakpoint_cleanup, b);
+}
+
+struct cleanup *
+make_exec_cleanup_delete_breakpoint (struct breakpoint *b)
+{
+ return make_exec_cleanup (do_delete_breakpoint_cleanup, b);
}
void
-delete_command (arg, from_tty)
- char *arg;
- int from_tty;
+delete_command (char *arg, int from_tty)
{
struct breakpoint *b, *temp;
Unused in this case. */
static int
-breakpoint_re_set_one (bint)
- PTR bint;
+breakpoint_re_set_one (PTR bint)
{
/* get past catch_errs */
struct breakpoint *b = (struct breakpoint *) bint;
{
s = b->cond_string;
if (b->cond)
- free ((PTR) b->cond);
+ xfree (b->cond);
b->cond = parse_exp_1 (&s, block_for_pc (sals.sals[i].pc), 0);
}
)
{
if (b->source_file != NULL)
- free (b->source_file);
+ xfree (b->source_file);
if (sals.sals[i].symtab == NULL)
b->source_file = NULL;
else
check_duplicates (b->address, b->section);
}
- free ((PTR) sals.sals);
+ xfree (sals.sals);
break;
case bp_watchpoint:
/* So for now, just use a global context. */
if (b->exp)
- free ((PTR) b->exp);
+ xfree (b->exp);
b->exp = parse_expression (b->exp_string);
b->exp_valid_block = innermost_block;
mark = value_mark ();
{
s = b->cond_string;
if (b->cond)
- free ((PTR) b->cond);
+ xfree (b->cond);
b->cond = parse_exp_1 (&s, (struct block *) 0, 0);
}
if (b->enable == enabled)
/* Re-set all breakpoints after symbols have been re-loaded. */
void
-breakpoint_re_set ()
+breakpoint_re_set (void)
{
struct breakpoint *b, *temp;
enum language save_language;
- If the breakpoint is for all threads, leave it as-is.
- Else, reset it to the current thread for inferior_pid. */
void
-breakpoint_re_set_thread (b)
- struct breakpoint *b;
+breakpoint_re_set_thread (struct breakpoint *b)
{
if (b->thread != -1)
{
}
void
-set_ignore_count (bptnum, count, from_tty)
- int bptnum, count, from_tty;
+set_ignore_count (int bptnum, int count, int from_tty)
{
register struct breakpoint *b;
/* Clear the ignore counts of all breakpoints. */
void
-breakpoint_clear_ignore_counts ()
+breakpoint_clear_ignore_counts (void)
{
struct breakpoint *b;
/* Command to set ignore-count of breakpoint N to COUNT. */
static void
-ignore_command (args, from_tty)
- char *args;
- int from_tty;
+ignore_command (char *args, int from_tty)
{
char *p = args;
register int num;
whose numbers are given in ARGS. */
static void
-map_breakpoint_numbers (args, function)
- char *args;
- void (*function) PARAMS ((struct breakpoint *));
+map_breakpoint_numbers (char *args, void (*function) (struct breakpoint *))
{
register char *p = args;
char *p1;
}
void
-disable_breakpoint (bpt)
- struct breakpoint *bpt;
+disable_breakpoint (struct breakpoint *bpt)
{
/* Never disable a watchpoint scope breakpoint; we want to
hit them when we leave scope so we can delete both the
/* ARGSUSED */
static void
-disable_command (args, from_tty)
- char *args;
- int from_tty;
+disable_command (char *args, int from_tty)
{
register struct breakpoint *bpt;
if (args == 0)
}
static void
-do_enable_breakpoint (bpt, disposition)
- struct breakpoint *bpt;
- enum bpdisp disposition;
+do_enable_breakpoint (struct breakpoint *bpt, enum bpdisp disposition)
{
struct frame_info *save_selected_frame = NULL;
int save_selected_frame_level = -1;
}
if (save_selected_frame_level >= 0)
- select_and_print_frame (save_selected_frame,
- save_selected_frame_level);
+ select_frame (save_selected_frame, save_selected_frame_level);
value_free_to_mark (mark);
}
if (modify_breakpoint_hook)
}
void
-enable_breakpoint (bpt)
- struct breakpoint *bpt;
+enable_breakpoint (struct breakpoint *bpt)
{
do_enable_breakpoint (bpt, bpt->disposition);
}
/* ARGSUSED */
static void
-enable_command (args, from_tty)
- char *args;
- int from_tty;
+enable_command (char *args, int from_tty)
{
register struct breakpoint *bpt;
if (args == 0)
}
static void
-enable_once_breakpoint (bpt)
- struct breakpoint *bpt;
+enable_once_breakpoint (struct breakpoint *bpt)
{
do_enable_breakpoint (bpt, disable);
}
/* ARGSUSED */
static void
-enable_once_command (args, from_tty)
- char *args;
- int from_tty;
+enable_once_command (char *args, int from_tty)
{
map_breakpoint_numbers (args, enable_once_breakpoint);
}
static void
-enable_delete_breakpoint (bpt)
- struct breakpoint *bpt;
+enable_delete_breakpoint (struct breakpoint *bpt)
{
do_enable_breakpoint (bpt, del);
}
/* ARGSUSED */
static void
-enable_delete_command (args, from_tty)
- char *args;
- int from_tty;
+enable_delete_command (char *args, int from_tty)
{
map_breakpoint_numbers (args, enable_delete_breakpoint);
}
/* Use default_breakpoint_'s, or nothing if they aren't valid. */
struct symtabs_and_lines
-decode_line_spec_1 (string, funfirstline)
- char *string;
- int funfirstline;
+decode_line_spec_1 (char *string, int funfirstline)
{
struct symtabs_and_lines sals;
if (string == 0)
}
\f
void
-_initialize_breakpoint ()
+_initialize_breakpoint (void)
{
struct cmd_list_element *c;