aboutsummaryrefslogtreecommitdiff
path: root/gdb/breakpoint.c
diff options
context:
space:
mode:
authorThiago Jung Bauermann <bauerman@br.ibm.com>2011-01-11 19:18:31 +0000
committerThiago Jung Bauermann <bauerman@br.ibm.com>2011-01-11 19:18:31 +0000
commit9fa40276f0a747e238e608672231ec28fa614619 (patch)
treeda69a80460f754f36fd5d7e708a3c0616752b515 /gdb/breakpoint.c
parent77b06cd7198f20bb48b3a148ca8b9efbaa06aa19 (diff)
downloadgdb-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.c78
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);