* breakpoint.c (mark_breakpoints_out): Use ALL_BP_LOCATIONS.

(beakpoint_init_inferior): Likewise.
	(breakpoint_here_p): Likewise.  Only check addresses for software
	or hardware breakpoints.
	(breakpoint_inserted_here_p): Likewise.
	(breakpoint_thread_match): Likewise.  Correct comment.
	(bpstat_have_active_hw_watchpoints): Likewise.
	(check_duplicates): Likewise.
This commit is contained in:
Daniel Jacobowitz 2003-11-06 18:27:34 +00:00
parent 879bfdc20d
commit 075f65829c
2 changed files with 107 additions and 77 deletions

View File

@ -1,3 +1,14 @@
2003-11-06 Daniel Jacobowitz <drow@mvista.com>
* breakpoint.c (mark_breakpoints_out): Use ALL_BP_LOCATIONS.
(beakpoint_init_inferior): Likewise.
(breakpoint_here_p): Likewise. Only check addresses for software
or hardware breakpoints.
(breakpoint_inserted_here_p): Likewise.
(breakpoint_thread_match): Likewise. Correct comment.
(bpstat_have_active_hw_watchpoints): Likewise.
(check_duplicates): Likewise.
2003-11-06 Daniel Jacobowitz <drow@mvista.com>
* breakpoints.c (insert_bp_location): New function, broken out

View File

