2002-11-05 Andrew Cagney <ac131313@redhat.com>
authorAndrew Cagney <cagney@redhat.com>
Tue, 5 Nov 2002 21:44:05 +0000 (21:44 +0000)
committerAndrew Cagney <cagney@redhat.com>
Tue, 5 Nov 2002 21:44:05 +0000 (21:44 +0000)
* gdbarch.sh (GET_SAVED_REGISTER): Change to a predicate function.
* gdbarch.h, gdbarch.c: Regnerate.
* frame.h (frame_register): Declare.
* frame.c (frame_register): New function.
(get_saved_register): Test GET_SAVED_REGISTER_P before calling
GET_SAVED_REGISTER, otherwize call
generic_unwind_get_saved_register.
(frame_register_read): Use frame_register instead of
get_saved_register.

gdb/ChangeLog
gdb/frame.c
gdb/frame.h
gdb/gdbarch.c
gdb/gdbarch.h
gdb/gdbarch.sh

index b1e8d19..f52cb67 100644 (file)
@@ -1,3 +1,15 @@
+2002-11-05  Andrew Cagney  <ac131313@redhat.com>
+
+       * gdbarch.sh (GET_SAVED_REGISTER): Change to a predicate function.
+       * gdbarch.h, gdbarch.c: Regnerate.
+       * frame.h (frame_register): Declare.
+       * frame.c (frame_register): New function.
+       (get_saved_register): Test GET_SAVED_REGISTER_P before calling
+       GET_SAVED_REGISTER, otherwize call
+       generic_unwind_get_saved_register.
+       (frame_register_read): Use frame_register instead of
+       get_saved_register.
+
 2002-11-05  Elena Zannoni  <ezannoni@redhat.com>
 
        * event-loop.c (start_event_loop): Add comment.
index d7d7f0a..0966191 100644 (file)
@@ -125,6 +125,66 @@ frame_register_unwind (struct frame_info *frame, int regnum,
 }
 
 void
+frame_register (struct frame_info *frame, int regnum,
+               int *optimizedp, enum lval_type *lvalp,
+               CORE_ADDR *addrp, int *realnump, void *bufferp)
+{
+  /* Require all but BUFFERP to be valid.  A NULL BUFFERP indicates
+     that the value proper does not need to be fetched.  */
+  gdb_assert (optimizedp != NULL);
+  gdb_assert (lvalp != NULL);
+  gdb_assert (addrp != NULL);
+  gdb_assert (realnump != NULL);
+  /* gdb_assert (bufferp != NULL); */
+
+  /* Ulgh!  Old code that, for lval_register, sets ADDRP to the offset
+     of the register in the register cache.  It should instead return
+     the REGNUM corresponding to that register.  Translate the .  */
+  if (GET_SAVED_REGISTER_P ())
+    {
+      GET_SAVED_REGISTER (bufferp, optimizedp, addrp, frame, regnum, lvalp);
+      /* Compute the REALNUM if the caller wants it.  */
+      if (*lvalp == lval_register)
+       {
+         int regnum;
+         for (regnum = 0; regnum < NUM_REGS + NUM_PSEUDO_REGS; regnum++)
+           {
+             if (*addrp == register_offset_hack (current_gdbarch, regnum))
+               {
+                 *realnump = regnum;
+                 return;
+               }
+           }
+         internal_error (__FILE__, __LINE__,
+                         "Failed to compute the register number corresponding"
+                         " to 0x%s", paddr_d (*addrp));
+       }
+      *realnump = -1;
+      return;
+    }
+
+  /* Reached the the bottom (youngest, inner most) of the frame chain
+     (youngest, inner most) frame, go direct to the hardware register
+     cache (do not pass go, do not try to cache the value, ...).  The
+     unwound value would have been cached in frame->next but that
+     doesn't exist.  This doesn't matter as the hardware register
+     cache is stopping any unnecessary accesses to the target.  */
+
+  /* NOTE: cagney/2002-04-14: It would be nice if, instead of a
+     special case, there was always an inner frame dedicated to the
+     hardware registers.  Unfortunatly, there is too much unwind code
+     around that looks up/down the frame chain while making the
+     assumption that each frame level is using the same unwind code.  */
+
+  if (frame == NULL)
+    frame_register_unwind (NULL, regnum, optimizedp, lvalp, addrp, realnump,
+                          bufferp);
+  else
+    frame_register_unwind (frame->next, regnum, optimizedp, lvalp, addrp,
+                          realnump, bufferp);
+}
+
+void
 frame_unwind_signed_register (struct frame_info *frame, int regnum,
                              LONGEST *val)
 {
@@ -240,7 +300,13 @@ get_saved_register (char *raw_buffer,
                    int regnum,
                    enum lval_type *lval)
 {
-  GET_SAVED_REGISTER (raw_buffer, optimized, addrp, frame, regnum, lval);
+  if (GET_SAVED_REGISTER_P ())
+    {
+      GET_SAVED_REGISTER (raw_buffer, optimized, addrp, frame, regnum, lval);
+      return;
+    }
+  generic_unwind_get_saved_register (raw_buffer, optimized, addrp, frame,
+                                    regnum, lval);
 }
 
 /* frame_register_read ()
@@ -253,9 +319,11 @@ get_saved_register (char *raw_buffer,
 int
 frame_register_read (struct frame_info *frame, int regnum, void *myaddr)
 {
-  int optim;
-  get_saved_register (myaddr, &optim, (CORE_ADDR *) NULL, frame,
-                     regnum, (enum lval_type *) NULL);
+  int optimized;
+  enum lval_type lval;
+  CORE_ADDR addr;
+  int realnum;
+  frame_register (frame, regnum, &optimized, &lval, &addr, &realnum, myaddr);
 
   /* FIXME: cagney/2002-05-15: This test, is just bogus.
 
@@ -267,7 +335,7 @@ frame_register_read (struct frame_info *frame, int regnum, void *myaddr)
   if (register_cached (regnum) < 0)
     return 0;                  /* register value not available */
 
-  return !optim;
+  return !optimized;
 }
 
 
