* config/m88k/tm-m88k.h: Fix typo in comment.
authorK. Richard Pixley <rich@cygnus>
Tue, 17 Aug 1993 22:21:50 +0000 (22:21 +0000)
committerK. Richard Pixley <rich@cygnus>
Tue, 17 Aug 1993 22:21:50 +0000 (22:21 +0000)
  (FP_REGNUM): define in terms of SP_REGNUM
  rather than by absolute number.  Also clearly comment that this
  is a convenient lie in order to decrease future confusion.
  (ACTUAL_FP_REGNUM): new macro for FP.
  (FRAME_CHAIN_VALID): removed.  Standard default works fine.
* m88k-tdep.c (frame_chain_valid): redundant, so removed.
  (NEXT_PROLOGUE_INSN): removed unused fourth arg, fixed all
  callers.
  (read_next_frame_reg): declare static.
  (examine_prologue): removed unused variabel insn2, rename insn1
  to insn, rewrote comment about finding fp, sp, etc. set frame_fp
  based on ACTUAL_FP_REGNUM rather than FP_REGNUM which is
  actually a scammed alias for SP_REGNUM on m88k.

gdb/ChangeLog
gdb/config/m88k/tm-m88k.h
gdb/m88k-tdep.c

index 05d5f261f4f2a88645c165e590b40f102aee5840..643efe74d3556c7c0e55f2a387603eec96775ab4 100644 (file)
@@ -1,5 +1,20 @@
 Tue Aug 17 15:10:04 1993  K. Richard Pixley  (rich@sendai.cygnus.com)
 
+       * config/m88k/tm-m88k.h: Fix typo in comment.
+         (FP_REGNUM): define in terms of SP_REGNUM
+         rather than by absolute number.  Also clearly comment that this
+         is a convenient lie in order to decrease future confusion.
+         (ACTUAL_FP_REGNUM): new macro for FP.
+         (FRAME_CHAIN_VALID): removed.  Standard default works fine.
+       * m88k-tdep.c (frame_chain_valid): redundant, so removed.
+         (NEXT_PROLOGUE_INSN): removed unused fourth arg, fixed all
+         callers.
+         (read_next_frame_reg): declare static.
+         (examine_prologue): removed unused variabel insn2, rename insn1
+         to insn, rewrote comment about finding fp, sp, etc. set frame_fp
+         based on ACTUAL_FP_REGNUM rather than FP_REGNUM which is
+         actually a scammed alias for SP_REGNUM on m88k. 
+
        * frame.h: fixed typo in comment.
 
 Tue Aug 17 11:14:25 1993  Jim Kingdon  (kingdon@lioth.cygnus.com)
index b960a6484dc14aa4e3bbb8b68fda646ee9517f68..a9ca9cb15c00badbf27782d900aaeab74e16d6fa 100644 (file)
@@ -188,7 +188,6 @@ extern CORE_ADDR skip_prologue ();
 #define SRP_REGNUM 1           /* Contains subroutine return pointer */
 #define RV_REGNUM 2            /* Contains simple return values */
 #define SRA_REGNUM 12          /* Contains address of struct return values */
-#define FP_REGNUM 31           /* Reg fetched to locate frame when pgm stops */
 #define SP_REGNUM 31           /* Contains address of top of stack */
 #define SXIP_REGNUM 35         /* Contains Shadow Execute Instruction Pointer */
 #define SNIP_REGNUM 36         /* Contains Shadow Next Instruction Pointer */
@@ -200,6 +199,15 @@ extern CORE_ADDR skip_prologue ();
 #define SFIP_REGNUM 37         /* Contains Shadow Fetched Intruction pointer */
 #define NNPC_REGNUM SFIP_REGNUM /* Next Next Program Counter */
 
+/* This is rather a confusing lie.  Our m88k port using a stack pointer value
+   for the frame address.  Hence, the frame address and the frame pointer are
+   only indirectly related.  The value of this macro is the register number
+   fetched by the machine "independent" portions of gdb when they want to know
+   about a frame address.  Thus, we lie here and claim that FP_REGNUM is
+   SP_REGNUM.  */
+#define FP_REGNUM SP_REGNUM    /* Reg fetched to locate frame when pgm stops */
+#define ACTUAL_FP_REGNUM 30
+
 /* PSR status bit definitions.  */
 
 #define PSR_MODE               0x80000000
@@ -317,9 +325,6 @@ extern int frameless_function_invocation ();
 #define FRAME_CHAIN(thisframe) \
        frame_chain (thisframe)
 
-#define FRAME_CHAIN_VALID(chain, thisframe)    \
-       frame_chain_valid (chain, thisframe)
-
 #define        FRAMELESS_FUNCTION_INVOCATION(frame, fromleaf)  \
        fromleaf = frameless_function_invocation (frame)
 
@@ -373,7 +378,7 @@ extern CORE_ADDR frame_locals_address ();
 
    We could manage to locate values for all of the so called "preserved"
    registers (some of which may get saved within any particular frame) but
-   that would require decoding all of the tdesc information.  Tht would be
+   that would require decoding all of the tdesc information.  That would be
    nice information for GDB to have, but it is not strictly manditory if we
    can live without the ability to look at values within (or backup to)
    previous frames.