@ -1574,10 +1574,10 @@ remove_breakpoint (struct breakpoint *b, insertion_state_t is)
void
mark_breakpoints_out (void)
{
struct breakpoint *b;
struct bp_location *bpt;
ALL_BREAKPOINTS (b)
b->loc->inserted = 0;
ALL_BP_LOCATIONS (bpt)
bpt->inserted = 0;
}
/* Clear the "inserted" flag in all breakpoints and delete any
@ -1596,12 +1596,14 @@ void
breakpoint_init_inferior (enum inf_context context)
{
struct breakpoint *b, *temp;
struct bp_location *bpt;
static int warning_needed = 0;
ALL_BP_LOCATIONS (bpt)
bpt->inserted = 0;
ALL_BREAKPOINTS_SAFE (b, temp)
{
b->loc->inserted = 0;
switch (b->type)
{
case bp_call_dummy:
@ -1670,23 +1672,29 @@ breakpoint_init_inferior (enum inf_context context)
enum breakpoint_here
breakpoint_here_p (CORE_ADDR pc)
{
struct breakpoint *b;
struct bp_location *bpt;
int any_breakpoint_here = 0;
ALL_BREAKPOINTS (b)
if ((b->enable_state == bp_enabled
|| b->enable_state == bp_permanent)
&& b->loc->address == pc) /* bp is enabled and matches pc */
{
if (overlay_debugging
&& section_is_overlay (b->loc->section)
&& !section_is_mapped (b->loc->section))
continue; /* unmapped overlay -- can't be a match */
else if (b->enable_state == bp_permanent)
return permanent_breakpoint_here;
else
any_breakpoint_here = 1;
}
ALL_BP_LOCATIONS (bpt)
{
if (bpt->loc_type != bp_loc_software_breakpoint
&& bpt->loc_type != bp_loc_hardware_breakpoint)
continue;
if ((bpt->owner->enable_state == bp_enabled
|| bpt->owner->enable_state == bp_permanent)
&& bpt->address == pc) /* bp is enabled and matches pc */
{
if (overlay_debugging
&& section_is_overlay (bpt->section)
&& !section_is_mapped (bpt->section))
continue; /* unmapped overlay -- can't be a match */
else if (bpt->owner->enable_state == bp_permanent)
return permanent_breakpoint_here;
else
any_breakpoint_here = 1;
}
}
return any_breakpoint_here ? ordinary_breakpoint_here : 0;
}
@ -1699,18 +1707,24 @@ breakpoint_here_p (CORE_ADDR pc)
int
breakpoint_inserted_here_p (CORE_ADDR pc)
{
struct breakpoint *b;
struct bp_location *bpt;
ALL_BREAKPOINTS (b)
if (b->loc->inserted
&& b->loc->address == pc) /* bp is inserted and matches pc */
ALL_BP_LOCATIONS (bpt)
{
if (overlay_debugging
&& section_is_overlay (b->loc->section)
&& !section_is_mapped (b->loc->section))
continue; /* unmapped overlay -- can't be a match */
else
return 1;
if (bpt->loc_type != bp_loc_software_breakpoint
&& bpt->loc_type != bp_loc_hardware_breakpoint)
continue;
if (bpt->inserted
&& bpt->address == pc) /* bp is inserted and matches pc */
{
if (overlay_debugging
&& section_is_overlay (bpt->section)
&& !section_is_mapped (bpt->section))
continue; /* unmapped overlay -- can't be a match */
else
return 1;
}
}
return 0;
@ -1747,30 +1761,35 @@ deprecated_frame_in_dummy (struct frame_info *frame)
return 0;
}
/* breakpoint_thread_match (PC, PID) returns true if the breakpoint at
PC is valid for process/thread PID. */
/* breakpoint_thread_match (PC, PTID) returns true if the breakpoint at
PC is valid for process/thread PTID. */
int
breakpoint_thread_match (CORE_ADDR pc, ptid_t ptid)
{
struct breakpoint *b;
struct bp_location *bpt;
int thread;
thread = pid_to_thread_id (ptid);
ALL_BREAKPOINTS (b)
if (b->enable_state != bp_disabled
&& b->enable_state != bp_shlib_disabled
&& b->enable_state != bp_call_disabled
&& b->loc->address == pc
&& (b->thread == -1 || b->thread == thread))
ALL_BP_LOCATIONS (bpt)
{
if (overlay_debugging
&& section_is_overlay (b->loc->section)
&& !section_is_mapped (b->loc->section))
continue; /* unmapped overlay -- can't be a match */
else
return 1;
if (bpt->loc_type != bp_loc_software_breakpoint
&& bpt->loc_type != bp_loc_hardware_breakpoint)
continue;
if ((bpt->owner->enable_state == bp_enabled
|| bpt->owner->enable_state == bp_permanent)
&& bpt->address == pc
&& (bpt->owner->thread == -1 || bpt->owner->thread == thread))
{
if (overlay_debugging
&& section_is_overlay (bpt->section)
&& !section_is_mapped (bpt->section))
continue; /* unmapped overlay -- can't be a match */
else
return 1;
}
}
return 0;
@ -3175,13 +3194,11 @@ bpstat_should_step (void)
int
bpstat_have_active_hw_watchpoints (void)
{
struct breakpoint *b;
ALL_BREAKPOINTS (b)
if ((b->enable_state == bp_enabled) &&
(b->loc->inserted) &&
((b->type == bp_hardware_watchpoint) ||
(b->type == bp_read_watchpoint) ||
(b->type == bp_access_watchpoint)))
struct bp_location *bpt;
ALL_BP_LOCATIONS (bpt)
if ((bpt->owner->enable_state == bp_enabled)
&& bpt->inserted
&& bpt->loc_type == bp_loc_hardware_watchpoint)
return 1;
return 0;
}
@ -3817,32 +3834,32 @@ breakpoint_address_is_meaningful (struct breakpoint *bpt)
static void
check_duplicates (struct breakpoint *bpt)
{
struct breakpoint *b;
struct bp_location *b;
int count = 0;
struct breakpoint *perm_bp = 0;
struct bp_location *perm_bp = 0;
CORE_ADDR address = bpt->loc->address;
asection *section = bpt->loc->section;
if (! breakpoint_address_is_meaningful (bpt))
return;
ALL_BREAKPOINTS (b)
if (b->enable_state != bp_disabled
&& b->enable_state != bp_shlib_disabled
&& b->enable_state != bp_call_disabled
&& b->loc->address == address /* address / overlay match */
&& (!overlay_debugging || b->loc->section == section)
&& breakpoint_address_is_meaningful (b))
ALL_BP_LOCATIONS (b)
if (b->owner->enable_state != bp_disabled
&& b->owner->enable_state != bp_shlib_disabled
&& b->owner->enable_state != bp_call_disabled
&& b->address == address /* address / overlay match */
&& (!overlay_debugging || b->section == section)
&& breakpoint_address_is_meaningful (b->owner))
{
/* Have we found a permanent breakpoint? */
if (b->enable_state == bp_permanent)
if (b->owner->enable_state == bp_permanent)
{
perm_bp = b;
break;
}
count++;
b->loc->duplicate = count > 1;
b->duplicate = count > 1;
}
/* If we found a permanent breakpoint at this address, go over the
@ -3850,29 +3867,31 @@ check_duplicates (struct breakpoint *bpt)
duplicates. */
if (perm_bp)
{
perm_bp->loc->duplicate = 0;
perm_bp->duplicate = 0;
/* Permanent breakpoint should always be inserted. */
if (! perm_bp->loc->inserted)
if (! perm_bp->inserted)
internal_error (__FILE__, __LINE__,
"allegedly permanent breakpoint is not "
"actually inserted");
ALL_BREAKPOINTS (b)
ALL_BP_LOCATIONS (b)
if (b != perm_bp)
{
if (b->loc->inserted)
internal_error (__FILE__, __LINE__,
"another breakpoint was inserted on top of "
"a permanent breakpoint");
if (b->owner->enable_state != bp_disabled
&& b->owner->enable_state != bp_shlib_disabled
&& b->owner->enable_state != bp_call_disabled
&& b->address == address /* address / overlay match */
&& (!overlay_debugging || b->section == section)
&& breakpoint_address_is_meaningful (b->owner))
{
if (b->inserted)
internal_error (__FILE__, __LINE__,
"another breakpoint was inserted on top of "
"a permanent breakpoint");
if (b->enable_state != bp_disabled
&& b->enable_state != bp_shlib_disabled
&& b->enable_state != bp_call_disabled
&& b->loc->address == address /* address / overlay match */
&& (!overlay_debugging || b->loc->section == section)
&& breakpoint_address_is_meaningful (b))
b->loc->duplicate = 1;
b->duplicate = 1;
}
}
}
}