gdb:
authorYao Qi <yao@codesourcery.com>
Tue, 13 Mar 2012 01:16:07 +0000 (01:16 +0000)
committerYao Qi <yao@codesourcery.com>
Tue, 13 Mar 2012 01:16:07 +0000 (01:16 +0000)
* inferior.h (struct inferior): Remove fields any_syscall_count,
syscalls_counts and total_syscalls_count.  Move them to new
struct catch_syscall_inferior_data in breakpoint.c.
* breakpoint.c: Call DEF_VEC_I(int).
(struct catch_syscall_inferior_data): New.
(get_catch_syscall_inferior_data): New.
(catch_syscall_inferior_data_cleanup): New.
(insert_catch_syscall): Update to access data in
struct catch_syscall_inferior_data.
(insert_catch_syscall): Likewise.
(remove_catch_syscall): Likewise.
(remove_catch_syscall): Likewise.
(is_syscall_catchpoint_enabled): Likewise.
(add_catch_command): Likewise.
(_initialize_breakpoint): Register cleanup.
* breakpoint.h: Removed DEF_VEC_I(int).
* dwarf2loc.c: Call DEF_VEC_I(int).
* mi/mi-main.c: Likewise.

gdb/ChangeLog
gdb/breakpoint.c
gdb/breakpoint.h
gdb/dwarf2loc.c
gdb/inferior.h
gdb/mi/mi-main.c

index f1ead02a03c8b862ae2c3128021e8d090f54b68c..42fb1a5b7448e72b283266a8758e414cdbe9ae74 100644 (file)
@@ -1,3 +1,24 @@
+2012-03-13  Yao Qi  <yao@codesourcery.com>
+
+       * inferior.h (struct inferior): Remove fields any_syscall_count,
+       syscalls_counts and total_syscalls_count.  Move them to new
+       struct catch_syscall_inferior_data in breakpoint.c.
+       * breakpoint.c: Call DEF_VEC_I(int).
+       (struct catch_syscall_inferior_data): New.
+       (get_catch_syscall_inferior_data): New.
+       (catch_syscall_inferior_data_cleanup): New.
+       (insert_catch_syscall): Update to access data in
+       struct catch_syscall_inferior_data.
+       (insert_catch_syscall): Likewise.
+       (remove_catch_syscall): Likewise.
+       (remove_catch_syscall): Likewise.
+       (is_syscall_catchpoint_enabled): Likewise.
+       (add_catch_command): Likewise.
+       (_initialize_breakpoint): Register cleanup.
+       * breakpoint.h: Removed DEF_VEC_I(int).
+       * dwarf2loc.c: Call DEF_VEC_I(int).
+       * mi/mi-main.c: Likewise.
+
 2012-03-12  Mark Kettenis  <kettenis@gnu.org>
 
        * inf-ptrace.c (inf_ptrace_post_attach): Make static.
index 1158f0e229b24ea63087b60bae438696c5fe01da..baccfb3528c3f1ad105c0661ca349fd982593d3a 100644 (file)
@@ -7374,6 +7374,8 @@ catch_unload_command_1 (char *arg, int from_tty,
   catch_load_or_unload (arg, from_tty, 0, command);
 }
 
+DEF_VEC_I(int);
+
 /* An instance of this type is used to represent a syscall catchpoint.
    It includes a "struct breakpoint" as a kind of base class; users
    downcast to "struct breakpoint *" when needed.  A breakpoint is
@@ -7405,6 +7407,47 @@ dtor_catch_syscall (struct breakpoint *b)
   base_breakpoint_ops.dtor (b);
 }
 
+static const struct inferior_data *catch_syscall_inferior_data = NULL;
+
+struct catch_syscall_inferior_data
+{
+  /* We keep a count of the number of times the user has requested a
+     particular syscall to be tracked, and pass this information to the
+     target.  This lets capable targets implement filtering directly.  */
+
+  /* Number of times that "any" syscall is requested.  */
+  int any_syscall_count;
+
+  /* Count of each system call.  */
+  VEC(int) *syscalls_counts;
+
+  /* This counts all syscall catch requests, so we can readily determine
+     if any catching is necessary.  */
+  int total_syscalls_count;
+};
+
+static struct catch_syscall_inferior_data*
+get_catch_syscall_inferior_data (struct inferior *inf)
+{
+  struct catch_syscall_inferior_data *inf_data;
+
+  inf_data = inferior_data (inf, catch_syscall_inferior_data);
+  if (inf_data == NULL)
+    {
+      inf_data = XZALLOC (struct catch_syscall_inferior_data);
+      set_inferior_data (inf, catch_syscall_inferior_data, inf_data);
+    }
+
+  return inf_data;
+}
+
+static void
+catch_syscall_inferior_data_cleanup (struct inferior *inf, void *arg)
+{
+  xfree (arg);
+}
+
+
 /* Implement the "insert" breakpoint_ops method for syscall
    catchpoints.  */
 