index 1ebc893a9b987d13ab83bd7ddec6cc3275d7b7cd..b7907d9668de1ef6eaf0fb032496727a1aab8050 100644 (file)
@@ -88,15 +88,6 @@ frameless_function_invocation (frame)
     return 1;                  /* Frameless -- no saved return address */
 }
 
-int
-frame_chain_valid (chain, thisframe)
-     CORE_ADDR chain;
-     struct frame_info *thisframe;
-{
-  return (chain != 0
-       && !inside_entry_file (FRAME_SAVED_PC (thisframe)));
-}
-
 void
 init_extra_frame_info (fromleaf, fi)
      int fromleaf;
@@ -166,7 +157,7 @@ static struct pic_prologue_code pic_prologue_code [] = {
    of the instruction.  PWORD2 is ignored -- a remnant of the original
    i960 version.  */
 
-#define NEXT_PROLOGUE_INSN(addr, lim, pword1, pword2) \
+#define NEXT_PROLOGUE_INSN(addr, lim, pword1) \
   (((addr) < (lim)) ? next_insn (addr, pword1) : 0)
 
 /* Read the m88k instruction at 'memaddr' and return the address of 
@@ -187,7 +178,7 @@ next_insn (memaddr, pword1)
 
 /* Read a register from frames called by us (or from the hardware regs).  */
 
-int
+static int
 read_next_frame_reg(fi, regno)
      FRAME fi;
      int regno;
@@ -220,7 +211,7 @@ examine_prologue (ip, limit, frame_sp, fsr, fi)
   register CORE_ADDR next_ip;
   register int src;
   register struct pic_prologue_code *pcode;
-  unsigned int insn1, insn2;
+  unsigned int insn;
   int size, offset;
   char must_adjust[32];                /* If set, must adjust offsets in fsr */
   int sp_offset = -1;          /* -1 means not set (valid must be mult of 8) */
@@ -228,7 +219,7 @@ examine_prologue (ip, limit, frame_sp, fsr, fi)
   CORE_ADDR frame_fp;
 
   bzero (must_adjust, sizeof (must_adjust));
-  next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn1, &insn2);
+  next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn);
 
   /* Accept move of incoming registers to other registers, using
      "or rd,rs,0" or "or.u rd,rs,0" or "or rd,r0,rs" or "or rd,rs,r0".
@@ -243,9 +234,9 @@ examine_prologue (ip, limit, frame_sp, fsr, fi)
 #define        OR_REG_MOVE2_INSN       0xF4005800      /* or rd,rs,r0 */
 #define        OR_REG_MOVE2_MASK       0xFC00FFFF
   while (next_ip && 
-        ((insn1 & OR_MOVE_MASK) == OR_MOVE_INSN ||
-         (insn1 & OR_REG_MOVE1_MASK) == OR_REG_MOVE1_INSN ||
-         (insn1 & OR_REG_MOVE2_MASK) == OR_REG_MOVE2_INSN
+        ((insn & OR_MOVE_MASK) == OR_MOVE_INSN ||
+         (insn & OR_REG_MOVE1_MASK) == OR_REG_MOVE1_INSN ||
+         (insn & OR_REG_MOVE2_MASK) == OR_REG_MOVE2_INSN
         )
        )
     {
@@ -253,7 +244,7 @@ examine_prologue (ip, limit, frame_sp, fsr, fi)
         has already been reflected in what the compiler tells us is the
         location of these parameters.  */
       ip = next_ip;
-      next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn1, &insn2);
+      next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn);
     }
 
   /* Accept an optional "subu sp,sp,n" to set up the stack pointer.  */
@@ -262,11 +253,11 @@ examine_prologue (ip, limit, frame_sp, fsr, fi)
 #define        SUBU_SP_MASK    0xffff0007      /* Note offset must be mult. of 8 */
 #define        SUBU_OFFSET(x)  ((unsigned)(x & 0xFFFF))
   if (next_ip &&
-      ((insn1 & SUBU_SP_MASK) == SUBU_SP_INSN))        /* subu r31, r31, N */
+      ((insn & SUBU_SP_MASK) == SUBU_SP_INSN)) /* subu r31, r31, N */
     {
-      sp_offset = -SUBU_OFFSET (insn1);
+      sp_offset = -SUBU_OFFSET (insn);
       ip = next_ip;
-      next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn1, &insn2);
+      next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn);
     }
 
   /* The function must start with a stack-pointer adjustment, or
@@ -291,15 +282,15 @@ examine_prologue (ip, limit, frame_sp, fsr, fi)
 
   while (next_ip)
     {
-           if ((insn1 & ST_STACK_MASK)  == ST_STACK_INSN)
+           if ((insn & ST_STACK_MASK)  == ST_STACK_INSN)
        size = 1;
-      else if ((insn1 & STD_STACK_MASK) == STD_STACK_INSN)
+      else if ((insn & STD_STACK_MASK) == STD_STACK_INSN)
        size = 2;
       else
        break;
 
-      src = ST_SRC (insn1);
-      offset = ST_OFFSET (insn1);
+      src = ST_SRC (insn);
+      offset = ST_OFFSET (insn);
       while (size--)
        {
          must_adjust[src] = 1;
@@ -307,7 +298,7 @@ examine_prologue (ip, limit, frame_sp, fsr, fi)
          offset += 4;
        }
       ip = next_ip;
-      next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn1, &insn2);
+      next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn);
     }
 
   /* Accept an optional "addu r30,r31,n" to set up the frame pointer.  */
