Get rid of the global "base_target" and use "find_target_beneath"
authorJoel Brobecker <brobecker@gnat.com>
Thu, 5 Mar 2009 23:37:20 +0000 (23:37 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Thu, 5 Mar 2009 23:37:20 +0000 (23:37 +0000)
        to find the underlying target.
        * dec-thread.c (base_target): Delete.
        (enable_dec_thread): Remove assignement to base_target.
        (dec_thread_detach, dec_thread_wait, dec_thread_wait)
        (dec_thread_fetch_registers, dec_thread_store_registers)
        (dec_thread_mourn_inferior, dec_thread_pid_to_str):
        Update the function profile if necessary.
        Use find_target_beneath to call the same method but from
        the underlying target, removing the need for "base_target".

        * dec-thread.c (dec_thread_get_regsets, dec_thread_set_regsets):
        Fix a copy/paste error in a few debug traces...

        * solib-osf.c (init_so): Use a simpler method for computing
        the size of lm_info structure. This also gets rid of warning
        emitted by the compiler.

gdb/ChangeLog
gdb/dec-thread.c
gdb/solib-osf.c

index ecb0acb9129b963c38eb4e40fcfe3187761e8dc3..cbacc27c3d8cca2edfcc08b4d963513f81bee55e 100644 (file)
@@ -1,3 +1,23 @@
+2009-03-05  Joel Brobecker  <brobecker@adacore.com>
+
+       Get rid of the global "base_target" and use "find_target_beneath"
+       to find the underlying target.
+       * dec-thread.c (base_target): Delete.
+       (enable_dec_thread): Remove assignement to base_target.
+       (dec_thread_detach, dec_thread_wait, dec_thread_wait)
+       (dec_thread_fetch_registers, dec_thread_store_registers)
+       (dec_thread_mourn_inferior, dec_thread_pid_to_str):
+       Update the function profile if necessary.
+       Use find_target_beneath to call the same method but from
+       the underlying target, removing the need for "base_target".
+
+       * dec-thread.c (dec_thread_get_regsets, dec_thread_set_regsets):
+       Fix a copy/paste error in a few debug traces...
+
+       * solib-osf.c (init_so): Use a simpler method for computing
+       the size of lm_info structure. This also gets rid of warning
+       emitted by the compiler.
+
 2009-03-05  Pedro Alves  <pedro@codesourcery.com>
 
        * breakpoint.c (check_duplicates_for): Skip permanent breakpoints
index 8398e8d266a7bbb4f2104c4f1e267acb138cb777..95f2f52618a6d8d46a1d7647202ebdafa96df5b2 100644 (file)
@@ -40,9 +40,6 @@ pthreadDebugContext_t debug_context;
 /* The dec-thread target_ops structure.  */
 static struct target_ops dec_thread_ops;
 
-/* A copy of the target_ops over which our dec_thread_ops is pushed.  */
-static struct target_ops base_target;
-
 /* Print a debug trace if DEBUG_DEC_THREAD is set (its value is adjusted
    by the user using "set debug dec-thread ...").  */
 
@@ -253,7 +250,6 @@ enable_dec_thread (void)
       return;
     }
 
-  base_target = current_target;
   push_target (&dec_thread_ops);
   dec_thread_active = 1;
 
@@ -424,12 +420,14 @@ resync_thread_list (void)
 /* The "to_detach" method of the dec_thread_ops.  */
 
 static void
-dec_thread_detach (char *args, int from_tty)
+dec_thread_detach (struct target_ops *ops, char *args, int from_tty)
 {   
+  struct target_ops *beneath = find_target_beneath (ops);
+
   debug ("dec_thread_detach");
 
   disable_dec_thread ();
-  base_target.to_detach (&base_target, args, from_tty);
+  beneath->to_detach (beneath, args, from_tty);
 }
 
 /* Return the ptid of the thread that is currently active.  */