@@ -7413,10 +7456,12 @@ insert_catch_syscall (struct bp_location *bl)
 {
   struct syscall_catchpoint *c = (struct syscall_catchpoint *) bl->owner;
   struct inferior *inf = current_inferior ();
+  struct catch_syscall_inferior_data *inf_data
+    = get_catch_syscall_inferior_data (inf);
 
-  ++inf->total_syscalls_count;
+  ++inf_data->total_syscalls_count;
   if (!c->syscalls_to_be_caught)
-    ++inf->any_syscall_count;
+    ++inf_data->any_syscall_count;
   else
     {
       int i, iter;
@@ -7427,28 +7472,31 @@ insert_catch_syscall (struct bp_location *bl)
        {
           int elem;
 
-         if (iter >= VEC_length (int, inf->syscalls_counts))
+         if (iter >= VEC_length (int, inf_data->syscalls_counts))
            {
-              int old_size = VEC_length (int, inf->syscalls_counts);
+              int old_size = VEC_length (int, inf_data->syscalls_counts);
               uintptr_t vec_addr_offset
                = old_size * ((uintptr_t) sizeof (int));
               uintptr_t vec_addr;
-              VEC_safe_grow (int, inf->syscalls_counts, iter + 1);
-              vec_addr = (uintptr_t) VEC_address (int, inf->syscalls_counts) +
-               vec_addr_offset;
+              VEC_safe_grow (int, inf_data->syscalls_counts, iter + 1);
+              vec_addr = ((uintptr_t) VEC_address (int,
+                                                 inf_data->syscalls_counts)
+                         + vec_addr_offset);
               memset ((void *) vec_addr, 0,
                       (iter + 1 - old_size) * sizeof (int));
            }
-          elem = VEC_index (int, inf->syscalls_counts, iter);
-          VEC_replace (int, inf->syscalls_counts, iter, ++elem);
+          elem = VEC_index (int, inf_data->syscalls_counts, iter);
+          VEC_replace (int, inf_data->syscalls_counts, iter, ++elem);
        }
     }
 
   return target_set_syscall_catchpoint (PIDGET (inferior_ptid),
-                                       inf->total_syscalls_count != 0,
-                                       inf->any_syscall_count,
-                                       VEC_length (int, inf->syscalls_counts),
-                                       VEC_address (int, inf->syscalls_counts));
+                                       inf_data->total_syscalls_count != 0,
+                                       inf_data->any_syscall_count,
+                                       VEC_length (int,
+                                                   inf_data->syscalls_counts),
+                                       VEC_address (int,
+                                                    inf_data->syscalls_counts));
 }
 
 /* Implement the "remove" breakpoint_ops method for syscall
@@ -7459,10 +7507,12 @@ remove_catch_syscall (struct bp_location *bl)
 {
   struct syscall_catchpoint *c = (struct syscall_catchpoint *) bl->owner;
   struct inferior *inf = current_inferior ();
+  struct catch_syscall_inferior_data *inf_data
+    = get_catch_syscall_inferior_data (inf);
 
-  --inf->total_syscalls_count;
+  --inf_data->total_syscalls_count;
   if (!c->syscalls_to_be_caught)
-    --inf->any_syscall_count;
+    --inf_data->any_syscall_count;
   else
     {
       int i, iter;
@@ -7472,20 +7522,21 @@ remove_catch_syscall (struct bp_location *bl)
            i++)
        {
           int elem;
-         if (iter >= VEC_length (int, inf->syscalls_counts))
+         if (iter >= VEC_length (int, inf_data->syscalls_counts))
            /* Shouldn't happen.  */
            continue;
