2003-04-01 Andrew Cagney <cagney@redhat.com>
authorAndrew Cagney <cagney@redhat.com>
Tue, 1 Apr 2003 19:55:03 +0000 (19:55 +0000)
committerAndrew Cagney <cagney@redhat.com>
Tue, 1 Apr 2003 19:55:03 +0000 (19:55 +0000)
* Makefile.in (d10v-tdep.o): Update dependencies.
* d10v-tdep.c: Include "frame-base.h".
(d10v_frame_unwind): Make constant.
(d10v_frame_base_address): New function.
(d10v_frame_base): New variable.
(d10v_gdbarch_init): Set frame_base default.
(struct d10v_unwind_cache): Add the field "prev_sp".  Update
comment for base.
(d10v_frame_unwind_cache): Set and use "prev_sp".
(d10v_frame_this_id): Use the previous frame's inner most stack
address and this frame's func address for the frame ID.  Use
frame_id_build.  Don't analyze beyond the current instruction.

gdb/ChangeLog
gdb/Makefile.in
gdb/d10v-tdep.c

index d512403e0d8795b9e058776e0de5efcf23fcff37..7ff7fd53ec05108c7f28533ff9462991436e13b1 100644 (file)
@@ -1,3 +1,18 @@
+2003-04-01  Andrew Cagney  <cagney@redhat.com>
+
+       * Makefile.in (d10v-tdep.o): Update dependencies.
+       * d10v-tdep.c: Include "frame-base.h".
+       (d10v_frame_unwind): Make constant.
+       (d10v_frame_base_address): New function.
+       (d10v_frame_base): New variable.
+       (d10v_gdbarch_init): Set frame_base default.
+       (struct d10v_unwind_cache): Add the field "prev_sp".  Update
+       comment for base.
+       (d10v_frame_unwind_cache): Set and use "prev_sp".
+       (d10v_frame_this_id): Use the previous frame's inner most stack
+       address and this frame's func address for the frame ID.  Use
+       frame_id_build.  Don't analyze beyond the current instruction.
+       
 2003-04-01  Andrew Cagney  <cagney@redhat.com>
 
        * frame.h (get_frame_locals_address, get_frame_args_address):
index b07b7b9a5199ef0b0dd0cd066c03c0ab2fd985eb..afdb3271b5b2c6fd7d55e84304d7b65433387ee2 100644 (file)
@@ -1622,10 +1622,12 @@ cris-tdep.o: cris-tdep.c $(defs_h) $(frame_h) $(symtab_h) $(inferior_h) \
        $(gdbtypes_h) $(gdbcore_h) $(gdbcmd_h) $(target_h) $(value_h) \
        $(opcode_cris_h) $(arch_utils_h) $(regcache_h) $(symfile_h) \
        $(solib_h) $(solib_svr4_h) $(gdb_string_h)
-d10v-tdep.o: d10v-tdep.c $(defs_h) $(frame_h) $(frame_unwind_h) $(symtab_h) $(gdbtypes_h) \
-       $(gdbcmd_h) $(gdbcore_h) $(gdb_string_h) $(value_h) $(inferior_h) $(dis_asm_h) \
-       $(symfile_h) $(objfiles_h) $(language_h) $(arch_utils_h) $(regcache_h) \
-       $(remote_h) $(floatformat_h) $(gdb_sim_d10v_h) $(sim_regno_h) $(gdb_assert_h)
+d10v-tdep.o: d10v-tdep.c $(defs_h) $(frame_h) $(frame_unwind_h) \
+       $(frame_base_h) $(symtab_h) $(gdbtypes_h) $(gdbcmd_h) $(gdbcore_h) \
+       $(gdb_string_h) $(value_h) $(inferior_h) $(dis_asm_h) $(symfile_h) \
+       $(objfiles_h) $(language_h) $(arch_utils_h) $(regcache_h) \
+       $(remote_h) $(floatformat_h) $(gdb_sim_d10v_h) $(sim_regno_h) \
+       $(gdb_assert_h)
 dbug-rom.o: dbug-rom.c $(defs_h) $(gdbcore_h) $(target_h) $(monitor_h) \
        $(serial_h) $(regcache_h) $(m68k_tdep_h)
 dbxread.o: dbxread.c $(defs_h) $(gdb_string_h) $(gdb_obstack_h) \
index 3e9b2a9b1de0c97955f80a863795b421ad11a5bc..9d56169d7dfe7e5049dfd4b0f3953af7be2b38fd 100644 (file)
@@ -25,6 +25,7 @@
 #include "defs.h"
 #include "frame.h"
 #include "frame-unwind.h"
+#include "frame-base.h"
 #include "symtab.h"
 #include "gdbtypes.h"
 #include "gdbcmd.h"
