aboutsummaryrefslogtreecommitdiff
path: root/gdb/breakpoint.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/breakpoint.c')
-rw-r--r--gdb/breakpoint.c303
1 files changed, 202 insertions, 101 deletions
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 710a792..cb4c3d7 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -20,6 +20,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
+#include "arch-utils.h"
#include <ctype.h>
#include "hashtab.h"
#include "symtab.h"
@@ -104,13 +105,16 @@ static void break_command_1 (char *, int, int);
static void mention (struct breakpoint *);
-struct breakpoint *set_raw_breakpoint (struct symtab_and_line, enum bptype);
+static struct breakpoint *set_raw_breakpoint (struct gdbarch *gdbarch,
+ struct symtab_and_line,
+ enum bptype);
static void check_duplicates (struct breakpoint *);
static void breakpoint_adjustment_warning (CORE_ADDR, CORE_ADDR, int, int);
-static CORE_ADDR adjust_breakpoint_address (CORE_ADDR bpaddr,
+static CORE_ADDR adjust_breakpoint_address (struct gdbarch *gdbarch,
+ CORE_ADDR bpaddr,
enum bptype bptype);
static void describe_other_breakpoints (CORE_ADDR, struct obj_section *, int);
@@ -1005,6 +1009,7 @@ update_watchpoint (struct breakpoint *b, int reparse)
for (tmp = &(b->loc); *tmp != NULL; tmp = &((*tmp)->next))
;
*tmp = loc;
+ loc->gdbarch = get_type_arch (value_type (v));
loc->address = addr;
loc->length = len;
loc->watchpoint_type = type;
@@ -1147,9 +1152,11 @@ Note: automatically using hardware breakpoints for read-only addresses.\n"));
/* No overlay handling: just set the breakpoint. */
if (bpt->loc_type == bp_loc_hardware_breakpoint)
- val = target_insert_hw_breakpoint (&bpt->target_info);
+ val = target_insert_hw_breakpoint (bpt->gdbarch,
+ &bpt->target_info);
else
- val = target_insert_breakpoint (&bpt->target_info);
+ val = target_insert_breakpoint (bpt->gdbarch,
+ &bpt->target_info);
}
else
{
@@ -1170,7 +1177,8 @@ Note: automatically using hardware breakpoints for read-only addresses.\n"));
/* Set a software (trap) breakpoint at the LMA. */
bpt->overlay_target_info = bpt->target_info;
bpt->overlay_target_info.placed_address = addr;
- val = target_insert_breakpoint (&bpt->overlay_target_info);
+ val = target_insert_breakpoint (bpt->gdbarch,
+ &bpt->overlay_target_info);
if (val != 0)
fprintf_unfiltered (tmp_error_stream,
"Overlay breakpoint %d failed: in ROM?\n",
@@ -1182,9 +1190,11 @@ Note: automatically using hardware breakpoints for read-only addresses.\n"));
{
/* Yes. This overlay section is mapped into memory. */
if (bpt->loc_type == bp_loc_hardware_breakpoint)
- val = target_insert_hw_breakpoint (&bpt->target_info);
+ val = target_insert_hw_breakpoint (bpt->gdbarch,
+ &bpt->target_info);
else
- val = target_insert_breakpoint (&bpt->target_info);
+ val = target_insert_breakpoint (bpt->gdbarch,
+ &bpt->target_info);
}
else
{
@@ -1458,7 +1468,8 @@ reattach_breakpoints (int pid)
static int internal_breakpoint_number = -1;
static struct breakpoint *
-create_internal_breakpoint (CORE_ADDR address, enum bptype type)
+create_internal_breakpoint (struct gdbarch *gdbarch,
+ CORE_ADDR address, enum bptype type)
{
struct symtab_and_line sal;
struct breakpoint *b;
@@ -1468,7 +1479,7 @@ create_internal_breakpoint (CORE_ADDR address, enum bptype type)
sal.pc = address;
sal.section = find_pc_overlay (sal.pc);
- b = set_raw_breakpoint (sal, type);
+ b = set_raw_breakpoint (gdbarch, sal, type);
b->number = internal_breakpoint_number--;
b->disposition = disp_donttouch;
@@ -1489,7 +1500,8 @@ create_overlay_event_breakpoint (char *func_name)
if (m == NULL)
continue;
- b = create_internal_breakpoint (SYMBOL_VALUE_ADDRESS (m),
+ b = create_internal_breakpoint (get_objfile_arch (objfile),
+ SYMBOL_VALUE_ADDRESS (m),
bp_overlay_event);
b->addr_string = xstrdup (func_name);
@@ -1524,7 +1536,8 @@ create_longjmp_master_breakpoint (char *func_name)
if (m == NULL)
continue;
- b = create_internal_breakpoint (SYMBOL_VALUE_ADDRESS (m),
+ b = create_internal_breakpoint (get_objfile_arch (objfile),
+ SYMBOL_VALUE_ADDRESS (m),
bp_longjmp_master);
b->addr_string = xstrdup (func_name);
b->enable_state = bp_disabled;
@@ -1696,9 +1709,9 @@ remove_breakpoint (struct bp_location *b, insertion_state_t is)
/* No overlay handling: just remove the breakpoint. */
if (b->loc_type == bp_loc_hardware_breakpoint)
- val = target_remove_hw_breakpoint (&b->target_info);
+ val = target_remove_hw_breakpoint (b->gdbarch, &b->target_info);
else
- val = target_remove_breakpoint (&b->target_info);
+ val = target_remove_breakpoint (b->gdbarch, &b->target_info);
}
else
{
@@ -1712,9 +1725,11 @@ remove_breakpoint (struct bp_location *b, insertion_state_t is)
/* Ignore any failures: if the LMA is in ROM, we will
have already warned when we failed to insert it. */
if (b->loc_type == bp_loc_hardware_breakpoint)
- target_remove_hw_breakpoint (&b->overlay_target_info);
+ target_remove_hw_breakpoint (b->gdbarch,
+ &b->overlay_target_info);
else
- target_remove_breakpoint (&b->overlay_target_info);
+ target_remove_breakpoint (b->gdbarch,
+ &b->overlay_target_info);
}
/* Did we set a breakpoint at the VMA?
If so, we will have marked the breakpoint 'inserted'. */
@@ -1725,13 +1740,15 @@ remove_breakpoint (struct bp_location *b, insertion_state_t is)
unmapped, but let's not rely on that being safe. We
don't know what the overlay manager might do. */
if (b->loc_type == bp_loc_hardware_breakpoint)
- val = target_remove_hw_breakpoint (&b->target_info);
+ val = target_remove_hw_breakpoint (b->gdbarch,
+ &b->target_info);
/* However, we should remove *software* breakpoints only
if the section is still mapped, or else we overwrite
wrong code with the saved shadow contents. */
else if (section_is_mapped (b->section))
- val = target_remove_breakpoint (&b->target_info);
+ val = target_remove_breakpoint (b->gdbarch,
+ &b->target_info);
else
val = 0;
}
@@ -3541,7 +3558,8 @@ static void
print_one_breakpoint_location (struct breakpoint *b,
struct bp_location *loc,
int loc_number,
- CORE_ADDR *last_addr)
+ struct bp_location **last_loc,
+ int print_address_bits)
{
struct command_line *l;
struct symbol *sym;
@@ -3650,7 +3668,7 @@ print_one_breakpoint_location (struct breakpoint *b,
strcpy (wrap_indent, " ");
if (opts.addressprint)
{
- if (gdbarch_addr_bit (current_gdbarch) <= 32)
+ if (print_address_bits <= 32)
strcat (wrap_indent, " ");
else
strcat (wrap_indent, " ");
@@ -3663,7 +3681,7 @@ print_one_breakpoint_location (struct breakpoint *b,
to get any nice result. So, make sure there's
just one location. */
gdb_assert (b->loc == NULL || b->loc->next == NULL);
- b->ops->print_one (b, last_addr);
+ b->ops->print_one (b, last_loc);
}
else
switch (b->type)
@@ -3714,7 +3732,7 @@ print_one_breakpoint_location (struct breakpoint *b,
if (!header_of_multiple)
print_breakpoint_location (b, loc, wrap_indent, stb);
if (b->loc)
- *last_addr = b->loc->address;
+ *last_loc = b->loc;
break;
}
@@ -3850,9 +3868,9 @@ print_one_breakpoint_location (struct breakpoint *b,
static void
print_one_breakpoint (struct breakpoint *b,
- CORE_ADDR *last_addr)
+ struct bp_location **last_loc, int print_address_bits)
{
- print_one_breakpoint_location (b, NULL, 0, last_addr);
+ print_one_breakpoint_location (b, NULL, 0, last_loc, print_address_bits);
/* If this breakpoint has custom print function,
it's already printed. Otherwise, print individual
@@ -3875,11 +3893,27 @@ print_one_breakpoint (struct breakpoint *b,
struct bp_location *loc;
int n = 1;
for (loc = b->loc; loc; loc = loc->next, ++n)
- print_one_breakpoint_location (b, loc, n, last_addr);
+ print_one_breakpoint_location (b, loc, n, last_loc,
+ print_address_bits);
}
}
}
+static int
+breakpoint_address_bits (struct breakpoint *b)
+{
+ int print_address_bits = 0;
+ struct bp_location *loc;
+
+ for (loc = b->loc; loc; loc = loc->next)
+ {
+ int addr_bit = gdbarch_addr_bit (b->gdbarch);
+ if (addr_bit > print_address_bits)
+ print_address_bits = addr_bit;
+ }
+
+ return print_address_bits;
+}
struct captured_breakpoint_query_args
{
@@ -3891,12 +3925,13 @@ do_captured_breakpoint_query (struct ui_out *uiout, void *data)
{
struct captured_breakpoint_query_args *args = data;
struct breakpoint *b;
- CORE_ADDR dummy_addr = 0;
+ struct bp_location *dummy_loc = NULL;
ALL_BREAKPOINTS (b)
{
if (args->bnum == b->number)
{
- print_one_breakpoint (b, &dummy_addr);
+ int print_address_bits = breakpoint_address_bits (b);
+ print_one_breakpoint (b, &dummy_loc, print_address_bits);
return GDB_RC_OK;
}
}
@@ -3941,21 +3976,29 @@ static void
breakpoint_1 (int bnum, int allflag)
{
struct breakpoint *b;
- CORE_ADDR last_addr = (CORE_ADDR) -1;
+ struct bp_location *last_loc = NULL;
int nr_printable_breakpoints;
struct cleanup *bkpttbl_chain;
struct value_print_options opts;
+ int print_address_bits = 0;
get_user_print_options (&opts);
- /* Compute the number of rows in the table. */
+ /* Compute the number of rows in the table, as well as the
+ size required for address fields. */
nr_printable_breakpoints = 0;
ALL_BREAKPOINTS (b)
if (bnum == -1
|| bnum == b->number)
{
if (allflag || user_settable_breakpoint (b))
- nr_printable_breakpoints++;
+ {
+ int addr_bit = breakpoint_address_bits (b);
+ if (addr_bit > print_address_bits)
+ print_address_bits = addr_bit;
+
+ nr_printable_breakpoints++;
+ }
}
if (opts.addressprint)
@@ -3985,7 +4028,7 @@ breakpoint_1 (int bnum, int allflag)
{
if (nr_printable_breakpoints > 0)
annotate_field (4);
- if (gdbarch_addr_bit (current_gdbarch) <= 32)
+ if (print_address_bits <= 32)
ui_out_table_header (uiout, 10, ui_left, "addr", "Address");/* 5 */
else
ui_out_table_header (uiout, 18, ui_left, "addr", "Address");/* 5 */
@@ -4004,7 +4047,7 @@ breakpoint_1 (int bnum, int allflag)
/* We only print out user settable breakpoints unless the
allflag is set. */
if (allflag || user_settable_breakpoint (b))
- print_one_breakpoint (b, &last_addr);
+ print_one_breakpoint (b, &last_loc, print_address_bits);
}
do_cleanups (bkpttbl_chain);
@@ -4019,10 +4062,8 @@ breakpoint_1 (int bnum, int allflag)
}
else
{
- /* Compare against (CORE_ADDR)-1 in case some compiler decides
- that a comparison of an unsigned with -1 is always false. */
- if (last_addr != (CORE_ADDR) -1 && !server_command)
- set_next_address (current_gdbarch, last_addr);
+ if (last_loc && !server_command)
+ set_next_address (last_loc->gdbarch, last_loc->address);
}
/* FIXME? Should this be moved up so that it is only called when
@@ -4251,9 +4292,10 @@ breakpoint_adjustment_warning (CORE_ADDR from_addr, CORE_ADDR to_addr,
this function is simply the identity function. */
static CORE_ADDR
-adjust_breakpoint_address (CORE_ADDR bpaddr, enum bptype bptype)
+adjust_breakpoint_address (struct gdbarch *gdbarch,
+ CORE_ADDR bpaddr, enum bptype bptype)
{
- if (!gdbarch_adjust_breakpoint_address_p (current_gdbarch))
+ if (!gdbarch_adjust_breakpoint_address_p (gdbarch))
{
/* Very few targets need any kind of breakpoint adjustment. */
return bpaddr;
@@ -4274,8 +4316,7 @@ adjust_breakpoint_address (CORE_ADDR bpaddr, enum bptype bptype)
/* Some targets have architectural constraints on the placement
of breakpoint instructions. Obtain the adjusted address. */
- adjusted_bpaddr = gdbarch_adjust_breakpoint_address (current_gdbarch,
- bpaddr);
+ adjusted_bpaddr = gdbarch_adjust_breakpoint_address (gdbarch, bpaddr);
/* An adjusted breakpoint address can significantly alter
a user's expectations. Print a warning if an adjustment
@@ -4353,7 +4394,8 @@ static void free_bp_location (struct bp_location *loc)
that has type BPTYPE and has no locations as yet. */
static struct breakpoint *
-set_raw_breakpoint_without_location (enum bptype bptype)
+set_raw_breakpoint_without_location (struct gdbarch *gdbarch,
+ enum bptype bptype)
{
struct breakpoint *b, *b1;
@@ -4361,6 +4403,7 @@ set_raw_breakpoint_without_location (enum bptype bptype)
memset (b, 0, sizeof (*b));
b->type = bptype;
+ b->gdbarch = gdbarch;
b->language = current_language->la_language;
b->input_radix = input_radix;
b->thread = -1;
@@ -4406,6 +4449,18 @@ set_breakpoint_location_function (struct bp_location *loc)
}
}
+/* Attempt to determine architecture of location identified by SAL. */
+static struct gdbarch *
+get_sal_arch (struct symtab_and_line sal)
+{
+ if (sal.section)
+ return get_objfile_arch (sal.section->objfile);
+ if (sal.symtab)
+ return get_objfile_arch (sal.symtab->objfile);
+
+ return NULL;
+}
+
/* set_raw_breakpoint is a low level routine for allocating and
partially initializing a breakpoint of type BPTYPE. The newly
created breakpoint's address, section, source file name, and line
@@ -4421,11 +4476,17 @@ set_breakpoint_location_function (struct bp_location *loc)
prior to completing the initialization of the breakpoint. If this
should happen, a bogus breakpoint will be left on the chain. */
-struct breakpoint *
-set_raw_breakpoint (struct symtab_and_line sal, enum bptype bptype)
+static struct breakpoint *
+set_raw_breakpoint (struct gdbarch *gdbarch,
+ struct symtab_and_line sal, enum bptype bptype)
{
- struct breakpoint *b = set_raw_breakpoint_without_location (bptype);
+ struct breakpoint *b = set_raw_breakpoint_without_location (gdbarch, bptype);
CORE_ADDR adjusted_address;
+ struct gdbarch *loc_gdbarch;
+
+ loc_gdbarch = get_sal_arch (sal);
+ if (!loc_gdbarch)
+ loc_gdbarch = b->gdbarch;
/* Adjust the breakpoint's address prior to allocating a location.
Once we call allocate_bp_location(), that mostly uninitialized
@@ -4433,9 +4494,10 @@ set_raw_breakpoint (struct symtab_and_line sal, enum bptype bptype)
breakpoint may cause target_read_memory() to be called and we do
not want its scan of the location chain to find a breakpoint and
location that's only been partially initialized. */
- adjusted_address = adjust_breakpoint_address (sal.pc, b->type);
+ adjusted_address = adjust_breakpoint_address (loc_gdbarch, sal.pc, b->type);
b->loc = allocate_bp_location (b);
+ b->loc->gdbarch = loc_gdbarch;
b->loc->requested_address = sal.pc;
b->loc->address = adjusted_address;
@@ -4536,11 +4598,11 @@ disable_overlay_breakpoints (void)
}
struct breakpoint *
-create_thread_event_breakpoint (CORE_ADDR address)
+create_thread_event_breakpoint (struct gdbarch *gdbarch, CORE_ADDR address)
{
struct breakpoint *b;
- b = create_internal_breakpoint (address, bp_thread_event);
+ b = create_internal_breakpoint (gdbarch, address, bp_thread_event);
b->enable_state = bp_enabled;
/* addr_string has to be used or breakpoint_re_set will delete me. */
@@ -4587,11 +4649,11 @@ remove_solib_event_breakpoints (void)
}
struct breakpoint *
-create_solib_event_breakpoint (CORE_ADDR address)
+create_solib_event_breakpoint (struct gdbarch *gdbarch, CORE_ADDR address)
{
struct breakpoint *b;
- b = create_internal_breakpoint (address, bp_shlib_event);
+ b = create_internal_breakpoint (gdbarch, address, bp_shlib_event);
update_global_location_list_nothrow (1);
return b;
}
@@ -4711,7 +4773,7 @@ print_it_catch_fork (struct breakpoint *b)
/* Implement the "print_one" breakpoint_ops method for fork catchpoints. */
static void
-print_one_catch_fork (struct breakpoint *b, CORE_ADDR *last_addr)
+print_one_catch_fork (struct breakpoint *b, struct bp_location **last_loc)
{
struct value_print_options opts;
@@ -4793,7 +4855,7 @@ print_it_catch_vfork (struct breakpoint *b)
/* Implement the "print_one" breakpoint_ops method for vfork catchpoints. */
static void
-print_one_catch_vfork (struct breakpoint *b, CORE_ADDR *last_addr)
+print_one_catch_vfork (struct breakpoint *b, struct bp_location **last_loc)
{
struct value_print_options opts;
@@ -4843,8 +4905,8 @@ static struct breakpoint_ops catch_vfork_breakpoint_ops =
to the catchpoint. */
static struct breakpoint *
-create_catchpoint (int tempflag, char *cond_string,
- struct breakpoint_ops *ops)
+create_catchpoint (struct gdbarch *gdbarch, int tempflag,
+ char *cond_string, struct breakpoint_ops *ops)
{
struct symtab_and_line sal;
struct breakpoint *b;
@@ -4854,7 +4916,7 @@ create_catchpoint (int tempflag, char *cond_string,
sal.symtab = NULL;
sal.line = 0;
- b = set_raw_breakpoint (sal, bp_catchpoint);
+ b = set_raw_breakpoint (gdbarch, sal, bp_catchpoint);
set_breakpoint_count (breakpoint_count + 1);
b->number = breakpoint_count;
@@ -4872,10 +4934,12 @@ create_catchpoint (int tempflag, char *cond_string,
}
static void
-create_fork_vfork_event_catchpoint (int tempflag, char *cond_string,
+create_fork_vfork_event_catchpoint (struct gdbarch *gdbarch,
+ int tempflag, char *cond_string,
struct breakpoint_ops *ops)
{
- struct breakpoint *b = create_catchpoint (tempflag, cond_string, ops);
+ struct breakpoint *b
+ = create_catchpoint (gdbarch, tempflag, cond_string, ops);
/* FIXME: We should put this information in a breakpoint private data
area. */
@@ -4912,7 +4976,7 @@ print_it_catch_exec (struct breakpoint *b)
}
static void
-print_one_catch_exec (struct breakpoint *b, CORE_ADDR *last_addr)
+print_one_catch_exec (struct breakpoint *b, struct bp_location **last_loc)
{
struct value_print_options opts;
@@ -5030,8 +5094,8 @@ enable_watchpoints_after_interactive_call_stop (void)
Restrict it to frame FRAME if FRAME is nonzero. */
struct breakpoint *
-set_momentary_breakpoint (struct symtab_and_line sal, struct frame_id frame_id,
- enum bptype type)
+set_momentary_breakpoint (struct gdbarch *gdbarch, struct symtab_and_line sal,
+ struct frame_id frame_id, enum bptype type)
{
struct breakpoint *b;
@@ -5039,7 +5103,7 @@ set_momentary_breakpoint (struct symtab_and_line sal, struct frame_id frame_id,
one. */
gdb_assert (!frame_id_inlined_p (frame_id));
- b = set_raw_breakpoint (sal, type);
+ b = set_raw_breakpoint (gdbarch, sal, type);
b->enable_state = bp_enabled;
b->disposition = disp_donttouch;
b->frame_id = frame_id;
@@ -5067,10 +5131,11 @@ clone_momentary_breakpoint (struct breakpoint *orig)
if (orig == NULL)
return NULL;
- copy = set_raw_breakpoint_without_location (orig->type);
+ copy = set_raw_breakpoint_without_location (orig->gdbarch, orig->type);
copy->loc = allocate_bp_location (copy);
set_breakpoint_location_function (copy->loc);
+ copy->loc->gdbarch = orig->loc->gdbarch;
copy->loc->requested_address = orig->loc->requested_address;
copy->loc->address = orig->loc->address;
copy->loc->section = orig->loc->section;
@@ -5093,7 +5158,8 @@ clone_momentary_breakpoint (struct breakpoint *orig)
}
struct breakpoint *
-set_momentary_breakpoint_at_pc (CORE_ADDR pc, enum bptype type)
+set_momentary_breakpoint_at_pc (struct gdbarch *gdbarch, CORE_ADDR pc,
+ enum bptype type)
{
struct symtab_and_line sal;
@@ -5102,7 +5168,7 @@ set_momentary_breakpoint_at_pc (CORE_ADDR pc, enum bptype type)
sal.section = find_pc_overlay (pc);
sal.explicit_pc = 1;
- return set_momentary_breakpoint (sal, null_frame_id, type);
+ return set_momentary_breakpoint (gdbarch, sal, null_frame_id, type);
}
@@ -5256,8 +5322,12 @@ add_location_to_breakpoint (struct breakpoint *b,
for (tmp = &(b->loc); *tmp != NULL; tmp = &((*tmp)->next))
;
*tmp = loc;
+ loc->gdbarch = get_sal_arch (*sal);
+ if (!loc->gdbarch)
+ loc->gdbarch = b->gdbarch;
loc->requested_address = sal->pc;
- loc->address = adjust_breakpoint_address (loc->requested_address, b->type);
+ loc->address = adjust_breakpoint_address (loc->gdbarch,
+ loc->requested_address, b->type);
loc->section = sal->section;
set_breakpoint_location_function (loc);
@@ -5281,7 +5351,7 @@ bp_loc_is_permanent (struct bp_location *loc)
gdb_assert (loc != NULL);
addr = loc->address;
- brk = gdbarch_breakpoint_from_pc (current_gdbarch, &addr, &len);
+ brk = gdbarch_breakpoint_from_pc (loc->gdbarch, &addr, &len);
/* Software breakpoints unsupported? */
if (brk == NULL)
@@ -5310,7 +5380,8 @@ bp_loc_is_permanent (struct bp_location *loc)
as condition expression. */
static void
-create_breakpoint (struct symtabs_and_lines sals, char *addr_string,
+create_breakpoint (struct gdbarch *gdbarch,
+ struct symtabs_and_lines sals, char *addr_string,
char *cond_string,
enum bptype type, enum bpdisp disposition,
int thread, int task, int ignore_count,
@@ -5341,7 +5412,7 @@ create_breakpoint (struct symtabs_and_lines sals, char *addr_string,
if (i == 0)
{
- b = set_raw_breakpoint (sal, type);
+ b = set_raw_breakpoint (gdbarch, sal, type);
set_breakpoint_count (breakpoint_count + 1);
b->number = breakpoint_count;
b->thread = thread;
@@ -5540,7 +5611,8 @@ expand_line_sal_maybe (struct symtab_and_line sal)
COND and SALS arrays and each of those arrays contents. */
static void
-create_breakpoints (struct symtabs_and_lines sals, char **addr_string,
+create_breakpoints (struct gdbarch *gdbarch,
+ struct symtabs_and_lines sals, char **addr_string,
char *cond_string,
enum bptype type, enum bpdisp disposition,
int thread, int task, int ignore_count,
@@ -5553,7 +5625,7 @@ create_breakpoints (struct symtabs_and_lines sals, char **addr_string,
struct symtabs_and_lines expanded =
expand_line_sal_maybe (sals.sals[i]);
- create_breakpoint (expanded, addr_string[i],
+ create_breakpoint (gdbarch, expanded, addr_string[i],
cond_string, type, disposition,
thread, task, ignore_count, ops, from_tty, enabled);
}
@@ -5739,7 +5811,8 @@ find_condition_and_thread (char *tok, CORE_ADDR pc,
parameters. */
static void
-break_command_really (char *arg, char *cond_string, int thread,
+break_command_really (struct gdbarch *gdbarch,
+ char *arg, char *cond_string, int thread,
int parse_condition_and_thread,
int tempflag, int hardwareflag, int traceflag,
int ignore_count,
@@ -5881,7 +5954,7 @@ break_command_really (char *arg, char *cond_string, int thread,
make_cleanup (xfree, cond_string);
}
}
- create_breakpoints (sals, addr_string, cond_string, type_wanted,
+ create_breakpoints (gdbarch, sals, addr_string, cond_string, type_wanted,
tempflag ? disp_del : disp_donttouch,
thread, task, ignore_count, ops, from_tty, enabled);
}
@@ -5892,7 +5965,7 @@ break_command_really (char *arg, char *cond_string, int thread,
make_cleanup (xfree, copy_arg);
- b = set_raw_breakpoint_without_location (type_wanted);
+ b = set_raw_breakpoint_without_location (gdbarch, type_wanted);
set_breakpoint_count (breakpoint_count + 1);
b->number = breakpoint_count;
b->thread = -1;
@@ -5933,7 +6006,8 @@ break_command_1 (char *arg, int flag, int from_tty)
int hardwareflag = flag & BP_HARDWAREFLAG;
int tempflag = flag & BP_TEMPFLAG;
- break_command_really (arg,
+ break_command_really (get_current_arch (),
+ arg,
NULL, 0, 1 /* parse arg */,
tempflag, hardwareflag, 0 /* traceflag */,
0 /* Ignore count */,
@@ -5945,12 +6019,14 @@ break_command_1 (char *arg, int flag, int from_tty)
void
-set_breakpoint (char *address, char *condition,
+set_breakpoint (struct gdbarch *gdbarch,
+ char *address, char *condition,
int hardwareflag, int tempflag,
int thread, int ignore_count,
int pending, int enabled)
{
- break_command_really (address, condition, thread,
+ break_command_really (gdbarch,
+ address, condition, thread,
0 /* condition and thread are valid. */,
tempflag, hardwareflag, 0 /* traceflag */,
ignore_count,
@@ -6144,6 +6220,7 @@ stopat_command (char *arg, int from_tty)
static void
watch_command_1 (char *arg, int accessflag, int from_tty)
{
+ struct gdbarch *gdbarch = get_current_arch ();
struct breakpoint *b, *scope_breakpoint = NULL;
struct symtab_and_line sal;
struct expression *exp;
@@ -6299,7 +6376,8 @@ watch_command_1 (char *arg, int accessflag, int from_tty)
if (frame_id_p (frame_unwind_caller_id (frame)))
{
scope_breakpoint
- = create_internal_breakpoint (frame_unwind_caller_pc (frame),
+ = create_internal_breakpoint (frame_unwind_caller_arch (frame),
+ frame_unwind_caller_pc (frame),
bp_watchpoint_scope);
scope_breakpoint->enable_state = bp_enabled;
@@ -6311,16 +6389,19 @@ watch_command_1 (char *arg, int accessflag, int from_tty)
scope_breakpoint->frame_id = frame_unwind_caller_id (frame);
/* Set the address at which we will stop. */
+ scope_breakpoint->loc->gdbarch
+ = frame_unwind_caller_arch (frame);
scope_breakpoint->loc->requested_address
= frame_unwind_caller_pc (frame);
scope_breakpoint->loc->address
- = adjust_breakpoint_address (scope_breakpoint->loc->requested_address,
+ = adjust_breakpoint_address (scope_breakpoint->loc->gdbarch,
+ scope_breakpoint->loc->requested_address,
scope_breakpoint->type);
}
}
/* Now set up the breakpoint. */
- b = set_raw_breakpoint (sal, bp_type);
+ b = set_raw_breakpoint (gdbarch, sal, bp_type);
set_breakpoint_count (breakpoint_count + 1);
b->number = breakpoint_count;
b->thread = thread;
@@ -6527,11 +6608,13 @@ until_break_command (char *arg, int from_tty, int anywhere)
if (anywhere)
/* If the user told us to continue until a specified location,
we don't specify a frame at which we need to stop. */
- breakpoint = set_momentary_breakpoint (sal, null_frame_id, bp_until);
+ breakpoint = set_momentary_breakpoint (get_frame_arch (frame), sal,
+ null_frame_id, bp_until);
else
/* Otherwise, specify the selected frame, because we want to stop only
at the very same frame. */
- breakpoint = set_momentary_breakpoint (sal, get_stack_frame_id (frame),
+ breakpoint = set_momentary_breakpoint (get_frame_arch (frame), sal,
+ get_stack_frame_id (frame),
bp_until);
old_chain = make_cleanup_delete_breakpoint (breakpoint);
@@ -6543,7 +6626,8 @@ until_break_command (char *arg, int from_tty, int anywhere)
{
sal = find_pc_line (frame_unwind_caller_pc (frame), 0);
sal.pc = frame_unwind_caller_pc (frame);
- breakpoint2 = set_momentary_breakpoint (sal,
+ breakpoint2 = set_momentary_breakpoint (frame_unwind_caller_arch (frame),
+ sal,
frame_unwind_caller_id (frame),
bp_until);
make_cleanup_delete_breakpoint (breakpoint2);
@@ -6661,6 +6745,7 @@ catch_fork_kind;
static void
catch_fork_command_1 (char *arg, int from_tty, struct cmd_list_element *command)
{
+ struct gdbarch *gdbarch = get_current_arch ();
char *cond_string = NULL;
catch_fork_kind fork_kind;
int tempflag;
@@ -6689,12 +6774,12 @@ catch_fork_command_1 (char *arg, int from_tty, struct cmd_list_element *command)
{
case catch_fork_temporary:
case catch_fork_permanent:
- create_fork_vfork_event_catchpoint (tempflag, cond_string,
+ create_fork_vfork_event_catchpoint (gdbarch, tempflag, cond_string,
&catch_fork_breakpoint_ops);
break;
case catch_vfork_temporary:
case catch_vfork_permanent:
- create_fork_vfork_event_catchpoint (tempflag, cond_string,
+ create_fork_vfork_event_catchpoint (gdbarch, tempflag, cond_string,
&catch_vfork_breakpoint_ops);
break;
default:
@@ -6706,6 +6791,7 @@ catch_fork_command_1 (char *arg, int from_tty, struct cmd_list_element *command)
static void
catch_exec_command_1 (char *arg, int from_tty, struct cmd_list_element *command)
{
+ struct gdbarch *gdbarch = get_current_arch ();
int tempflag;
char *cond_string = NULL;
@@ -6727,7 +6813,8 @@ catch_exec_command_1 (char *arg, int from_tty, struct cmd_list_element *command)
/* If this target supports it, create an exec catchpoint
and enable reporting of such events. */
- create_catchpoint (tempflag, cond_string, &catch_exec_breakpoint_ops);
+ create_catchpoint (gdbarch, tempflag, cond_string,
+ &catch_exec_breakpoint_ops);
}
static enum print_stop_action
@@ -6762,7 +6849,7 @@ print_exception_catchpoint (struct breakpoint *b)
}
static void
-print_one_exception_catchpoint (struct breakpoint *b, CORE_ADDR *last_addr)
+print_one_exception_catchpoint (struct breakpoint *b, struct bp_location **last_loc)
{
struct value_print_options opts;
get_user_print_options (&opts);
@@ -6776,7 +6863,7 @@ print_one_exception_catchpoint (struct breakpoint *b, CORE_ADDR *last_addr)
}
annotate_field (5);
if (b->loc)
- *last_addr = b->loc->address;
+ *last_loc = b->loc;
if (strstr (b->addr_string, "throw") != NULL)
ui_out_field_string (uiout, "what", "exception throw");
else
@@ -6818,7 +6905,8 @@ handle_gnu_v3_exceptions (int tempflag, char *cond_string,
else
trigger_func_name = "__cxa_throw";
- break_command_really (trigger_func_name, cond_string, -1,
+ break_command_really (get_current_arch (),
+ trigger_func_name, cond_string, -1,
0 /* condition and thread are valid. */,
tempflag, 0, 0,
0,
@@ -6878,7 +6966,8 @@ catch_throw_command (char *arg, int from_tty, struct cmd_list_element *command)
/* Create a breakpoint struct for Ada exception catchpoints. */
static void
-create_ada_exception_breakpoint (struct symtab_and_line sal,
+create_ada_exception_breakpoint (struct gdbarch *gdbarch,
+ struct symtab_and_line sal,
char *addr_string,
char *exp_string,
char *cond_string,
@@ -6902,7 +6991,7 @@ create_ada_exception_breakpoint (struct symtab_and_line sal,
enough for now, though. */
}
- b = set_raw_breakpoint (sal, bp_breakpoint);
+ b = set_raw_breakpoint (gdbarch, sal, bp_breakpoint);
set_breakpoint_count (breakpoint_count + 1);
b->enable_state = bp_enabled;
@@ -6927,6 +7016,7 @@ static void
catch_ada_exception_command (char *arg, int from_tty,
struct cmd_list_element *command)
{
+ struct gdbarch *gdbarch = get_current_arch ();
int tempflag;
struct symtab_and_line sal;
enum bptype type;
@@ -6942,7 +7032,7 @@ catch_ada_exception_command (char *arg, int from_tty,
arg = "";
sal = ada_decode_exception_location (arg, &addr_string, &exp_string,
&cond_string, &cond, &ops);
- create_ada_exception_breakpoint (sal, addr_string, exp_string,
+ create_ada_exception_breakpoint (gdbarch, sal, addr_string, exp_string,
cond_string, cond, ops, tempflag,
from_tty);
}
@@ -6952,6 +7042,7 @@ catch_ada_exception_command (char *arg, int from_tty,
static void
catch_assert_command (char *arg, int from_tty, struct cmd_list_element *command)
{
+ struct gdbarch *gdbarch = get_current_arch ();
int tempflag;
struct symtab_and_line sal;
char *addr_string = NULL;
@@ -6962,8 +7053,8 @@ catch_assert_command (char *arg, int from_tty, struct cmd_list_element *command)
if (!arg)
arg = "";
sal = ada_decode_assert_location (arg, &addr_string, &ops);
- create_ada_exception_breakpoint (sal, addr_string, NULL, NULL, NULL, ops,
- tempflag, from_tty);
+ create_ada_exception_breakpoint (gdbarch, sal, addr_string, NULL, NULL, NULL,
+ ops, tempflag, from_tty);
}
static void
@@ -8230,7 +8321,7 @@ decode_line_spec_1 (char *string, int funfirstline)
someday. */
void *
-deprecated_insert_raw_breakpoint (CORE_ADDR pc)
+deprecated_insert_raw_breakpoint (struct gdbarch *gdbarch, CORE_ADDR pc)
{
struct bp_target_info *bp_tgt;
@@ -8238,7 +8329,7 @@ deprecated_insert_raw_breakpoint (CORE_ADDR pc)
memset (bp_tgt, 0, sizeof (struct bp_target_info));
bp_tgt->placed_address = pc;
- if (target_insert_breakpoint (bp_tgt) != 0)
+ if (target_insert_breakpoint (gdbarch, bp_tgt) != 0)
{
/* Could not insert the breakpoint. */
xfree (bp_tgt);
@@ -8251,12 +8342,12 @@ deprecated_insert_raw_breakpoint (CORE_ADDR pc)
/* Remove a breakpoint BP inserted by deprecated_insert_raw_breakpoint. */
int
-deprecated_remove_raw_breakpoint (void *bp)
+deprecated_remove_raw_breakpoint (struct gdbarch *gdbarch, void *bp)
{
struct bp_target_info *bp_tgt = bp;
int ret;
- ret = target_remove_breakpoint (bp_tgt);
+ ret = target_remove_breakpoint (gdbarch, bp_tgt);
xfree (bp_tgt);
return ret;
@@ -8265,20 +8356,25 @@ deprecated_remove_raw_breakpoint (void *bp)
/* One (or perhaps two) breakpoints used for software single stepping. */
static void *single_step_breakpoints[2];
+static struct gdbarch *single_step_gdbarch[2];
/* Create and insert a breakpoint for software single step. */
void
-insert_single_step_breakpoint (CORE_ADDR next_pc)
+insert_single_step_breakpoint (struct gdbarch *gdbarch, CORE_ADDR next_pc)
{
void **bpt_p;
if (single_step_breakpoints[0] == NULL)
- bpt_p = &single_step_breakpoints[0];
+ {
+ bpt_p = &single_step_breakpoints[0];
+ single_step_gdbarch[0] = gdbarch;
+ }
else
{
gdb_assert (single_step_breakpoints[1] == NULL);
bpt_p = &single_step_breakpoints[1];
+ single_step_gdbarch[1] = gdbarch;
}
/* NOTE drow/2006-04-11: A future improvement to this function would be
@@ -8288,7 +8384,7 @@ insert_single_step_breakpoint (CORE_ADDR next_pc)
corresponding changes elsewhere where single step breakpoints are
handled, however. So, for now, we use this. */
- *bpt_p = deprecated_insert_raw_breakpoint (next_pc);
+ *bpt_p = deprecated_insert_raw_breakpoint (gdbarch, next_pc);
if (*bpt_p == NULL)
error (_("Could not insert single-step breakpoint at 0x%s"),
paddr_nz (next_pc));
@@ -8303,12 +8399,16 @@ remove_single_step_breakpoints (void)
/* See insert_single_step_breakpoint for more about this deprecated
call. */
- deprecated_remove_raw_breakpoint (single_step_breakpoints[0]);
+ deprecated_remove_raw_breakpoint (single_step_gdbarch[0],
+ single_step_breakpoints[0]);
+ single_step_gdbarch[0] = NULL;
single_step_breakpoints[0] = NULL;
if (single_step_breakpoints[1] != NULL)
{
- deprecated_remove_raw_breakpoint (single_step_breakpoints[1]);
+ deprecated_remove_raw_breakpoint (single_step_gdbarch[1],
+ single_step_breakpoints[1]);
+ single_step_gdbarch[1] = NULL;
single_step_breakpoints[1] = NULL;
}
}
@@ -8343,7 +8443,8 @@ set_tracepoint_count (int num)
void
trace_command (char *arg, int from_tty)
{
- break_command_really (arg,
+ break_command_really (get_current_arch (),
+ arg,
NULL, 0, 1 /* parse arg */,
0 /* tempflag */, 0 /* hardwareflag */,
1 /* traceflag */,