forked from Imagelibrary/binutils-gdb
2010-07-07 Sergio Durigan Junior <sergiodj@linux.vnet.ibm.com>
Thiago Jung Bauermann <bauerman@br.ibm.com> Support for hw accelerated condition watchpoints in booke powerpc. * breakpoint.c (fetch_watchpoint_value): Rename to fetch_subexp_value and move to eval.c. Change callers. (insert_bp_location): Pass watchpoint condition in target_insert_watchpoint. (remove_breakpoint_1) Pass watchpoint condition in target_remove_watchpoint. (watchpoint_locations_match): Call target_can_accel_watchpoint_condition. * eval.c: Include wrapper.h. (fetch_subexp_value): Moved from breakpoint.c. * ppc-linux-nat.c (ppc_linux_region_ok_for_hw_watchpoint): Formatting fix. (can_use_watchpoint_cond_accel): New function. (calculate_dvc): Likewise. (num_memory_accesses): Likewise. (check_condition): Likewise. (ppc_linux_can_accel_watchpoint_condition): Likewise (ppc_linux_insert_watchpoint): Call can_use_watchpoint_cond_accel, check_condition and calculate_dvc. (ppc_linux_remove_watchpoint): Likewise. (_initialize_ppc_linux_nat): Set to_can_accel_watchpoint_condition to ppc_linux_can_accel_watchpoint_condition * target.c (debug_to_insert_watchpoint): Add argument for watchpoint condition. (debug_to_remove_watchpoint): Likewise. (debug_to_can_accel_watchpoint_condition): New function. (update_current_target): Set to_can_accel_watchpoint_condition. (setup_target_debug): Set to_can_accel_watchpoint_condition. * target.h: Add opaque declaration for struct expression. (struct target_ops) <to_insert_watchpoint>, <to_remove_watchpoint>: Add new arguments to pass the watchpoint <to_can_accel_watchpoint_condition>: New member. condition. Update all callers and implementations. (target_can_accel_watchpoint_condition): New macro. * value.c (free_value_chain): New function. * value.h (fetch_subexp_value): New prototype. (free_value_chain): Likewise.
This commit is contained in:
53
gdb/target.c
53
gdb/target.c
@@ -117,9 +117,11 @@ static int debug_to_insert_hw_breakpoint (struct gdbarch *,
|
||||
static int debug_to_remove_hw_breakpoint (struct gdbarch *,
|
||||
struct bp_target_info *);
|
||||
|
||||
static int debug_to_insert_watchpoint (CORE_ADDR, int, int);
|
||||
static int debug_to_insert_watchpoint (CORE_ADDR, int, int,
|
||||
struct expression *);
|
||||
|
||||
static int debug_to_remove_watchpoint (CORE_ADDR, int, int);
|
||||
static int debug_to_remove_watchpoint (CORE_ADDR, int, int,
|
||||
struct expression *);
|
||||
|
||||
static int debug_to_stopped_by_watchpoint (void);
|
||||
|
||||
@@ -130,6 +132,9 @@ static int debug_to_watchpoint_addr_within_range (struct target_ops *,
|
||||
|
||||
static int debug_to_region_ok_for_hw_watchpoint (CORE_ADDR, int);
|
||||
|
||||
static int debug_to_can_accel_watchpoint_condition (CORE_ADDR, int, int,
|
||||
struct expression *);
|
||||
|
||||
static void debug_to_terminal_init (void);
|
||||
|
||||
static void debug_to_terminal_inferior (void);
|
||||
@@ -607,6 +612,7 @@ update_current_target (void)
|
||||
INHERIT (to_stopped_by_watchpoint, t);
|
||||
INHERIT (to_watchpoint_addr_within_range, t);
|
||||
INHERIT (to_region_ok_for_hw_watchpoint, t);
|
||||
INHERIT (to_can_accel_watchpoint_condition, t);
|
||||
INHERIT (to_terminal_init, t);
|
||||
INHERIT (to_terminal_inferior, t);
|
||||
INHERIT (to_terminal_ours_for_output, t);
|
||||
@@ -728,10 +734,10 @@ update_current_target (void)
|
||||
(int (*) (struct gdbarch *, struct bp_target_info *))
|
||||
return_minus_one);
|
||||
de_fault (to_insert_watchpoint,
|
||||
(int (*) (CORE_ADDR, int, int))
|
||||
(int (*) (CORE_ADDR, int, int, struct expression *))
|
||||
return_minus_one);
|
||||
de_fault (to_remove_watchpoint,
|
||||
(int (*) (CORE_ADDR, int, int))
|
||||
(int (*) (CORE_ADDR, int, int, struct expression *))
|
||||
return_minus_one);
|
||||
de_fault (to_stopped_by_watchpoint,
|
||||
(int (*) (void))
|
||||
@@ -743,6 +749,9 @@ update_current_target (void)
|
||||
default_watchpoint_addr_within_range);
|
||||
de_fault (to_region_ok_for_hw_watchpoint,
|
||||
default_region_ok_for_hw_watchpoint);
|
||||
de_fault (to_can_accel_watchpoint_condition,
|
||||
(int (*) (CORE_ADDR, int, int, struct expression *))
|
||||
return_zero);
|
||||
de_fault (to_terminal_init,
|
||||
(void (*) (void))
|
||||
target_ignore);
|
||||
@@ -3313,6 +3322,21 @@ debug_to_region_ok_for_hw_watchpoint (CORE_ADDR addr, int len)
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int
|
||||
debug_to_can_accel_watchpoint_condition (CORE_ADDR addr, int len, int rw,
|
||||
struct expression *cond)
|
||||
{
|
||||
int retval;
|
||||
|
||||
retval = debug_target.to_can_accel_watchpoint_condition (addr, len, rw, cond);
|
||||
|
||||
fprintf_unfiltered (gdb_stdlog,
|
||||
"target_can_accel_watchpoint_condition (0x%lx, %d, %d, 0x%lx) = %ld\n",
|
||||
(unsigned long) addr, len, rw, (unsigned long) cond,
|
||||
(unsigned long) retval);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int
|
||||
debug_to_stopped_by_watchpoint (void)
|
||||
{
|
||||
@@ -3388,28 +3412,32 @@ debug_to_remove_hw_breakpoint (struct gdbarch *gdbarch,
|
||||
}
|
||||
|
||||
static int
|
||||
debug_to_insert_watchpoint (CORE_ADDR addr, int len, int type)
|
||||
debug_to_insert_watchpoint (CORE_ADDR addr, int len, int type,
|
||||
struct expression *cond)
|
||||
{
|
||||
int retval;
|
||||
|
||||
retval = debug_target.to_insert_watchpoint (addr, len, type);
|
||||
retval = debug_target.to_insert_watchpoint (addr, len, type, cond);
|
||||
|
||||
fprintf_unfiltered (gdb_stdlog,
|
||||
"target_insert_watchpoint (0x%lx, %d, %d) = %ld\n",
|
||||
(unsigned long) addr, len, type, (unsigned long) retval);
|
||||
"target_insert_watchpoint (0x%lx, %d, %d, 0x%ld) = %ld\n",
|
||||
(unsigned long) addr, len, type, (unsigned long) cond,
|
||||
(unsigned long) retval);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int
|
||||
debug_to_remove_watchpoint (CORE_ADDR addr, int len, int type)
|
||||
debug_to_remove_watchpoint (CORE_ADDR addr, int len, int type,
|
||||
struct expression *cond)
|
||||
{
|
||||
int retval;
|
||||
|
||||
retval = debug_target.to_remove_watchpoint (addr, len, type);
|
||||
retval = debug_target.to_remove_watchpoint (addr, len, type, cond);
|
||||
|
||||
fprintf_unfiltered (gdb_stdlog,
|
||||
"target_remove_watchpoint (0x%lx, %d, %d) = %ld\n",
|
||||
(unsigned long) addr, len, type, (unsigned long) retval);
|
||||
"target_remove_watchpoint (0x%lx, %d, %d, 0x%ld) = %ld\n",
|
||||
(unsigned long) addr, len, type, (unsigned long) cond,
|
||||
(unsigned long) retval);
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -3664,6 +3692,7 @@ setup_target_debug (void)
|
||||
current_target.to_stopped_data_address = debug_to_stopped_data_address;
|
||||
current_target.to_watchpoint_addr_within_range = debug_to_watchpoint_addr_within_range;
|
||||
current_target.to_region_ok_for_hw_watchpoint = debug_to_region_ok_for_hw_watchpoint;
|
||||
current_target.to_can_accel_watchpoint_condition = debug_to_can_accel_watchpoint_condition;
|
||||
current_target.to_terminal_init = debug_to_terminal_init;
|
||||
current_target.to_terminal_inferior = debug_to_terminal_inferior;
|
||||
current_target.to_terminal_ours_for_output = debug_to_terminal_ours_for_output;
|
||||
|
||||
Reference in New Issue
Block a user