index 89a148e..8fd9244 100644 (file)
@@ -350,6 +350,16 @@ extern void frame_register_unwind (struct frame_info *frame, int regnum,
                                   CORE_ADDR *addrp, int *realnump,
                                   void *valuep);
 
+/* Return the value of the register in this FRAME.  Convenience
+   function that is equivalent to frame_register_unwind
+   (get_next_frame (FRAME), ...).  If VALUEP is NULL, don't
+   fetch/compute the value.  */
+
+extern void frame_register (struct frame_info *frame, int regnum,
+                           int *optimizedp, enum lval_type *lvalp,
+                           CORE_ADDR *addrp, int *realnump,
+                           void *valuep);
+
 /* Unwind FRAME so that the value of register REGNUM, in the previous
    frame is returned.  Simplified versions of frame_register_unwind.  */
 /* NOTE: cagney/2002-09-13: Return void as one day these functions may
index eaa7c47..468726d 100644 (file)
@@ -534,7 +534,6 @@ gdbarch_alloc (const struct gdbarch_info *info,
   current_gdbarch->init_frame_pc_first = init_frame_pc_noop;
   current_gdbarch->init_frame_pc = init_frame_pc_default;
   current_gdbarch->coerce_float_to_double = default_coerce_float_to_double;
-  current_gdbarch->get_saved_register = generic_unwind_get_saved_register;
   current_gdbarch->register_convertible = generic_register_convertible_not;
   current_gdbarch->convert_register_p = legacy_convert_register_p;
   current_gdbarch->register_to_value = legacy_register_to_value;
@@ -718,7 +717,7 @@ verify_gdbarch (struct gdbarch *gdbarch)
   /* Skip verify of init_frame_pc_first, invalid_p == 0 */
   /* Skip verify of init_frame_pc, invalid_p == 0 */
   /* Skip verify of coerce_float_to_double, invalid_p == 0 */
-  /* Skip verify of get_saved_register, invalid_p == 0 */
+  /* Skip verify of get_saved_register, has predicate */
   /* Skip verify of register_convertible, invalid_p == 0 */
   /* Skip verify of register_convert_to_virtual, invalid_p == 0 */
   /* Skip verify of register_convert_to_raw, invalid_p == 0 */
