This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[patch] Cleanup init_raw_breakpoint
- From: Yao Qi <yao at codesourcery dot com>
- To: gdb-patches at sourceware dot org
- Date: Thu, 10 Nov 2011 15:55:30 +0800
- Subject: [patch] Cleanup init_raw_breakpoint
Hi,
portion of init_raw_breakpoint is quite similar to
add_location_to_breakpoint, except the former is to "set"
bp_location while the later is to "append" bp_location. Beside this
similarity, looks like there is an inconsistency between two
parts about "adjust bp's address prior to allocating the
location" introduced in this patch,
[rfc] Set a breakpoint's type before adjusting its address
http://sourceware.org/ml/gdb-patches/2007-05/msg00039.html
So it is a good idea to move the code into one function
(add_location_to_breakpoint) to remove duplicated code and
inconsistency. This is what this patch is trying to do.
Regression tested on x86_64-linux/native-gdbserver. OK to apply?
--
Yao (éå)
2011-11-09 Yao Qi <yao@codesourcery.com>
* breakpoint.c (init_raw_breakpoint): Call
add_location_to_breakpoint to replace duplicated code.
(add_location_to_breakpoint): Check B->loc which may be NULL.
---
gdb/breakpoint.c | 68 ++++++++++++++++++++++++++---------------------------
1 files changed, 33 insertions(+), 35 deletions(-)
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 8c98bef..ed33eff 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -111,6 +111,9 @@ static void mention (struct breakpoint *);
static struct breakpoint *set_raw_breakpoint_without_location (struct gdbarch *,
enum bptype,
const struct breakpoint_ops *);
+static struct bp_location *add_location_to_breakpoint (struct breakpoint *,
+ const struct symtab_and_line *);
+
/* This function is used in gdbtk sources and thus can not be made
static. */
struct breakpoint *set_raw_breakpoint (struct gdbarch *gdbarch,
@@ -5763,33 +5766,13 @@ init_raw_breakpoint (struct breakpoint *b, struct gdbarch *gdbarch,
struct symtab_and_line sal, enum bptype bptype,
const struct breakpoint_ops *ops)
{
- CORE_ADDR adjusted_address;
- struct gdbarch *loc_gdbarch;
-
init_raw_breakpoint_without_location (b, gdbarch, bptype, ops);
- loc_gdbarch = get_sal_arch (sal);
- if (!loc_gdbarch)
- loc_gdbarch = b->gdbarch;
+ add_location_to_breakpoint (b, &sal);
if (bptype != bp_catchpoint)
gdb_assert (sal.pspace != NULL);
- /* Adjust the breakpoint's address prior to allocating a location.
- Once we call allocate_bp_location(), that mostly uninitialized
- location will be placed on the location chain. Adjustment of the
- breakpoint may cause target_read_memory() to be called and we do
- not want its scan of the location chain to find a breakpoint and
- location that's only been partially initialized. */
- adjusted_address = adjust_breakpoint_address (loc_gdbarch,
- sal.pc, b->type);
-
- b->loc = allocate_bp_location (b);
- b->loc->gdbarch = loc_gdbarch;
- b->loc->requested_address = sal.pc;
- b->loc->address = adjusted_address;
- b->loc->pspace = sal.pspace;
-
/* Store the program space that was used to set the breakpoint, for
breakpoint resetting. */
b->pspace = sal.pspace;
@@ -5798,12 +5781,8 @@ init_raw_breakpoint (struct breakpoint *b, struct gdbarch *gdbarch,
b->source_file = NULL;
else
b->source_file = xstrdup (sal.symtab->filename);
- b->loc->section = sal.section;
b->line_number = sal.line;
- set_breakpoint_location_function (b->loc,
- sal.explicit_pc || sal.explicit_line);
-
breakpoints_changed ();
}
@@ -7096,22 +7075,41 @@ static struct bp_location *
add_location_to_breakpoint (struct breakpoint *b,
const struct symtab_and_line *sal)
{
- struct bp_location *loc, **tmp;
+ struct bp_location *loc;
+ CORE_ADDR adjusted_address;
+ struct gdbarch *loc_gdbarch = get_sal_arch (*sal);
+
+ if (loc_gdbarch == NULL)
+ loc_gdbarch = b->gdbarch;
+
+ /* Adjust the breakpoint's address prior to allocating a location.
+ Once we call allocate_bp_location(), that mostly uninitialized
+ location will be placed on the location chain. Adjustment of the
+ breakpoint may cause target_read_memory() to be called and we do
+ not want its scan of the location chain to find a breakpoint and
+ location that's only been partially initialized. */
+ adjusted_address = adjust_breakpoint_address (loc_gdbarch,
+ sal->pc, b->type);
loc = allocate_bp_location (b);
- for (tmp = &(b->loc); *tmp != NULL; tmp = &((*tmp)->next))
- ;
- *tmp = loc;
- loc->gdbarch = get_sal_arch (*sal);
- if (!loc->gdbarch)
- loc->gdbarch = b->gdbarch;
+
+ if (b->loc == NULL)
+ b->loc = loc;
+ else
+ {
+ struct bp_location **tmp;
+
+ for (tmp = &(b->loc); *tmp != NULL; tmp = &((*tmp)->next))
+ ;
+ *tmp = loc;
+ }
+
loc->requested_address = sal->pc;
- loc->address = adjust_breakpoint_address (loc->gdbarch,
- loc->requested_address, b->type);
+ loc->address = adjusted_address;
loc->pspace = sal->pspace;
gdb_assert (loc->pspace != NULL);
loc->section = sal->section;
-
+ loc->gdbarch = loc_gdbarch;
set_breakpoint_location_function (loc,
sal->explicit_pc || sal->explicit_line);
return loc;
--
1.7.0.4