[C++] breakpoint.c: "no memory" software watchpoints and enum casts
Fixes: src/gdb/breakpoint.c: In function ‘void update_watchpoint(watchpoint*, int)’: src/gdb/breakpoint.c:2147:31: error: invalid conversion from ‘int’ to ‘target_hw_bp_type’ [-fpermissive] base->loc->watchpoint_type = -1; ^ Seems better to rely on "address == -1 && length == -1" than on a enum value that's not really part of the set of supposedly valid enum values. Also, factor that out to separate functions for better localization of the concept. gdb/ChangeLog: 2015-11-19 Pedro Alves <palves@redhat.com> * breakpoint.c (software_watchpoint_add_no_memory_location) (is_no_memory_software_watchpoint): New functions. (update_watchpoint): Use software_watchpoint_add_memoryless_location. (breakpoint_address_bits): Use is_no_memory_software_watchpoint.
This commit is contained in:
parent
4d1931791d
commit
c6d8112436
2 changed files with 44 additions and 13 deletions
|
@ -1,3 +1,11 @@
|
|||
2015-11-19 Pedro Alves <palves@redhat.com>
|
||||
|
||||
* breakpoint.c (software_watchpoint_add_no_memory_location)
|
||||
(is_no_memory_software_watchpoint): New functions.
|
||||
(update_watchpoint): Use
|
||||
software_watchpoint_add_memoryless_location.
|
||||
(breakpoint_address_bits): Use is_no_memory_software_watchpoint.
|
||||
|
||||
2015-11-19 Simon Marchi <simon.marchi@ericsson.com>
|
||||
Pedro Alves <palves@redhat.com>
|
||||
|
||||
|
|
|
@ -1775,6 +1775,36 @@ extract_bitfield_from_watchpoint_value (struct watchpoint *w, struct value *val)
|
|||
return bit_val;
|
||||
}
|
||||
|
||||
/* Allocate a dummy location and add it to B, which must be a software
|
||||
watchpoint. This is required because even if a software watchpoint
|
||||
is not watching any memory, bpstat_stop_status requires a location
|
||||
to be able to report stops. */
|
||||
|
||||
static void
|
||||
software_watchpoint_add_no_memory_location (struct breakpoint *b,
|
||||
struct program_space *pspace)
|
||||
{
|
||||
gdb_assert (b->type == bp_watchpoint && b->loc == NULL);
|
||||
|
||||
b->loc = allocate_bp_location (b);
|
||||
b->loc->pspace = pspace;
|
||||
b->loc->address = -1;
|
||||
b->loc->length = -1;
|
||||
}
|
||||
|
||||
/* Returns true if B is a software watchpoint that is not watching any
|
||||
memory (e.g., "watch $pc"). */
|
||||
|
||||
static int
|
||||
is_no_memory_software_watchpoint (struct breakpoint *b)
|
||||
{
|
||||
return (b->type == bp_watchpoint
|
||||
&& b->loc != NULL
|
||||
&& b->loc->next == NULL
|
||||
&& b->loc->address == -1
|
||||
&& b->loc->length == -1);
|
||||
}
|
||||
|
||||
/* Assuming that B is a watchpoint:
|
||||
- Reparse watchpoint expression, if REPARSE is non-zero
|
||||
- Evaluate expression and store the result in B->val
|
||||
|
@ -2138,14 +2168,7 @@ update_watchpoint (struct watchpoint *b, int reparse)
|
|||
bpstat_stop_status requires a location to be able to report
|
||||
stops, so make sure there's at least a dummy one. */
|
||||
if (b->base.type == bp_watchpoint && b->base.loc == NULL)
|
||||
{
|
||||
struct breakpoint *base = &b->base;
|
||||
base->loc = allocate_bp_location (base);
|
||||
base->loc->pspace = frame_pspace;
|
||||
base->loc->address = -1;
|
||||
base->loc->length = -1;
|
||||
base->loc->watchpoint_type = -1;
|
||||
}
|
||||
software_watchpoint_add_no_memory_location (&b->base, frame_pspace);
|
||||
}
|
||||
else if (!within_current_scope)
|
||||
{
|
||||
|
@ -6667,15 +6690,15 @@ breakpoint_address_bits (struct breakpoint *b)
|
|||
int print_address_bits = 0;
|
||||
struct bp_location *loc;
|
||||
|
||||
/* Software watchpoints that aren't watching memory don't have an
|
||||
address to print. */
|
||||
if (is_no_memory_software_watchpoint (b))
|
||||
return 0;
|
||||
|
||||
for (loc = b->loc; loc; loc = loc->next)
|
||||
{
|
||||
int addr_bit;
|
||||
|
||||
/* Software watchpoints that aren't watching memory don't have
|
||||
an address to print. */
|
||||
if (b->type == bp_watchpoint && loc->watchpoint_type == -1)
|
||||
continue;
|
||||
|
||||
addr_bit = gdbarch_addr_bit (loc->gdbarch);
|
||||
if (addr_bit > print_address_bits)
|
||||
print_address_bits = addr_bit;
|
||||
|
|
Loading…
Add table
Reference in a new issue