[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:
Pedro Alves 2015-11-19 14:32:53 +00:00
parent 4d1931791d
commit c6d8112436
2 changed files with 44 additions and 13 deletions

View File

@ -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>

View File

@ -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;