@@ -316,11 +307,11 @@ examine_prologue (ip, limit, frame_sp, fsr, fi)
 #define        ADDU_FP_MASK    0xffff0000
 #define        ADDU_OFFSET(x)  ((unsigned)(x & 0xFFFF))
   if (next_ip &&
-      ((insn1 & ADDU_FP_MASK) == ADDU_FP_INSN))        /* addu r30, r31, N */
+      ((insn & ADDU_FP_MASK) == ADDU_FP_INSN)) /* addu r30, r31, N */
     {
-      fp_offset = ADDU_OFFSET (insn1);
+      fp_offset = ADDU_OFFSET (insn);
       ip = next_ip;
-      next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn1, &insn2);
+      next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn);
     }
 
   /* Accept the PIC prologue code if present.  */
@@ -333,11 +324,11 @@ examine_prologue (ip, limit, frame_sp, fsr, fi)
     size-=2;
   }
 
-  while (size-- && next_ip && (pcode->insn == (pcode->mask & insn1)))
+  while (size-- && next_ip && (pcode->insn == (pcode->mask & insn)))
     {
       pcode++;
       ip = next_ip;
-      next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn1, &insn2);
+      next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn);
     }
 
   /* Accept moves of parameter registers to other registers, using
@@ -353,9 +344,9 @@ examine_prologue (ip, limit, frame_sp, fsr, fi)
 #define        OR_REG_MOVE2_INSN       0xF4005800      /* or rd,rs,r0 */
 #define        OR_REG_MOVE2_MASK       0xFC00FFFF
   while (next_ip && 
-        ((insn1 & OR_MOVE_MASK) == OR_MOVE_INSN ||
-         (insn1 & OR_REG_MOVE1_MASK) == OR_REG_MOVE1_INSN ||
-         (insn1 & OR_REG_MOVE2_MASK) == OR_REG_MOVE2_INSN
+        ((insn & OR_MOVE_MASK) == OR_MOVE_INSN ||
+         (insn & OR_REG_MOVE1_MASK) == OR_REG_MOVE1_INSN ||
+         (insn & OR_REG_MOVE2_MASK) == OR_REG_MOVE2_INSN
         )
        )
     {
@@ -363,7 +354,7 @@ examine_prologue (ip, limit, frame_sp, fsr, fi)
         has already been reflected in what the compiler tells us is the
         location of these parameters.  */
       ip = next_ip;
-      next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn1, &insn2);
+      next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn);
     }
 
   /* We're done with the prologue.  If we don't care about the stack
@@ -373,24 +364,32 @@ examine_prologue (ip, limit, frame_sp, fsr, fi)
   if (fi == 0)
     return ip;
 
-  /* OK, now we have:
-       sp_offset       original negative displacement of SP
-       fp_offset       positive displacement between new SP and new FP, or -1
-       fsr->regs[0..31]        offset from original SP where reg is stored
-       must_adjust[0..31]      set if corresp. offset was set
+  /*
+     OK, now we have:
+
+       sp_offset       original (before any alloca calls) displacement of SP
+                       (will be negative).
+
+       fp_offset       displacement from original SP to the FP for this frame
+                       or -1.
+
+       fsr->regs[0..31]        displacement from original SP to the stack
+                               location where reg[0..31] is stored.
+
+       must_adjust[0..31]      set if corresponding offset was set.
 
-     The current SP (frame_sp) might not be the original new SP as set
-     by the function prologue, if alloca has been called.  This can
-     only occur if fp_offset is set, though (the compiler allocates an
-     FP when it sees alloca).  In that case, we have the FP,
-     and can calculate the original new SP from the FP.
+     If alloca has been called between the function prologue and the current
+     IP, then the current SP (frame_sp) will not be the original SP as set by
+     the function prologue.  If the current SP is not the original SP, then the
+     compiler will have allocated an FP for this frame, fp_offset will be set,
+     and we can use it to calculate the original SP.
 
-     Then, we figure out where the arguments and locals are, and
-     relocate the offsets in fsr->regs to absolute addresses.  */
+     Then, we figure out where the arguments and locals are, and relocate the
+     offsets in fsr->regs to absolute addresses.  */
 
   if (fp_offset != -1) {
     /* We have a frame pointer, so get it, and base our calc's on it.  */
-    frame_fp = (CORE_ADDR) read_next_frame_reg (fi->next, FP_REGNUM);
+    frame_fp = (CORE_ADDR) read_next_frame_reg (fi->next, ACTUAL_FP_REGNUM);
     frame_sp = frame_fp - fp_offset;
   } else {
     /* We have no frame pointer, therefore frame_sp is still the same value