@@ -3678,6 +3677,13 @@ set_gdbarch_coerce_float_to_double (struct gdbarch *gdbarch,
   gdbarch->coerce_float_to_double = coerce_float_to_double;
 }
 
+int
+gdbarch_get_saved_register_p (struct gdbarch *gdbarch)
+{
+  gdb_assert (gdbarch != NULL);
+  return gdbarch->get_saved_register != 0;
+}
+
 void
 gdbarch_get_saved_register (struct gdbarch *gdbarch, char *raw_buffer, int *optimized, CORE_ADDR *addrp, struct frame_info *frame, int regnum, enum lval_type *lval)
 {
index 3add874..a2fa465 100644 (file)
@@ -1210,9 +1210,29 @@ extern void set_gdbarch_coerce_float_to_double (struct gdbarch *gdbarch, gdbarch
 #endif
 #endif
 
+#if defined (GET_SAVED_REGISTER)
+/* Legacy for systems yet to multi-arch GET_SAVED_REGISTER */
+#if !defined (GET_SAVED_REGISTER_P)
+#define GET_SAVED_REGISTER_P() (1)
+#endif
+#endif
+
+/* Default predicate for non- multi-arch targets. */
+#if (!GDB_MULTI_ARCH) && !defined (GET_SAVED_REGISTER_P)
+#define GET_SAVED_REGISTER_P() (0)
+#endif
+
+extern int gdbarch_get_saved_register_p (struct gdbarch *gdbarch);
+#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) && defined (GET_SAVED_REGISTER_P)
+#error "Non multi-arch definition of GET_SAVED_REGISTER"
+#endif
+#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) || !defined (GET_SAVED_REGISTER_P)
+#define GET_SAVED_REGISTER_P() (gdbarch_get_saved_register_p (current_gdbarch))
+#endif
+
 /* Default (function) for non- multi-arch platforms. */
 #if (!GDB_MULTI_ARCH) && !defined (GET_SAVED_REGISTER)
-#define GET_SAVED_REGISTER(raw_buffer, optimized, addrp, frame, regnum, lval) (generic_unwind_get_saved_register (raw_buffer, optimized, addrp, frame, regnum, lval))
+#define GET_SAVED_REGISTER(raw_buffer, optimized, addrp, frame, regnum, lval) (internal_error (__FILE__, __LINE__, "GET_SAVED_REGISTER"), 0)
 #endif
 
 typedef void (gdbarch_get_saved_register_ftype) (char *raw_buffer, int *optimized, CORE_ADDR *addrp, struct frame_info *frame, int regnum, enum lval_type *lval);
index 4ed80c3..f7f9a66 100755 (executable)
@@ -508,7 +508,7 @@ f:2:INIT_FRAME_PC:void:init_frame_pc:int fromleaf, struct frame_info *prev:froml
 v:2:BELIEVE_PCC_PROMOTION:int:believe_pcc_promotion:::::::
 v:2:BELIEVE_PCC_PROMOTION_TYPE:int:believe_pcc_promotion_type:::::::
 f:2:COERCE_FLOAT_TO_DOUBLE:int:coerce_float_to_double:struct type *formal, struct type *actual:formal, actual:::default_coerce_float_to_double::0
-f:2:GET_SAVED_REGISTER:void:get_saved_register:char *raw_buffer, int *optimized, CORE_ADDR *addrp, struct frame_info *frame, int regnum, enum lval_type *lval:raw_buffer, optimized, addrp, frame, regnum, lval:::generic_unwind_get_saved_register::0
+F:2:GET_SAVED_REGISTER:void:get_saved_register:char *raw_buffer, int *optimized, CORE_ADDR *addrp, struct frame_info *frame, int regnum, enum lval_type *lval:raw_buffer, optimized, addrp, frame, regnum, lval
 #
 f:2:REGISTER_CONVERTIBLE:int:register_convertible:int nr:nr:::generic_register_convertible_not::0
 f:2:REGISTER_CONVERT_TO_VIRTUAL:void:register_convert_to_virtual:int regnum, struct type *type, char *from, char *to:regnum, type, from, to:::0::0