diff options
author | Thiago Jung Bauermann <bauerman@br.ibm.com> | 2011-01-11 19:18:31 +0000 |
---|---|---|
committer | Thiago Jung Bauermann <bauerman@br.ibm.com> | 2011-01-11 19:18:31 +0000 |
commit | 9fa40276f0a747e238e608672231ec28fa614619 (patch) | |
tree | da69a80460f754f36fd5d7e708a3c0616752b515 /gdb/breakpoint.c | |
parent | 77b06cd7198f20bb48b3a148ca8b9efbaa06aa19 (diff) | |
download | gdb-9fa40276f0a747e238e608672231ec28fa614619.zip gdb-9fa40276f0a747e238e608672231ec28fa614619.tar.gz gdb-9fa40276f0a747e238e608672231ec28fa614619.tar.bz2 |
2011-01-11 Thiago Jung Bauermann <bauerman@br.ibm.com>
* breakpoint.c (update_watchpoint): Decide on using a software or
hardware watchpoint after the bp_locations are created.
Diffstat (limited to 'gdb/breakpoint.c')
-rw-r--r-- | gdb/breakpoint.c | 78 |
1 files changed, 44 insertions, 34 deletions
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index fc66e9b..8c1a4e0 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -1426,43 +1426,10 @@ update_watchpoint (struct breakpoint *b, int reparse) b->val_valid = 1; } - /* Change the type of breakpoint between hardware assisted or - an ordinary watchpoint depending on the hardware support - and free hardware slots. REPARSE is set when the inferior - is started. */ - if ((b->type == bp_watchpoint || b->type == bp_hardware_watchpoint) - && reparse) - { - int i, mem_cnt, other_type_used; - - /* We need to determine how many resources are already - used for all other hardware watchpoints to see if we - still have enough resources to also fit this watchpoint - in as well. To avoid the hw_watchpoint_used_count call - below from counting this watchpoint, make sure that it - is marked as a software watchpoint. */ - b->type = bp_watchpoint; - i = hw_watchpoint_used_count (bp_hardware_watchpoint, - &other_type_used); - mem_cnt = can_use_hardware_watchpoint (val_chain); - - if (!mem_cnt) - b->type = bp_watchpoint; - else - { - int target_resources_ok = target_can_use_hardware_watchpoint - (bp_hardware_watchpoint, i + mem_cnt, other_type_used); - if (target_resources_ok <= 0) - b->type = bp_watchpoint; - else - b->type = bp_hardware_watchpoint; - } - } - frame_pspace = get_frame_program_space (get_selected_frame (NULL)); /* Look at each value on the value chain. */ - for (v = val_chain; v; v = next) + for (v = val_chain; v; v = value_next (v)) { /* If it's a memory location, and GDB actually needed its contents to evaluate the expression, then we @@ -1505,7 +1472,50 @@ update_watchpoint (struct breakpoint *b, int reparse) loc->watchpoint_type = type; } } + } + /* Change the type of breakpoint between hardware assisted or + an ordinary watchpoint depending on the hardware support + and free hardware slots. REPARSE is set when the inferior + is started. */ + if ((b->type == bp_watchpoint || b->type == bp_hardware_watchpoint) + && reparse) + { + int mem_cnt; + enum bp_loc_type loc_type; + struct bp_location *bl; + + mem_cnt = can_use_hardware_watchpoint (val_chain); + if (mem_cnt) + { + int i, target_resources_ok, other_type_used; + + /* We need to determine how many resources are already + used for all other hardware watchpoints to see if we + still have enough resources to also fit this watchpoint + in as well. To avoid the hw_watchpoint_used_count call + below from counting this watchpoint, make sure that it + is marked as a software watchpoint. */ + b->type = bp_watchpoint; + i = hw_watchpoint_used_count (bp_hardware_watchpoint, + &other_type_used); + target_resources_ok = target_can_use_hardware_watchpoint + (bp_hardware_watchpoint, i + mem_cnt, other_type_used); + + if (target_resources_ok > 0) + b->type = bp_hardware_watchpoint; + } + else + b->type = bp_watchpoint; + + loc_type = (b->type == bp_watchpoint? bp_loc_other + : bp_loc_hardware_watchpoint); + for (bl = b->loc; bl; bl = bl->next) + bl->loc_type = loc_type; + } + + for (v = val_chain; v; v = next) + { next = value_next (v); if (v != b->val) value_free (v); |