@@ -598,7 +599,10 @@ d10v_skip_prologue (CORE_ADDR pc)
 struct d10v_unwind_cache
 {
   CORE_ADDR return_pc;
-  /* The frame's base.  Used when constructing a frame ID.  */
+  /* The previous frame's inner most stack address.  Used as this
+     frame ID's stack_addr.  */
+  CORE_ADDR prev_sp;
+  /* The frame's base, optionally used by the high-level debug info.  */
   CORE_ADDR base;
   int size;
   CORE_ADDR *saved_regs;
@@ -715,10 +719,10 @@ d10v_frame_unwind_cache (struct frame_info *next_frame,
   info->return_pc = 0;
   info->sp_offset = 0;
 
-  pc = get_pc_function_start (frame_pc_unwind (next_frame));
-
   info->uses_frame = 0;
-  while (1)
+  for (pc = get_pc_function_start (frame_pc_unwind (next_frame));
+       pc < frame_pc_unwind (next_frame);
+       pc += 4)
     {
       op = (unsigned long) read_memory_integer (pc, 4);
       if ((op & 0xC0000000) == 0xC0000000)
@@ -765,7 +769,6 @@ d10v_frame_unwind_cache (struct frame_info *next_frame,
              || !prologue_find_regs (info, op2, pc))
            break;
        }
-      pc += 4;
     }
 
   info->size = -info->sp_offset;
@@ -799,14 +802,14 @@ d10v_frame_unwind_cache (struct frame_info *next_frame,
     }
 
   info->base = d10v_make_daddr (this_base);
-  prev_sp = d10v_make_daddr (prev_sp);
+  info->prev_sp = d10v_make_daddr (prev_sp);
 
   /* Adjust all the saved registers so that they contain addresses and
      not offsets.  */
   for (i = 0; i < NUM_REGS - 1; i++)
     if (info->saved_regs[i])
       {
-       info->saved_regs[i] = (prev_sp + info->saved_regs[i]);
+       info->saved_regs[i] = (info->prev_sp + info->saved_regs[i]);
       }
 
   if (info->saved_regs[LR_REGNUM])
@@ -825,7 +828,7 @@ d10v_frame_unwind_cache (struct frame_info *next_frame,
 
   /* The SP_REGNUM is special.  Instead of the address of the SP, the
      previous frame's SP value is saved.  */
-  info->saved_regs[SP_REGNUM] = prev_sp;
+  info->saved_regs[SP_REGNUM] = info->prev_sp;
 
   return info;
 }
@@ -1450,9 +1453,6 @@ d10v_frame_this_id (struct frame_info *next_frame,
   CORE_ADDR base;
   CORE_ADDR pc;
 
-  /* Start with a NULL frame ID.  */
-  (*this_id) = null_frame_id;
-
   /* The PC is easy.  */
   pc = frame_pc_unwind (next_frame);
 
@@ -1464,7 +1464,7 @@ d10v_frame_this_id (struct frame_info *next_frame,
   /* Hopefully the prologue analysis either correctly determined the
      frame's base (which is the SP from the previous frame), or set
      that base to "NULL".  */
-  base = info->base;
+  base = info->prev_sp;
   if (base == STACK_START || base == 0)
     return;
 
@@ -1478,8 +1478,7 @@ d10v_frame_this_id (struct frame_info *next_frame,
       && get_frame_id (next_frame).base == base)
     return;
 
-  this_id->base = base;
-  this_id->pc = pc;
+  (*this_id) = frame_id_build (base, pc);
 }
 
 static void
@@ -1553,8 +1552,7 @@ d10v_frame_prev_register (struct frame_info *next_frame,
     }
 }
 
-
-static struct frame_unwind d10v_frame_unwind = {
+static const struct frame_unwind d10v_frame_unwind = {
   d10v_frame_this_id,
   d10v_frame_prev_register
 };
@@ -1565,6 +1563,21 @@ d10v_frame_p (CORE_ADDR pc)
   return &d10v_frame_unwind;
 }
 
+static CORE_ADDR
+d10v_frame_base_address (struct frame_info *next_frame, void **this_cache)
+{
+  struct d10v_unwind_cache *info
+    = d10v_frame_unwind_cache (next_frame, this_cache);
+  return info->base;
+}
+
+static const struct frame_base d10v_frame_base = {
+  &d10v_frame_unwind,
+  d10v_frame_base_address,
+  d10v_frame_base_address,
+  d10v_frame_base_address
+};
+
 /* Assuming NEXT_FRAME->prev is a dummy, return the frame ID of that
    dummy frame.  The frame ID's base needs to match the TOS value
    saved by save_dummy_frame_tos(), and the PC match the dummy frame's
@@ -1698,6 +1711,7 @@ d10v_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   set_gdbarch_print_registers_info (gdbarch, d10v_print_registers_info);
 
   frame_unwind_append_predicate (gdbarch, d10v_frame_p);
+  frame_base_set_default (gdbarch, &d10v_frame_base);
 
   /* Methods for saving / extracting a dummy frame's ID.  */
   set_gdbarch_unwind_dummy_id (gdbarch, d10v_unwind_dummy_id);