-          elem = VEC_index (int, inf->syscalls_counts, iter);
-          VEC_replace (int, inf->syscalls_counts, iter, --elem);
+          elem = VEC_index (int, inf_data->syscalls_counts, iter);
+          VEC_replace (int, inf_data->syscalls_counts, iter, --elem);
         }
     }
 
   return target_set_syscall_catchpoint (PIDGET (inferior_ptid),
-                                       inf->total_syscalls_count != 0,
-                                       inf->any_syscall_count,
-                                       VEC_length (int, inf->syscalls_counts),
+                                       inf_data->total_syscalls_count != 0,
+                                       inf_data->any_syscall_count,
+                                       VEC_length (int,
+                                                   inf_data->syscalls_counts),
                                        VEC_address (int,
-                                                    inf->syscalls_counts));
+                                                    inf_data->syscalls_counts));
 }
 
 /* Implement the "breakpoint_hit" breakpoint_ops method for syscall
@@ -14060,9 +14111,10 @@ is_syscall_catchpoint_enabled (struct breakpoint *bp)
 int
 catch_syscall_enabled (void)
 {
-  struct inferior *inf = current_inferior ();
+  struct catch_syscall_inferior_data *inf_data
+    = get_catch_syscall_inferior_data (current_inferior ());
 
-  return inf->total_syscalls_count != 0;
+  return inf_data->total_syscalls_count != 0;
 }
 
 int
@@ -14727,9 +14779,12 @@ add_catch_command (char *name, char *docstring,
 static void
 clear_syscall_counts (struct inferior *inf)
 {
-  inf->total_syscalls_count = 0;
-  inf->any_syscall_count = 0;
-  VEC_free (int, inf->syscalls_counts);
+  struct catch_syscall_inferior_data *inf_data
+    = get_catch_syscall_inferior_data (inf);
+
+  inf_data->total_syscalls_count = 0;
+  inf_data->any_syscall_count = 0;
+  VEC_free (int, inf_data->syscalls_counts);
 }
 
 static void
@@ -14982,6 +15037,9 @@ _initialize_breakpoint (void)
 
   breakpoint_objfile_key = register_objfile_data ();
 
+  catch_syscall_inferior_data
+    = register_inferior_data_with_cleanup (catch_syscall_inferior_data_cleanup);
+
   breakpoint_chain = 0;
   /* Don't bother to call set_breakpoint_count.  $bpnum isn't useful
      before a breakpoint is set.  */
index 5b5172ee6b4f77ad63b67e24ed5021bc3afcc527..b92b72ccf6ad29c8097a1985d33caafcafa264b9 100644 (file)
@@ -583,9 +583,6 @@ enum watchpoint_triggered
   watch_triggered_yes  
 };
 
-/* This is used to declare the VEC syscalls_to_be_caught.  */
-DEF_VEC_I(int);
-
 typedef struct bp_location *bp_location_p;
 DEF_VEC_P(bp_location_p);
 
index ebd34529abdd7f0516431eae999abc73dcf11a04..8f106813aa7da6f8fd2cdb0a4b728a970b23479c 100644 (file)
@@ -42,6 +42,8 @@
 #include "gdb_string.h"
 #include "gdb_assert.h"
 
+DEF_VEC_I(int);
+
 extern int dwarf2_always_disassemble;
 
 static void dwarf_expr_frame_base_1 (struct symbol *framefunc, CORE_ADDR pc,
index 156311171098741533551374b12c4f87dc2b09e3..63245a24a9ac643df178af37a7509fdcf67523bc 100644 (file)
@@ -502,20 +502,6 @@ struct inferior
   int has_exit_code;
   LONGEST exit_code;
 
-  /* We keep a count of the number of times the user has requested a
-     particular syscall to be tracked, and pass this information to the
-     target.  This lets capable targets implement filtering directly.  */
-
-  /* Number of times that "any" syscall is requested.  */
-  int any_syscall_count;
-
-  /* Count of each system call.  */
-  VEC(int) *syscalls_counts;
-
-  /* This counts all syscall catch requests, so we can readily determine
-     if any catching is necessary.  */
-  int total_syscalls_count;
-
   /* Default flags to pass to the symbol reading functions.  These are
      used whenever a new objfile is created.  The valid values come
      from enum symfile_add_flags.  */
index a03e230806f038bec226281414069d61bcc399e1..787d2475de2d186a98c01af90a80d2b802c4e2ac 100644 (file)
@@ -508,6 +508,8 @@ mi_cmd_thread_info (char *command, char **argv, int argc)
   print_thread_info (current_uiout, argv[0], -1);
 }
 
+DEF_VEC_I(int);
+
 struct collect_cores_data
 {
   int pid;