diff options
author | Thiago Jung Bauermann <bauerman@br.ibm.com> | 2010-07-07 16:15:18 +0000 |
---|---|---|
committer | Thiago Jung Bauermann <bauerman@br.ibm.com> | 2010-07-07 16:15:18 +0000 |
commit | 0cf6dd1543299e30c82397ef49d00b32af911a63 (patch) | |
tree | ae3f26f11acc891e1092331af2f955cc80b05896 /gdb/target.c | |
parent | 6bd31874685a739404578403651d7b1ad5d20a3e (diff) | |
download | gdb-0cf6dd1543299e30c82397ef49d00b32af911a63.zip gdb-0cf6dd1543299e30c82397ef49d00b32af911a63.tar.gz gdb-0cf6dd1543299e30c82397ef49d00b32af911a63.tar.bz2 |
2010-07-07 Sergio Durigan Junior <sergiodj@linux.vnet.ibm.com>gdb_7_2-branchpoint
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.
Diffstat (limited to 'gdb/target.c')
-rw-r--r-- | gdb/target.c | 53 |
1 files changed, 41 insertions, 12 deletions
diff --git a/gdb/target.c b/gdb/target.c index 7c9793d..862df4e 100644 --- a/gdb/target.c +++ b/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); @@ -3314,6 +3323,21 @@ debug_to_region_ok_for_hw_watchpoint (CORE_ADDR addr, int len) } 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) { int retval; @@ -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; |