@@ -457,14 +455,14 @@ dec_thread_wait (struct target_ops *ops,
                 ptid_t ptid, struct target_waitstatus *status)
 {
   ptid_t active_ptid;
+  struct target_ops *beneath = find_target_beneath (ops);
 
   debug ("dec_thread_wait");
 
-  ptid = base_target.to_wait (&base_target, ptid, status);
+  ptid = beneath->to_wait (beneath, ptid, status);
 
-  /* The ptid returned by the base_target is the ptid of the process.
-     We need to find which thread is currently active and return its
-     ptid.  */
+  /* The ptid returned by the target beneath us is the ptid of the process.
+     We need to find which thread is currently active and return its ptid.  */
   resync_thread_list ();
   active_ptid = get_active_ptid ();
   if (ptid_equal (active_ptid, null_ptid))
@@ -487,7 +485,7 @@ dec_thread_get_regsets (pthreadDebugId_t tid, gdb_gregset_t *gregset,
   res = pthreadDebugThdGetReg (debug_context, tid, &regs);
   if (res != ESUCCESS)
     {
-      debug ("dec_thread_fetch_registers: pthreadDebugThdGetReg -> %d", res);
+      debug ("dec_thread_get_regsets: pthreadDebugThdGetReg -> %d", res);
       return -1;
     }
   memcpy (gregset->regs, &regs, sizeof (regs));
@@ -495,7 +493,7 @@ dec_thread_get_regsets (pthreadDebugId_t tid, gdb_gregset_t *gregset,
   res = pthreadDebugThdGetFreg (debug_context, tid, &fregs);
   if (res != ESUCCESS)
     {
-      debug ("dec_thread_fetch_registers: pthreadDebugThdGetFreg -> %d", res);
+      debug ("dec_thread_get_regsets: pthreadDebugThdGetFreg -> %d", res);
       return -1;
     }
   memcpy (fpregset->regs, &fregs, sizeof (fregs));
@@ -510,7 +508,8 @@ dec_thread_get_regsets (pthreadDebugId_t tid, gdb_gregset_t *gregset,
    registers.  */
 
 static void
-dec_thread_fetch_registers (struct regcache *regcache, int regno)
+dec_thread_fetch_registers (struct target_ops *ops,
+                            struct regcache *regcache, int regno)
 {
   pthreadDebugId_t tid = ptid_get_tid (inferior_ptid);
   gregset_t gregset;
@@ -522,7 +521,9 @@ dec_thread_fetch_registers (struct regcache *regcache, int regno)
 
   if (tid == 0 || ptid_equal (inferior_ptid, get_active_ptid ()))
     {
-      base_target.to_fetch_registers (regcache, regno);
+      struct target_ops *beneath = find_target_beneath (ops);
+
+      beneath->to_fetch_registers (beneath, regcache, regno);
       return;
     }
 
@@ -550,7 +551,7 @@ dec_thread_set_regsets (pthreadDebugId_t tid, gdb_gregset_t gregset,
   res = pthreadDebugThdSetReg (debug_context, tid, &regs);
   if (res != ESUCCESS)
     {
-      debug ("dec_thread_fetch_registers: pthreadDebugThdSetReg -> %d", res);
+      debug ("dec_thread_set_regsets: pthreadDebugThdSetReg -> %d", res);
       return -1;
     }
 
@@ -558,7 +559,7 @@ dec_thread_set_regsets (pthreadDebugId_t tid, gdb_gregset_t gregset,
   res = pthreadDebugThdSetFreg (debug_context, tid, &fregs);
   if (res != ESUCCESS)
     {
-      debug ("dec_thread_fetch_registers: pthreadDebugThdSetFreg -> %d", res);
+      debug ("dec_thread_set_regsets: pthreadDebugThdSetFreg -> %d", res);
       return -1;
     }
 
@@ -571,7 +572,8 @@ dec_thread_set_regsets (pthreadDebugId_t tid, gdb_gregset_t gregset,
    just one register, we store all the registers.  */
 
 static void
-dec_thread_store_registers (struct regcache *regcache, int regno)
+dec_thread_store_registers (struct target_ops *ops,
+                            struct regcache *regcache, int regno)
 {
   pthreadDebugId_t tid = ptid_get_tid (inferior_ptid);
   gregset_t gregset;
@@ -582,7 +584,9 @@ dec_thread_store_registers (struct regcache *regcache, int regno)
 
   if (tid == 0 || ptid_equal (inferior_ptid, get_active_ptid ()))
     {
-      base_target.to_store_registers (regcache, regno);
+      struct target_ops *beneath = find_target_beneath (ops);
+
+      beneath->to_store_registers (beneath, regcache, regno);
       return;
     }
 
@@ -601,17 +605,19 @@ dec_thread_store_registers (struct regcache *regcache, int regno)
 /* The "to_mourn_inferior" method of the dec_thread_ops.  */
 
 static void
-dec_thread_mourn_inferior (void)
+dec_thread_mourn_inferior (struct target_ops *ops)
 {
+  struct target_ops *beneath = find_target_beneath (ops);
+
   debug ("dec_thread_mourn_inferior");
 
   disable_dec_thread ();
-  base_target.to_mourn_inferior (&base_target);
+  beneath->to_mourn_inferior (beneath);
 }
 
 /* The "to_thread_alive" method of the dec_thread_ops.  */
 static int
-dec_thread_thread_alive (ptid_t ptid)
+dec_thread_thread_alive (struct target_ops *ops, ptid_t ptid)
 {
   debug ("dec_thread_thread_alive (tid=%ld)", ptid_get_tid (ptid));
 
@@ -628,7 +634,11 @@ dec_thread_pid_to_str (struct target_ops *ops, ptid_t ptid)
   static char *ret = NULL;
 
   if (ptid_get_tid (ptid) == 0)
-    return base_target.to_pid_to_str (&base_target, ptid);
+    {
+      struct target_ops *beneath = find_target_beneath (ops);
+
+      return beneath->to_pid_to_str (beneath, ptid);
+    }
 
   /* Free previous return value; a new one will be allocated by
      xstrprintf().  */
index 9fd52f8393c8c0a282c66656b60d053e8c732d84..dec737b8caa8bbd811c698150ebaa7de198a4d2f 100644 (file)
@@ -424,8 +424,8 @@ init_so (struct so_list *so, char *name, int isloader, int nsecs)
   memcpy (so->so_name, so->so_original_name, namelen + 1);
 
   /* Allocate section space.  */
-  so->lm_info = xmalloc ((unsigned) &(((struct lm_info *)0)->secs) +
-                        nsecs * sizeof *so->lm_info);
+  so->lm_info = xmalloc (sizeof (struct lm_info)
+                         + (nsecs - 1) * sizeof (struct lm_sec));
   so->lm_info->isloader = isloader;
   so->lm_info->nsecs = nsecs;
   for (i = 0; i < nsecs; i++)