This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]