gdb/
authorPedro Alves <palves@redhat.com>
Fri, 18 Mar 2011 18:52:32 +0000 (18:52 +0000)
committerPedro Alves <palves@redhat.com>
Fri, 18 Mar 2011 18:52:32 +0000 (18:52 +0000)
* frame.c (frame_unwind_register): Throw an error if unwinding the
register failed.
* get_prev_frame_1 (get_prev_frame_1): Ask the unwinder if there's
an unwind stop reason.
(frame_stop_reason_string): Handle UNWIND_UNAVAILABLE.
* frame.h (enum unwind_stop_reason) <UNWIND_OUTERMOST,
UNWIND_UNAVAILABLE>: New.
* inline-frame.c (inline_frame_unwind): Install
default_frame_unwind_stop_reason.
* frame-unwind.c: Include "exceptions.h".
(frame_unwind_find_by_frame): Swallow NOT_AVAILABLE_ERROR errors.
(default_frame_unwind_stop_reason): New.
* frame-unwind.h (frame_unwind_stop_reason_ftype): New typedef.
(default_frame_unwind_stop_reason): Declare.
(struct frame_unwind) <stop_reason>: New function pointer.

* dummy-frame.c: Install default_frame_unwind_stop_reason.
* dwarf2-frame.c: Include exceptions.h.
(struct dwarf2_frame_cache) <unavailable_retaddr>: New field.
(dwarf2_frame_cache): Swallow NOT_AVAILABLE_ERROR errors when
computing the CFA.  If such an error was thrown, set
unavailable_retaddr.
(dwarf2_frame_unwind_stop_reason): New.
(dwarf2_frame_this_id): Don't build a frame id if the CFA was
unavailable.
(dwarf2_frame_unwind): Install dwarf2_frame_unwind_stop_reason.
(dwarf2_signal_frame_unwind): Ditto.

* amd64-tdep.c: Include "exceptions.h".
(struct amd64_frame_cache): New field "base_p".
(amd64_init_frame_cache): Clear it.
(amd64_frame_cache_1): New, factored out from amd64_frame_cache.
Avoid reading registers with functions that throw if the register
is not necessary to compute the frame base.
(amd64_frame_cache): Reimplement wrapping amd64_frame_cache_1, and
swallowing NOT_AVAILABLE_ERROR.
(amd64_frame_unwind_stop_reason): New.
(amd64_frame_this_id): Don't build a frame id if the frame base
was unavailable.
(amd64_frame_unwind): Install amd64_frame_unwind_stop_reason.
(amd64_sigtramp_frame_cache): Swallow NOT_AVAILABLE_ERROR, and set
base_p if the frame base was computable.
(amd64_sigtramp_frame_unwind_stop_reason): New.
(amd64_sigtramp_frame_this_id): Don't build a frame id if the
frame base was unavailable.
(amd64_sigtramp_frame_unwind): Install
amd64_sigtramp_frame_unwind_stop_reason.
(amd64_epilogue_frame_cache): Swallow NOT_AVAILABLE_ERROR, and set
base_p if the frame base was computable.
(amd64_epilogue_frame_unwind_stop_reason): New.
(amd64_epilogue_frame_this_id): Don't build a frame id if the
frame base was unavailable.
(amd64_epilogue_frame_unwind): Install
amd64_epilogue_frame_unwind_stop_reason.
* i386-tdep.c: Include "exceptions.h".
(struct i386_frame_cache): New field "base_p".
(i386_init_frame_cache): Clear it.
(i386_frame_cache_1): New, factored out from amd64_frame_cache.
Avoid reading registers with functions that throw if the register
is not necessary to compute the frame base.
(i386_frame_cache): Reimplement wrapping amd64_frame_cache_1, and
swallowing NOT_AVAILABLE_ERROR.
(i386_frame_unwind_stop_reason): New.
(i386_frame_this_id): Don't build a frame id if the frame base was
unavailable.
(i386_frame_prev_register): Handle unavailable SP.
(i386_frame_unwind): Install i386_frame_unwind_stop_reason.
(i386_epilogue_frame_cache): Swallow NOT_AVAILABLE_ERROR, and set
base_p if the frame base was computable.
(i386_epilogue_frame_unwind_stop_reason): New.
(i386_epilogue_frame_this_id): Don't build a frame id if the frame
base was unavailable.
(i386_epilogue_frame_unwind): Install
i386_epilogue_frame_unwind_stop_reason.
(i386_sigtramp_frame_cache): Swallow NOT_AVAILABLE_ERROR, and set
base_p if the frame base was computable.
(i386_sigtramp_frame_unwind_stop_reason): New.
(i386_sigtramp_frame_this_id): Don't build a frame id if the frame
base was unavailable.
(i386_sigtramp_frame_unwind): Install
i386_sigtramp_frame_unwind_stop_reason.
* sentinel-frame.c (sentinel_frame_prev_register): Use the value
type's size, not the register's.
(sentinel_frame_unwind): Install default_frame_unwind_stop_reason.

* alpha-mdebug-tdep.c (alpha_mdebug_frame_unwind): Install
default_frame_unwind_stop_reason.
* alpha-tdep.c (alpha_sigtramp_frame_unwind)
(alpha_heuristic_frame_unwind): Ditto.
* amd64obsd-tdep.c (amd64obsd_trapframe_unwind): Ditto.
* arm-tdep.c (arm_prologue_unwind, arm_stub_unwind): Ditto.
* avr-tdep.c (avr_frame_unwind): Ditto.
* cris-tdep.c (cris_sigtramp_frame_unwind, cris_frame_unwind):
Ditto.
* frv-linux-tdep.c (frv_linux_sigtramp_frame_unwind): Ditto.
* frv-tdep.c (frv_frame_unwind): Ditto.
* h8300-tdep.c (h8300_frame_unwind): Ditto.
* hppa-hpux-tdep.c (hppa_hpux_sigtramp_frame_unwind): Ditto.
* hppa-linux-tdep.c (hppa_linux_sigtramp_frame_unwind): Ditto.
* hppa-tdep.c (hppa_frame_unwind, hppa_fallback_frame_unwind)
(hppa_stub_frame_unwind): Ditto.
* i386obsd-tdep.c (i386obsd_trapframe_unwind): Ditto.
* ia64-tdep.c (ia64_frame_unwind, ia64_sigtramp_frame_unwind)
(ia64_libunwind_frame_unwind)
(ia64_libunwind_sigtramp_frame_unwind): Ditto.
* iq2000-tdep.c (iq2000_frame_unwind): Ditto.
* lm32-tdep.c (lm32_frame_unwind): Ditto.
* m32c-tdep.c (m32c_unwind): Ditto.
* m32r-linux-tdep.c (m32r_linux_sigtramp_frame_unwind): Ditto.
* m32r-tdep.c (m32r_frame_unwind): Ditto.
* m68hc11-tdep.c (m68hc11_frame_unwind): Ditto.
* m68k-tdep.c (m68k_frame_unwind): Ditto.
* m68klinux-tdep.c (m68k_linux_sigtramp_frame_unwind): Ditto.
* m88k-tdep.c (m88k_frame_unwind): Ditto.
* mep-tdep.c (mep_frame_unwind): Ditto.
* microblaze-tdep.c (microblaze_frame_unwind): Ditto.
* mips-tdep.c (mips_insn16_frame_unwind, mips_insn32_frame_unwind)
(mips_stub_frame_unwind): Ditto.
* mn10300-tdep.c (mn10300_frame_unwind): Ditto.
* moxie-tdep.c (moxie_frame_unwind): Ditto.
* mt-tdep.c (mt_frame_unwind): Ditto.
* ppc-linux-tdep.c (ppu2spu_unwind): Ditto.
* ppcobsd-tdep.c (ppcobsd_sigtramp_frame_unwind): Ditto.
* rs6000-tdep.c (rs6000_frame_unwind): Ditto.
* s390-tdep.c (s390_frame_unwind, s390_stub_frame_unwind)
(s390_sigtramp_frame_unwind): Ditto.
* score-tdep.c (score_prologue_unwind): Ditto.
* sh-tdep.c (sh_frame_unwind): Ditto.
* sh64-tdep.c (sh64_frame_unwind): Ditto.
* sparc-sol2-tdep.c (sparc32_sol2_sigtramp_frame_unwind): Ditto.
* sparc-tdep.c (sparc32_frame_unwind): Ditto.
* sparc64-sol2-tdep.c (sparc64_sol2_sigtramp_frame_unwind): Ditto.
* sparc64-tdep.c (sparc64_frame_unwind): Ditto.
* sparc64fbsd-tdep.c (sparc64fbsd_sigtramp_frame_unwind): Ditto.
* sparc64nbsd-tdep.c (sparc64nbsd_sigcontext_frame_unwind): Ditto.
* sparc64obsd-tdep.c (sparc64obsd_frame_unwind)
(sparc64obsd_trapframe_unwind): Ditto.
* sparcnbsd-tdep.c (sparc32nbsd_sigcontext_frame_unwind): Ditto.
* sparcobsd-tdep.c (sparc32obsd_sigtramp_frame_unwind): Ditto.
* spu-tdep.c (spu_frame_unwind, spu2ppu_unwind): Ditto.
* v850-tdep.c (v850_frame_unwind): Ditto.
* vax-tdep.c (vax_frame_unwind): Ditto.
* vaxobsd-tdep.c (vaxobsd_sigtramp_frame_unwind): Ditto.
* xstormy16-tdep.c (frame_unwind xstormy16_frame_unwind): Ditto.
* xtensa-tdep.c (xtensa_unwind): Ditto.

63 files changed:
gdb/ChangeLog
gdb/alpha-mdebug-tdep.c
gdb/alpha-tdep.c
gdb/amd64-tdep.c
gdb/amd64obsd-tdep.c
gdb/arm-tdep.c
gdb/avr-tdep.c
gdb/bfin-tdep.c
gdb/cris-tdep.c
gdb/dummy-frame.c
gdb/dwarf2-frame.c
gdb/frame-unwind.c
gdb/frame-unwind.h
gdb/frame.c
gdb/frame.h
gdb/frv-linux-tdep.c
gdb/frv-tdep.c
gdb/h8300-tdep.c
gdb/hppa-hpux-tdep.c
gdb/hppa-linux-tdep.c
gdb/hppa-tdep.c
gdb/i386-tdep.c
gdb/i386obsd-tdep.c
gdb/ia64-tdep.c
gdb/inline-frame.c
gdb/iq2000-tdep.c
gdb/lm32-tdep.c
gdb/m32c-tdep.c
gdb/m32r-linux-tdep.c
gdb/m32r-tdep.c
gdb/m68hc11-tdep.c
gdb/m68k-tdep.c
gdb/m68klinux-tdep.c
gdb/m88k-tdep.c
gdb/mep-tdep.c
gdb/microblaze-tdep.c
gdb/mips-tdep.c
gdb/mn10300-tdep.c
gdb/moxie-tdep.c
gdb/mt-tdep.c
gdb/ppc-linux-tdep.c
gdb/ppcobsd-tdep.c
gdb/rs6000-tdep.c
gdb/s390-tdep.c
gdb/score-tdep.c
gdb/sentinel-frame.c
gdb/sh-tdep.c
gdb/sh64-tdep.c
gdb/sparc-sol2-tdep.c
gdb/sparc-tdep.c
gdb/sparc64-sol2-tdep.c
gdb/sparc64-tdep.c
gdb/sparc64fbsd-tdep.c
gdb/sparc64nbsd-tdep.c
gdb/sparc64obsd-tdep.c
gdb/sparcnbsd-tdep.c
gdb/sparcobsd-tdep.c
gdb/spu-tdep.c
gdb/v850-tdep.c
gdb/vax-tdep.c
gdb/vaxobsd-tdep.c
gdb/xstormy16-tdep.c
gdb/xtensa-tdep.c

index 0dbc501d99ef8395d562b339060b24404234e322..64d8391ca6c185b44b9fed82a9f006a1cc2be607 100644 (file)
@@ -1,3 +1,151 @@
+2012-03-18  Pedro Alves  <pedro@codesourcery.com>
+
+       * frame.c (frame_unwind_register): Throw an error if unwinding the
+       register failed.
+       * get_prev_frame_1 (get_prev_frame_1): Ask the unwinder if there's
+       an unwind stop reason.
+       (frame_stop_reason_string): Handle UNWIND_UNAVAILABLE.
+       * frame.h (enum unwind_stop_reason) <UNWIND_OUTERMOST,
+       UNWIND_UNAVAILABLE>: New.
+       * inline-frame.c (inline_frame_unwind): Install
+       default_frame_unwind_stop_reason.
+       * frame-unwind.c: Include "exceptions.h".
+       (frame_unwind_find_by_frame): Swallow NOT_AVAILABLE_ERROR errors.
+       (default_frame_unwind_stop_reason): New.
+       * frame-unwind.h (frame_unwind_stop_reason_ftype): New typedef.
+       (default_frame_unwind_stop_reason): Declare.
+       (struct frame_unwind) <stop_reason>: New function pointer.
+
+       * dummy-frame.c: Install default_frame_unwind_stop_reason.
+       * dwarf2-frame.c: Include exceptions.h.
+       (struct dwarf2_frame_cache) <unavailable_retaddr>: New field.
+       (dwarf2_frame_cache): Swallow NOT_AVAILABLE_ERROR errors when
+       computing the CFA.  If such an error was thrown, set
+       unavailable_retaddr.
+       (dwarf2_frame_unwind_stop_reason): New.
+       (dwarf2_frame_this_id): Don't build a frame id if the CFA was
+       unavailable.
+       (dwarf2_frame_unwind): Install dwarf2_frame_unwind_stop_reason.
+       (dwarf2_signal_frame_unwind): Ditto.
+
+       * amd64-tdep.c: Include "exceptions.h".
+       (struct amd64_frame_cache): New field "base_p".
+       (amd64_init_frame_cache): Clear it.
+       (amd64_frame_cache_1): New, factored out from amd64_frame_cache.
+       Avoid reading registers with functions that throw if the register
+       is not necessary to compute the frame base.
+       (amd64_frame_cache): Reimplement wrapping amd64_frame_cache_1, and
+       swallowing NOT_AVAILABLE_ERROR.
+       (amd64_frame_unwind_stop_reason): New.
+       (amd64_frame_this_id): Don't build a frame id if the frame base
+       was unavailable.
+       (amd64_frame_unwind): Install amd64_frame_unwind_stop_reason.
+       (amd64_sigtramp_frame_cache): Swallow NOT_AVAILABLE_ERROR, and set
+       base_p if the frame base was computable.
+       (amd64_sigtramp_frame_unwind_stop_reason): New.
+       (amd64_sigtramp_frame_this_id): Don't build a frame id if the
+       frame base was unavailable.
+       (amd64_sigtramp_frame_unwind): Install
+       amd64_sigtramp_frame_unwind_stop_reason.
+       (amd64_epilogue_frame_cache): Swallow NOT_AVAILABLE_ERROR, and set
+       base_p if the frame base was computable.
+       (amd64_epilogue_frame_unwind_stop_reason): New.
+       (amd64_epilogue_frame_this_id): Don't build a frame id if the
+       frame base was unavailable.
+       (amd64_epilogue_frame_unwind): Install
+       amd64_epilogue_frame_unwind_stop_reason.
+       * i386-tdep.c: Include "exceptions.h".
+       (struct i386_frame_cache): New field "base_p".
+       (i386_init_frame_cache): Clear it.
+       (i386_frame_cache_1): New, factored out from amd64_frame_cache.
+       Avoid reading registers with functions that throw if the register
+       is not necessary to compute the frame base.
+       (i386_frame_cache): Reimplement wrapping amd64_frame_cache_1, and
+       swallowing NOT_AVAILABLE_ERROR.
+       (i386_frame_unwind_stop_reason): New.
+       (i386_frame_this_id): Don't build a frame id if the frame base was
+       unavailable.
+       (i386_frame_prev_register): Handle unavailable SP.
+       (i386_frame_unwind): Install i386_frame_unwind_stop_reason.
+       (i386_epilogue_frame_cache): Swallow NOT_AVAILABLE_ERROR, and set
+       base_p if the frame base was computable.
+       (i386_epilogue_frame_unwind_stop_reason): New.
+       (i386_epilogue_frame_this_id): Don't build a frame id if the frame
+       base was unavailable.
+       (i386_epilogue_frame_unwind): Install
+       i386_epilogue_frame_unwind_stop_reason.
+       (i386_sigtramp_frame_cache): Swallow NOT_AVAILABLE_ERROR, and set
+       base_p if the frame base was computable.
+       (i386_sigtramp_frame_unwind_stop_reason): New.
+       (i386_sigtramp_frame_this_id): Don't build a frame id if the frame
+       base was unavailable.
+       (i386_sigtramp_frame_unwind): Install
+       i386_sigtramp_frame_unwind_stop_reason.
+       * sentinel-frame.c (sentinel_frame_prev_register): Use the value
+       type's size, not the register's.
+       (sentinel_frame_unwind): Install default_frame_unwind_stop_reason.
+
+       * alpha-mdebug-tdep.c (alpha_mdebug_frame_unwind): Install
+       default_frame_unwind_stop_reason.
+       * alpha-tdep.c (alpha_sigtramp_frame_unwind)
+       (alpha_heuristic_frame_unwind): Ditto.
+       * amd64obsd-tdep.c (amd64obsd_trapframe_unwind): Ditto.
+       * arm-tdep.c (arm_prologue_unwind, arm_stub_unwind): Ditto.
+       * avr-tdep.c (avr_frame_unwind): Ditto.
+       * cris-tdep.c (cris_sigtramp_frame_unwind, cris_frame_unwind):
+       Ditto.
+       * frv-linux-tdep.c (frv_linux_sigtramp_frame_unwind): Ditto.
+       * frv-tdep.c (frv_frame_unwind): Ditto.
+       * h8300-tdep.c (h8300_frame_unwind): Ditto.
+       * hppa-hpux-tdep.c (hppa_hpux_sigtramp_frame_unwind): Ditto.
+       * hppa-linux-tdep.c (hppa_linux_sigtramp_frame_unwind): Ditto.
+       * hppa-tdep.c (hppa_frame_unwind, hppa_fallback_frame_unwind)
+       (hppa_stub_frame_unwind): Ditto.
+       * i386obsd-tdep.c (i386obsd_trapframe_unwind): Ditto.
+       * ia64-tdep.c (ia64_frame_unwind, ia64_sigtramp_frame_unwind)
+       (ia64_libunwind_frame_unwind)
+       (ia64_libunwind_sigtramp_frame_unwind): Ditto.
+       * iq2000-tdep.c (iq2000_frame_unwind): Ditto.
+       * lm32-tdep.c (lm32_frame_unwind): Ditto.
+       * m32c-tdep.c (m32c_unwind): Ditto.
+       * m32r-linux-tdep.c (m32r_linux_sigtramp_frame_unwind): Ditto.
+       * m32r-tdep.c (m32r_frame_unwind): Ditto.
+       * m68hc11-tdep.c (m68hc11_frame_unwind): Ditto.
+       * m68k-tdep.c (m68k_frame_unwind): Ditto.
+       * m68klinux-tdep.c (m68k_linux_sigtramp_frame_unwind): Ditto.
+       * m88k-tdep.c (m88k_frame_unwind): Ditto.
+       * mep-tdep.c (mep_frame_unwind): Ditto.
+       * microblaze-tdep.c (microblaze_frame_unwind): Ditto.
+       * mips-tdep.c (mips_insn16_frame_unwind, mips_insn32_frame_unwind)
+       (mips_stub_frame_unwind): Ditto.
+       * mn10300-tdep.c (mn10300_frame_unwind): Ditto.
+       * moxie-tdep.c (moxie_frame_unwind): Ditto.
+       * mt-tdep.c (mt_frame_unwind): Ditto.
+       * ppc-linux-tdep.c (ppu2spu_unwind): Ditto.
+       * ppcobsd-tdep.c (ppcobsd_sigtramp_frame_unwind): Ditto.
+       * rs6000-tdep.c (rs6000_frame_unwind): Ditto.
+       * s390-tdep.c (s390_frame_unwind, s390_stub_frame_unwind)
+       (s390_sigtramp_frame_unwind): Ditto.
+       * score-tdep.c (score_prologue_unwind): Ditto.
+       * sh-tdep.c (sh_frame_unwind): Ditto.
+       * sh64-tdep.c (sh64_frame_unwind): Ditto.
+       * sparc-sol2-tdep.c (sparc32_sol2_sigtramp_frame_unwind): Ditto.
+       * sparc-tdep.c (sparc32_frame_unwind): Ditto.
+       * sparc64-sol2-tdep.c (sparc64_sol2_sigtramp_frame_unwind): Ditto.
+       * sparc64-tdep.c (sparc64_frame_unwind): Ditto.
+       * sparc64fbsd-tdep.c (sparc64fbsd_sigtramp_frame_unwind): Ditto.
+       * sparc64nbsd-tdep.c (sparc64nbsd_sigcontext_frame_unwind): Ditto.
+       * sparc64obsd-tdep.c (sparc64obsd_frame_unwind)
+       (sparc64obsd_trapframe_unwind): Ditto.
+       * sparcnbsd-tdep.c (sparc32nbsd_sigcontext_frame_unwind): Ditto.
+       * sparcobsd-tdep.c (sparc32obsd_sigtramp_frame_unwind): Ditto.
+       * spu-tdep.c (spu_frame_unwind, spu2ppu_unwind): Ditto.
+       * v850-tdep.c (v850_frame_unwind): Ditto.
+       * vax-tdep.c (vax_frame_unwind): Ditto.
+       * vaxobsd-tdep.c (vaxobsd_sigtramp_frame_unwind): Ditto.
+       * xstormy16-tdep.c (frame_unwind xstormy16_frame_unwind): Ditto.
+       * xtensa-tdep.c (xtensa_unwind): Ditto.
+
 2011-03-18  Pedro Alves  <pedro@codesourcery.com>
 
        * tui/tui-hooks.c (tui_selected_frame_level_changed_hook): Assume
index 8773437e21e3ce54972b0ce029b12f83bf8db732..f48a121e2df7e035e76a7b9ba0f997eb2dcfc53b 100644 (file)
@@ -336,6 +336,7 @@ alpha_mdebug_frame_sniffer (const struct frame_unwind *self,
 
 static const struct frame_unwind alpha_mdebug_frame_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   alpha_mdebug_frame_this_id,
   alpha_mdebug_frame_prev_register,
   NULL,
index 2f309a7c998f94fcc1f3db245c1587bf60ab0e58..51eb6e431d1e2d215e4dc148613688945fd5c688 100644 (file)
@@ -936,6 +936,7 @@ alpha_sigtramp_frame_sniffer (const struct frame_unwind *self,
 
 static const struct frame_unwind alpha_sigtramp_frame_unwind = {
   SIGTRAMP_FRAME,
+  default_frame_unwind_stop_reason,
   alpha_sigtramp_frame_this_id,
   alpha_sigtramp_frame_prev_register,
   NULL,
@@ -1351,6 +1352,7 @@ alpha_heuristic_frame_prev_register (struct frame_info *this_frame,
 
 static const struct frame_unwind alpha_heuristic_frame_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   alpha_heuristic_frame_this_id,
   alpha_heuristic_frame_prev_register,
   NULL,
index 54b17236db972b428e95eece7578ca5d70d2d2da..9b5d5bb43af352c910c3b72dd6b4277a2b01d2c4 100644 (file)
@@ -38,7 +38,7 @@
 #include "symfile.h"
 #include "disasm.h"
 #include "gdb_assert.h"
-
+#include "exceptions.h"
 #include "amd64-tdep.h"
 #include "i387-tdep.h"
 
@@ -1635,6 +1635,7 @@ struct amd64_frame_cache
 {
   /* Base address.  */
   CORE_ADDR base;
+  int base_p;
   CORE_ADDR sp_offset;
   CORE_ADDR pc;
 
@@ -1656,6 +1657,7 @@ amd64_init_frame_cache (struct amd64_frame_cache *cache)
 
   /* Base address.  */
   cache->base = 0;
+  cache->base_p = 0;
   cache->sp_offset = -8;
   cache->pc = 0;
 
@@ -1913,33 +1915,20 @@ amd64_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
 
 /* Normal frames.  */
 
-static struct amd64_frame_cache *
-amd64_frame_cache (struct frame_info *this_frame, void **this_cache)
+static void
+amd64_frame_cache_1 (struct frame_info *this_frame,
+                    struct amd64_frame_cache *cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-  struct amd64_frame_cache *cache;
   gdb_byte buf[8];
   int i;
 
-  if (*this_cache)
-    return *this_cache;
-
-  cache = amd64_alloc_frame_cache ();
-  *this_cache = cache;
-
   cache->pc = get_frame_func (this_frame);
   if (cache->pc != 0)
     amd64_analyze_prologue (gdbarch, cache->pc, get_frame_pc (this_frame),
                            cache);
 
-  if (cache->saved_sp_reg != -1)
-    {
-      /* Stack pointer has been saved.  */
-      get_frame_register (this_frame, cache->saved_sp_reg, buf);
-      cache->saved_sp = extract_unsigned_integer(buf, 8, byte_order);
-    }
-
   if (cache->frameless_p)
     {
       /* We didn't find a valid frame.  If we're at the start of a
@@ -1951,6 +1940,10 @@ amd64_frame_cache (struct frame_info *this_frame, void **this_cache)
 
       if (cache->saved_sp_reg != -1)
        {
+         /* Stack pointer has been saved.  */
+         get_frame_register (this_frame, cache->saved_sp_reg, buf);
+         cache->saved_sp = extract_unsigned_integer (buf, 8, byte_order);
+
          /* We're halfway aligning the stack.  */
          cache->base = ((cache->saved_sp - 8) & 0xfffffffffffffff0LL) - 8;
          cache->saved_regs[AMD64_RIP_REGNUM] = cache->saved_sp - 8;
@@ -1988,9 +1981,48 @@ amd64_frame_cache (struct frame_info *this_frame, void **this_cache)
     if (cache->saved_regs[i] != -1)
       cache->saved_regs[i] += cache->base;
 
+  cache->base_p = 1;
+}
+
+static struct amd64_frame_cache *
+amd64_frame_cache (struct frame_info *this_frame, void **this_cache)
+{
+  volatile struct gdb_exception ex;
+  struct amd64_frame_cache *cache;
+
+  if (*this_cache)
+    return *this_cache;
+
+  cache = amd64_alloc_frame_cache ();
+  *this_cache = cache;
+
+  TRY_CATCH (ex, RETURN_MASK_ERROR)
+    {
+      amd64_frame_cache_1 (this_frame, cache);
+    }
+  if (ex.reason < 0 && ex.error != NOT_AVAILABLE_ERROR)
+    throw_exception (ex);
+
   return cache;
 }
 
+static enum unwind_stop_reason
+amd64_frame_unwind_stop_reason (struct frame_info *this_frame,
+                               void **this_cache)
+{
+  struct amd64_frame_cache *cache =
+    amd64_frame_cache (this_frame, this_cache);
+
+  if (!cache->base_p)
+    return UNWIND_UNAVAILABLE;
+
+  /* This marks the outermost frame.  */
+  if (cache->base == 0)
+    return UNWIND_OUTERMOST;
+
+  return UNWIND_NO_REASON;
+}
+
 static void
 amd64_frame_this_id (struct frame_info *this_frame, void **this_cache,
                     struct frame_id *this_id)
@@ -1998,6 +2030,9 @@ amd64_frame_this_id (struct frame_info *this_frame, void **this_cache,
   struct amd64_frame_cache *cache =
     amd64_frame_cache (this_frame, this_cache);
 
+  if (!cache->base_p)
+    return;
+
   /* This marks the outermost frame.  */
   if (cache->base == 0)
     return;
@@ -2028,6 +2063,7 @@ amd64_frame_prev_register (struct frame_info *this_frame, void **this_cache,
 static const struct frame_unwind amd64_frame_unwind =
 {
   NORMAL_FRAME,
+  amd64_frame_unwind_stop_reason,
   amd64_frame_this_id,
   amd64_frame_prev_register,
   NULL,
@@ -2047,6 +2083,7 @@ amd64_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache)
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+  volatile struct gdb_exception ex;
   struct amd64_frame_cache *cache;
   CORE_ADDR addr;
   gdb_byte buf[8];
@@ -2057,20 +2094,40 @@ amd64_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache)
 
   cache = amd64_alloc_frame_cache ();
 
-  get_frame_register (this_frame, AMD64_RSP_REGNUM, buf);
-  cache->base = extract_unsigned_integer (buf, 8, byte_order) - 8;
+  TRY_CATCH (ex, RETURN_MASK_ERROR)
+    {
+      get_frame_register (this_frame, AMD64_RSP_REGNUM, buf);
+      cache->base = extract_unsigned_integer (buf, 8, byte_order) - 8;
+
+      addr = tdep->sigcontext_addr (this_frame);
+      gdb_assert (tdep->sc_reg_offset);
+      gdb_assert (tdep->sc_num_regs <= AMD64_NUM_SAVED_REGS);
+      for (i = 0; i < tdep->sc_num_regs; i++)
+       if (tdep->sc_reg_offset[i] != -1)
+         cache->saved_regs[i] = addr + tdep->sc_reg_offset[i];
 
-  addr = tdep->sigcontext_addr (this_frame);
-  gdb_assert (tdep->sc_reg_offset);
-  gdb_assert (tdep->sc_num_regs <= AMD64_NUM_SAVED_REGS);
-  for (i = 0; i < tdep->sc_num_regs; i++)
-    if (tdep->sc_reg_offset[i] != -1)
-      cache->saved_regs[i] = addr + tdep->sc_reg_offset[i];
+      cache->base_p = 1;
+    }
+  if (ex.reason < 0 && ex.error != NOT_AVAILABLE_ERROR)
+    throw_exception (ex);
 
   *this_cache = cache;
   return cache;
 }
 
+static enum unwind_stop_reason
+amd64_sigtramp_frame_unwind_stop_reason (struct frame_info *this_frame,
+                                        void **this_cache)
+{
+  struct amd64_frame_cache *cache =
+    amd64_sigtramp_frame_cache (this_frame, this_cache);
+
+  if (!cache->base_p)
+    return UNWIND_UNAVAILABLE;
+
+  return UNWIND_NO_REASON;
+}
+
 static void
 amd64_sigtramp_frame_this_id (struct frame_info *this_frame,
                              void **this_cache, struct frame_id *this_id)
@@ -2078,6 +2135,9 @@ amd64_sigtramp_frame_this_id (struct frame_info *this_frame,
   struct amd64_frame_cache *cache =
     amd64_sigtramp_frame_cache (this_frame, this_cache);
 
+  if (!cache->base_p)
+    return;
+
   (*this_id) = frame_id_build (cache->base + 16, get_frame_pc (this_frame));
 }
 
@@ -2124,6 +2184,7 @@ amd64_sigtramp_frame_sniffer (const struct frame_unwind *self,
 static const struct frame_unwind amd64_sigtramp_frame_unwind =
 {
   SIGTRAMP_FRAME,
+  amd64_sigtramp_frame_unwind_stop_reason,
   amd64_sigtramp_frame_this_id,
   amd64_sigtramp_frame_prev_register,
   NULL,
@@ -2185,6 +2246,7 @@ amd64_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+  volatile struct gdb_exception ex;
   struct amd64_frame_cache *cache;
   gdb_byte buf[8];
 
@@ -2194,23 +2256,43 @@ amd64_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache)
   cache = amd64_alloc_frame_cache ();
   *this_cache = cache;
 
-  /* Cache base will be %esp plus cache->sp_offset (-8).  */
-  get_frame_register (this_frame, AMD64_RSP_REGNUM, buf);
-  cache->base = extract_unsigned_integer (buf, 8, 
-                                         byte_order) + cache->sp_offset;
+  TRY_CATCH (ex, RETURN_MASK_ERROR)
+    {
+      /* Cache base will be %esp plus cache->sp_offset (-8).  */
+      get_frame_register (this_frame, AMD64_RSP_REGNUM, buf);
+      cache->base = extract_unsigned_integer (buf, 8,
+                                             byte_order) + cache->sp_offset;
+
+      /* Cache pc will be the frame func.  */
+      cache->pc = get_frame_pc (this_frame);
 
-  /* Cache pc will be the frame func.  */
-  cache->pc = get_frame_pc (this_frame);
+      /* The saved %esp will be at cache->base plus 16.  */
+      cache->saved_sp = cache->base + 16;
 
-  /* The saved %esp will be at cache->base plus 16.  */
-  cache->saved_sp = cache->base + 16;
+      /* The saved %eip will be at cache->base plus 8.  */
+      cache->saved_regs[AMD64_RIP_REGNUM] = cache->base + 8;
 
-  /* The saved %eip will be at cache->base plus 8.  */
-  cache->saved_regs[AMD64_RIP_REGNUM] = cache->base + 8;
+      cache->base_p = 1;
+    }
+  if (ex.reason < 0 && ex.error != NOT_AVAILABLE_ERROR)
+    throw_exception (ex);
 
   return cache;
 }
 
+static enum unwind_stop_reason
+amd64_epilogue_frame_unwind_stop_reason (struct frame_info *this_frame,
+                                        void **this_cache)
+{
+  struct amd64_frame_cache *cache
+    = amd64_epilogue_frame_cache (this_frame, this_cache);
+
+  if (!cache->base_p)
+    return UNWIND_UNAVAILABLE;
+
+  return UNWIND_NO_REASON;
+}
+
 static void
 amd64_epilogue_frame_this_id (struct frame_info *this_frame,
                              void **this_cache,
@@ -2219,12 +2301,16 @@ amd64_epilogue_frame_this_id (struct frame_info *this_frame,
   struct amd64_frame_cache *cache = amd64_epilogue_frame_cache (this_frame,
                                                               this_cache);
 
+  if (!cache->base_p)
+    return;
+
   (*this_id) = frame_id_build (cache->base + 8, cache->pc);
 }
 
 static const struct frame_unwind amd64_epilogue_frame_unwind =
 {
   NORMAL_FRAME,
+  amd64_epilogue_frame_unwind_stop_reason,
   amd64_epilogue_frame_this_id,
   amd64_frame_prev_register,
   NULL, 
index f5dd259aa38dedc323f2ad7dcd41c78bd1c614c4..2ff5c8f91828f92c6720cf0c58d47d7a5219ce3b 100644 (file)
@@ -437,6 +437,7 @@ static const struct frame_unwind amd64obsd_trapframe_unwind = {
      frame, but SIGTRAMP_FRAME would print <signal handler called>,
      which really is not what we want here.  */
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   amd64obsd_trapframe_this_id,
   amd64obsd_trapframe_prev_register,
   NULL,
index 0020b47c0d2f831780fcdf6adeb0c94e41951479..754c431fabd61e8f688e8edd997b2f853753f0d7 100644 (file)
@@ -2146,6 +2146,7 @@ arm_prologue_prev_register (struct frame_info *this_frame,
 
 struct frame_unwind arm_prologue_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   arm_prologue_this_id,
   arm_prologue_prev_register,
   NULL,
@@ -2884,6 +2885,7 @@ arm_exidx_unwind_sniffer (const struct frame_unwind *self,
 
 struct frame_unwind arm_exidx_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   arm_prologue_this_id,
   arm_prologue_prev_register,
   NULL,
@@ -2939,6 +2941,7 @@ arm_stub_unwind_sniffer (const struct frame_unwind *self,
 
 struct frame_unwind arm_stub_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   arm_stub_this_id,
   arm_prologue_prev_register,
   NULL,
index 31dd7df4ab51e47cd2cb7fd9fd87fef9928404d6..20e7fcad33e3a725c517562864763c0c4f9c9d1f 100644 (file)
@@ -1131,6 +1131,7 @@ avr_frame_prev_register (struct frame_info *this_frame,
 
 static const struct frame_unwind avr_frame_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   avr_frame_this_id,
   avr_frame_prev_register,
   NULL,
index 8c0cb5a325be4d7974905a223a7f9621895fbd85..8322af5f81b1ecb7a37afd6eb3d36a1b077731db 100644 (file)
@@ -376,6 +376,7 @@ bfin_frame_prev_register (struct frame_info *this_frame,
 static const struct frame_unwind bfin_frame_unwind =
 {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   bfin_frame_this_id,
   bfin_frame_prev_register,
   NULL,
index f99eabd46528e784146a3fd05e7d8391bca109a4..f79e84cd2e199f489cf90577db1a611ee35a30d3 100644 (file)
@@ -448,6 +448,7 @@ cris_sigtramp_frame_sniffer (const struct frame_unwind *self,
 static const struct frame_unwind cris_sigtramp_frame_unwind =
 {
   SIGTRAMP_FRAME,
+  default_frame_unwind_stop_reason,
   cris_sigtramp_frame_this_id,
   cris_sigtramp_frame_prev_register,
   NULL,
@@ -985,6 +986,7 @@ cris_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 static const struct frame_unwind cris_frame_unwind = 
 {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   cris_frame_this_id,
   cris_frame_prev_register,
   NULL,
index f63659fd22325aa990a23afe6a801f436ed0eac9..709cd6849513b450f8d36475f15bb857b3cebdf8 100644 (file)
@@ -278,6 +278,7 @@ dummy_frame_this_id (struct frame_info *this_frame,
 const struct frame_unwind dummy_frame_unwind =
 {
   DUMMY_FRAME,
+  default_frame_unwind_stop_reason,
   dummy_frame_this_id,
   dummy_frame_prev_register,
   NULL,
index edd6a9c5267f74b447ef3fcb015b92b444f7a8fe..e78c3284aded1045fa3703e4ae6c65eed8cffc33 100644 (file)
@@ -40,6 +40,7 @@
 #include "dwarf2-frame.h"
 #include "ax.h"
 #include "dwarf2loc.h"
+#include "exceptions.h"
 
 struct comp_unit;
 
@@ -986,6 +987,10 @@ struct dwarf2_frame_cache
   /* DWARF Call Frame Address.  */
   CORE_ADDR cfa;
 
+  /* Set if the return address column was marked as unavailable
+     (required non-collected memory or registers to compute).  */
+  int unavailable_retaddr;
+
   /* Set if the return address column was marked as undefined.  */
   int undefined_retaddr;
 
@@ -1013,6 +1018,7 @@ dwarf2_frame_cache (struct frame_info *this_frame, void **this_cache)
   struct dwarf2_frame_cache *cache;
   struct dwarf2_frame_state *fs;
   struct dwarf2_fde *fde;
+  volatile struct gdb_exception ex;
 
   if (*this_cache)
     return *this_cache;
@@ -1020,10 +1026,10 @@ dwarf2_frame_cache (struct frame_info *this_frame, void **this_cache)
   /* Allocate a new cache.  */
   cache = FRAME_OBSTACK_ZALLOC (struct dwarf2_frame_cache);
   cache->reg = FRAME_OBSTACK_CALLOC (num_regs, struct dwarf2_frame_state_reg);
+  *this_cache = cache;
 
   /* Allocate and initialize the frame state.  */
-  fs = XMALLOC (struct dwarf2_frame_state);
-  memset (fs, 0, sizeof (struct dwarf2_frame_state));
+  fs = XZALLOC (struct dwarf2_frame_state);
   old_chain = make_cleanup (dwarf2_frame_state_free, fs);
 
   /* Unwind the PC.
@@ -1068,26 +1074,39 @@ dwarf2_frame_cache (struct frame_info *this_frame, void **this_cache)
   execute_cfa_program (fde, fde->instructions, fde->end, gdbarch,
                       get_frame_pc (this_frame), fs);
 
-  /* Calculate the CFA.  */
-  switch (fs->regs.cfa_how)
+  TRY_CATCH (ex, RETURN_MASK_ERROR)
     {
-    case CFA_REG_OFFSET:
-      cache->cfa = read_reg (this_frame, fs->regs.cfa_reg);
-      if (fs->armcc_cfa_offsets_reversed)
-       cache->cfa -= fs->regs.cfa_offset;
-      else
-       cache->cfa += fs->regs.cfa_offset;
-      break;
-
-    case CFA_EXP:
-      cache->cfa =
-       execute_stack_op (fs->regs.cfa_exp, fs->regs.cfa_exp_len,
-                         cache->addr_size, cache->text_offset,
-                         this_frame, 0, 0);
-      break;
+      /* Calculate the CFA.  */
+      switch (fs->regs.cfa_how)
+       {
+       case CFA_REG_OFFSET:
+         cache->cfa = read_reg (this_frame, fs->regs.cfa_reg);
+         if (fs->armcc_cfa_offsets_reversed)
+           cache->cfa -= fs->regs.cfa_offset;
+         else
+           cache->cfa += fs->regs.cfa_offset;
+         break;
+
+       case CFA_EXP:
+         cache->cfa =
+           execute_stack_op (fs->regs.cfa_exp, fs->regs.cfa_exp_len,
+                             cache->addr_size, cache->text_offset,
+                             this_frame, 0, 0);
+         break;
+
+       default:
+         internal_error (__FILE__, __LINE__, _("Unknown CFA rule."));
+       }
+    }
+  if (ex.reason < 0)
+    {
+      if (ex.error == NOT_AVAILABLE_ERROR)
+       {
+         cache->unavailable_retaddr = 1;
+         return cache;
+       }
 
-    default:
-      internal_error (__FILE__, __LINE__, _("Unknown CFA rule."));
+      throw_exception (ex);
     }
 
   /* Initialize the register state.  */
@@ -1193,10 +1212,25 @@ incomplete CFI data; unspecified registers (e.g., %s) at %s"),
 
   do_cleanups (old_chain);
 
-  *this_cache = cache;
   return cache;
 }
 
+static enum unwind_stop_reason
+dwarf2_frame_unwind_stop_reason (struct frame_info *this_frame,
+                                void **this_cache)
+{
+  struct dwarf2_frame_cache *cache
+    = dwarf2_frame_cache (this_frame, this_cache);
+
+  if (cache->unavailable_retaddr)
+    return UNWIND_UNAVAILABLE;
+
+  if (cache->undefined_retaddr)
+    return UNWIND_OUTERMOST;
+
+  return UNWIND_NO_REASON;
+}
+
 static void
 dwarf2_frame_this_id (struct frame_info *this_frame, void **this_cache,
                      struct frame_id *this_id)
@@ -1204,6 +1238,9 @@ dwarf2_frame_this_id (struct frame_info *this_frame, void **this_cache,
   struct dwarf2_frame_cache *cache =
     dwarf2_frame_cache (this_frame, this_cache);
 
+  if (cache->unavailable_retaddr)
+    return;
+
   if (cache->undefined_retaddr)
     return;
 
@@ -1321,6 +1358,7 @@ dwarf2_frame_sniffer (const struct frame_unwind *self,
 static const struct frame_unwind dwarf2_frame_unwind =
 {
   NORMAL_FRAME,
+  dwarf2_frame_unwind_stop_reason,
   dwarf2_frame_this_id,
   dwarf2_frame_prev_register,
   NULL,
@@ -1330,6 +1368,7 @@ static const struct frame_unwind dwarf2_frame_unwind =
 static const struct frame_unwind dwarf2_signal_frame_unwind =
 {
   SIGTRAMP_FRAME,
+  dwarf2_frame_unwind_stop_reason,
   dwarf2_frame_this_id,
   dwarf2_frame_prev_register,
   NULL,
index 27a53502346a147f5cb1987a075ebca927500ad5..cc04b30110189c5bb7a1a0fee3d87650918764af 100644 (file)
@@ -25,7 +25,7 @@
 #include "inline-frame.h"
 #include "value.h"
 #include "regcache.h"
-
+#include "exceptions.h"
 #include "gdb_assert.h"
 #include "gdb_obstack.h"
 
@@ -103,14 +103,31 @@ frame_unwind_find_by_frame (struct frame_info *this_frame, void **this_cache)
   for (entry = table->list; entry != NULL; entry = entry->next)
     {
       struct cleanup *old_cleanup;
+      volatile struct gdb_exception ex;
+      int res = 0;
 
       old_cleanup = frame_prepare_for_sniffer (this_frame, entry->unwinder);
-      if (entry->unwinder->sniffer (entry->unwinder, this_frame,
-                                   this_cache))
+
+      TRY_CATCH (ex, RETURN_MASK_ERROR)
        {
-         discard_cleanups (old_cleanup);
-         return;
+         res = entry->unwinder->sniffer (entry->unwinder, this_frame,
+                                         this_cache);
        }
+      if (ex.reason < 0 && ex.error == NOT_AVAILABLE_ERROR)
+       {
+         /* This usually means that not even the PC is available,
+            thus most unwinders aren't able to determine if they're
+            the best fit.  Keep trying.  Fallback prologue unwinders
+            should always accept the frame.  */
+       }
+      else if (ex.reason < 0)
+       throw_exception (ex);
+      else if (res)
+        {
+          discard_cleanups (old_cleanup);
+          return;
+        }
+
       do_cleanups (old_cleanup);
     }
   internal_error (__FILE__, __LINE__, _("frame_unwind_find_by_frame failed"));
@@ -127,6 +144,16 @@ default_frame_sniffer (const struct frame_unwind *self,
   return 1;
 }
 
+/* A default frame unwinder stop_reason callback that always claims
+   the frame is unwindable.  */
+
+enum unwind_stop_reason
+default_frame_unwind_stop_reason (struct frame_info *this_frame,
+                                 void **this_cache)
+{
+  return UNWIND_NO_REASON;
+}
+
 /* Helper functions for value-based register unwinding.  These return
    a (possibly lazy) value of the appropriate type.  */
 
index e449766b253b24bdc48f5e0c6ebdc1b4bebf0711..5b04a1cb3067d66d03f231b4e686a8f913acd8e9 100644 (file)
@@ -51,6 +51,9 @@ typedef int (frame_sniffer_ftype) (const struct frame_unwind *self,
                                   struct frame_info *this_frame,
                                   void **this_prologue_cache);
 
+typedef enum unwind_stop_reason (frame_unwind_stop_reason_ftype)
+  (struct frame_info *this_frame, void **this_prologue_cache);
+
 /* A default frame sniffer which always accepts the frame.  Used by
    fallback prologue unwinders.  */
 
@@ -58,6 +61,13 @@ int default_frame_sniffer (const struct frame_unwind *self,
                           struct frame_info *this_frame,
                           void **this_prologue_cache);
 
+/* A default stop_reason callback which always claims the frame is
+   unwindable.  */
+
+enum unwind_stop_reason
+  default_frame_unwind_stop_reason (struct frame_info *this_frame,
+                                   void **this_cache);
+
 /* Assuming the frame chain: (outer) prev <-> this <-> next (inner);
    use THIS frame, and through it the NEXT frame's register unwind
    method, to determine the frame ID of THIS frame.
@@ -136,6 +146,7 @@ struct frame_unwind
   enum frame_type type;
   /* Should an attribute indicating the frame's address-in-block go
      here?  */
+  frame_unwind_stop_reason_ftype *stop_reason;
   frame_this_id_ftype *this_id;
   frame_prev_register_ftype *prev_register;
   const struct frame_data *unwind_data;
index a817e4d6eb8b75d240f3a34b41592b65e5e7dd2e..7a3519222ffeb4471cc9802fc8ef58ed382caa4f 100644 (file)
@@ -912,6 +912,12 @@ frame_unwind_register (struct frame_info *frame, int regnum, gdb_byte *buf)
 
   frame_register_unwind (frame, regnum, &optimized, &unavailable,
                         &lval, &addr, &realnum, buf);
+
+  if (optimized)
+    error (_("Register %d was optimized out"), regnum);
+  if (unavailable)
+    throw_error (NOT_AVAILABLE_ERROR,
+                _("Register %d is not available"), regnum);
 }
 
 void
@@ -1607,6 +1613,15 @@ get_prev_frame_1 (struct frame_info *this_frame)
   if (get_frame_type (this_frame) == INLINE_FRAME)
     return get_prev_frame_raw (this_frame);
 
+  /* Check that this frame is unwindable.  If it isn't, don't try to
+     unwind to the prev frame.  */
+  this_frame->stop_reason
+    = this_frame->unwind->stop_reason (this_frame,
+                                      &this_frame->prologue_cache);
+
+  if (this_frame->stop_reason != UNWIND_NO_REASON)
+    return NULL;
+
   /* Check that this frame's ID was valid.  If it wasn't, don't try to
      unwind to the prev frame.  Be careful to not apply this test to
      the sentinel frame.  */
@@ -2333,6 +2348,9 @@ frame_stop_reason_string (enum unwind_stop_reason reason)
     case UNWIND_NULL_ID:
       return _("unwinder did not report frame ID");
 
+    case UNWIND_UNAVAILABLE:
+      return _("Not enough registers or memory available to unwind further");
+
     case UNWIND_INNER_ID:
       return _("previous frame inner to this frame (corrupt stack?)");
 
index 7bc11480afdafee6f5a13141a577cc36a9273a23..a2052c030d732b76f9e58eda1e77fe461f96550c 100644 (file)
@@ -457,12 +457,19 @@ enum unwind_stop_reason
        error.  But that's a project for another day.  */
     UNWIND_NULL_ID,
 
+    /* This frame is the outermost.  */
+    UNWIND_OUTERMOST,
+
     /* All the conditions after this point are considered errors;
        abnormal stack termination.  If a backtrace stops for one
        of these reasons, we'll let the user know.  This marker
        is not a valid stop reason.  */
     UNWIND_FIRST_ERROR,
 
+    /* Can't unwind further, because that would require knowing the
+       values of registers or memory that haven't been collected.  */
+    UNWIND_UNAVAILABLE,
+
     /* This frame ID looks like it ought to belong to a NEXT frame,
        but we got it for a PREV frame.  Normally, this is a sign of
        unwinder failure.  It could also indicate stack corruption.  */
index 924a06b98286a793928c44220a0898825cd9ef83..b13554b743ecc43086a6cddd58ca5f390506ada5 100644 (file)
@@ -336,6 +336,7 @@ frv_linux_sigtramp_frame_sniffer (const struct frame_unwind *self,
 static const struct frame_unwind frv_linux_sigtramp_frame_unwind =
 {
   SIGTRAMP_FRAME,
+  default_frame_unwind_stop_reason,
   frv_linux_sigtramp_frame_this_id,
   frv_linux_sigtramp_frame_prev_register,
   NULL,
index 66c25a854f28f246c827f6a23aa509d8c6d5554a..98e64726fda37cc2a008db421fa0ab4bdc46a5ec 100644 (file)
@@ -1494,6 +1494,7 @@ frv_frame_prev_register (struct frame_info *this_frame,
 
 static const struct frame_unwind frv_frame_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   frv_frame_this_id,
   frv_frame_prev_register,
   NULL,
index 0b11df36d52ef9cc36c1583a0b9f88bdc80eaa3c..fa39dee36f5055c1f4ecf95e6cd332021234497d 100644 (file)
@@ -526,6 +526,7 @@ h8300_frame_prev_register (struct frame_info *this_frame, void **this_cache,
 
 static const struct frame_unwind h8300_frame_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   h8300_frame_this_id,
   h8300_frame_prev_register,
   NULL,
index b9761c36bd0cf8ab400d10f7a30cd0782ece89f0..00ccf703b27b55ee3b86e5a48a6ea887c991e829 100644 (file)
@@ -753,6 +753,7 @@ hppa_hpux_sigtramp_unwind_sniffer (const struct frame_unwind *self,
 
 static const struct frame_unwind hppa_hpux_sigtramp_frame_unwind = {
   SIGTRAMP_FRAME,
+  default_frame_unwind_stop_reason,
   hppa_hpux_sigtramp_frame_this_id,
   hppa_hpux_sigtramp_frame_prev_register,
   NULL,
index 355f8f9d099b9db783c636a4d3bf438eaff78e51..e51fbcc634038f0e0e65767e77d2afed9969758e 100644 (file)
@@ -314,6 +314,7 @@ hppa_linux_sigtramp_frame_sniffer (const struct frame_unwind *self,
 
 static const struct frame_unwind hppa_linux_sigtramp_frame_unwind = {
   SIGTRAMP_FRAME,
+  default_frame_unwind_stop_reason,
   hppa_linux_sigtramp_frame_this_id,
   hppa_linux_sigtramp_frame_prev_register,
   NULL,
index df21faddcd372190b78e60c994bf21a18d28adae..b22e3c04e42baf2815c65f647500448ac791ea40 100644 (file)
@@ -2225,6 +2225,7 @@ hppa_frame_unwind_sniffer (const struct frame_unwind *self,
 static const struct frame_unwind hppa_frame_unwind =
 {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   hppa_frame_this_id,
   hppa_frame_prev_register,
   NULL,
@@ -2335,6 +2336,7 @@ hppa_fallback_frame_prev_register (struct frame_info *this_frame,
 static const struct frame_unwind hppa_fallback_frame_unwind =
 {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   hppa_fallback_frame_this_id,
   hppa_fallback_frame_prev_register,
   NULL,
@@ -2431,6 +2433,7 @@ hppa_stub_unwind_sniffer (const struct frame_unwind *self,
 
 static const struct frame_unwind hppa_stub_frame_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   hppa_stub_frame_this_id,
   hppa_stub_frame_prev_register,
   NULL,
index 62df6141ecec4586fef98f729b2c156736058eff..c7ad3a66074577099f8cd78d6918960c2f5ac625 100644 (file)
@@ -45,7 +45,7 @@
 #include "dis-asm.h"
 #include "disasm.h"
 #include "remote.h"
-
+#include "exceptions.h"
 #include "gdb_assert.h"
 #include "gdb_string.h"
 
@@ -804,6 +804,7 @@ struct i386_frame_cache
 {
   /* Base address.  */
   CORE_ADDR base;
+  int base_p;
   LONGEST sp_offset;
   CORE_ADDR pc;
 
@@ -828,6 +829,7 @@ i386_alloc_frame_cache (void)
   cache = FRAME_OBSTACK_ZALLOC (struct i386_frame_cache);
 
   /* Base address.  */
+  cache->base_p = 0;
   cache->base = 0;
   cache->sp_offset = -4;
   cache->pc = 0;
@@ -1608,20 +1610,16 @@ i386_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
 
 /* Normal frames.  */
 
-static struct i386_frame_cache *
-i386_frame_cache (struct frame_info *this_frame, void **this_cache)
+static void
+i386_frame_cache_1 (struct frame_info *this_frame,
+                   struct i386_frame_cache *cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-  struct i386_frame_cache *cache;
   gdb_byte buf[4];
   int i;
 
-  if (*this_cache)
-    return *this_cache;
-
-  cache = i386_alloc_frame_cache ();
-  *this_cache = cache;
+  cache->pc = get_frame_func (this_frame);
 
   /* In principle, for normal frames, %ebp holds the frame pointer,
      which holds the base address for the current stack frame.
@@ -1635,23 +1633,15 @@ i386_frame_cache (struct frame_info *this_frame, void **this_cache)
   get_frame_register (this_frame, I386_EBP_REGNUM, buf);
   cache->base = extract_unsigned_integer (buf, 4, byte_order);
   if (cache->base == 0)
-    return cache;
+    return;
 
   /* For normal frames, %eip is stored at 4(%ebp).  */
   cache->saved_regs[I386_EIP_REGNUM] = 4;
 
-  cache->pc = get_frame_func (this_frame);
   if (cache->pc != 0)
     i386_analyze_prologue (gdbarch, cache->pc, get_frame_pc (this_frame),
                           cache);
 
-  if (cache->saved_sp_reg != -1)
-    {
-      /* Saved stack pointer has been saved.  */
-      get_frame_register (this_frame, cache->saved_sp_reg, buf);
-      cache->saved_sp = extract_unsigned_integer (buf, 4, byte_order);
-    }
-
   if (cache->locals < 0)
     {
       /* We didn't find a valid frame, which means that CACHE->base
@@ -1664,6 +1654,10 @@ i386_frame_cache (struct frame_info *this_frame, void **this_cache)
 
       if (cache->saved_sp_reg != -1)
        {
+         /* Saved stack pointer has been saved.  */
+         get_frame_register (this_frame, cache->saved_sp_reg, buf);
+         cache->saved_sp = extract_unsigned_integer (buf, 4, byte_order);
+
          /* We're halfway aligning the stack.  */
          cache->base = ((cache->saved_sp - 4) & 0xfffffff0) - 4;
          cache->saved_regs[I386_EIP_REGNUM] = cache->saved_sp - 4;
@@ -1691,9 +1685,17 @@ i386_frame_cache (struct frame_info *this_frame, void **this_cache)
        cache->saved_regs[I386_EBP_REGNUM] = 0;
     }
 
+  if (cache->saved_sp_reg != -1)
+    {
+      /* Saved stack pointer has been saved (but the SAVED_SP_REG
+        register may be unavailable).  */
+      if (cache->saved_sp == 0
+         && frame_register_read (this_frame, cache->saved_sp_reg, buf))
+       cache->saved_sp = extract_unsigned_integer (buf, 4, byte_order);
+    }
   /* Now that we have the base address for the stack frame we can
      calculate the value of %esp in the calling frame.  */
-  if (cache->saved_sp == 0)
+  else if (cache->saved_sp == 0)
     cache->saved_sp = cache->base + 8;
 
   /* Adjust all the saved registers such that they contain addresses
@@ -1702,6 +1704,28 @@ i386_frame_cache (struct frame_info *this_frame, void **this_cache)
     if (cache->saved_regs[i] != -1)
       cache->saved_regs[i] += cache->base;
 
+  cache->base_p = 1;
+}
+
+static struct i386_frame_cache *
+i386_frame_cache (struct frame_info *this_frame, void **this_cache)
+{
+  volatile struct gdb_exception ex;
+  struct i386_frame_cache *cache;
+
+  if (*this_cache)
+    return *this_cache;
+
+  cache = i386_alloc_frame_cache ();
+  *this_cache = cache;
+
+  TRY_CATCH (ex, RETURN_MASK_ERROR)
+    {
+      i386_frame_cache_1 (this_frame, cache);
+    }
+  if (ex.reason < 0 && ex.error != NOT_AVAILABLE_ERROR)
+    throw_exception (ex);
+
   return cache;
 }
 
@@ -1719,6 +1743,22 @@ i386_frame_this_id (struct frame_info *this_frame, void **this_cache,
   (*this_id) = frame_id_build (cache->base + 8, cache->pc);
 }
 
+static enum unwind_stop_reason
+i386_frame_unwind_stop_reason (struct frame_info *this_frame,
+                              void **this_cache)
+{
+  struct i386_frame_cache *cache = i386_frame_cache (this_frame, this_cache);
+
+  if (!cache->base_p)
+    return UNWIND_UNAVAILABLE;
+
+  /* This marks the outermost frame.  */
+  if (cache->base == 0)
+    return UNWIND_OUTERMOST;
+
+  return UNWIND_NO_REASON;
+}
+
 static struct value *
 i386_frame_prev_register (struct frame_info *this_frame, void **this_cache,
                          int regnum)
@@ -1758,8 +1798,18 @@ i386_frame_prev_register (struct frame_info *this_frame, void **this_cache,
   if (regnum == I386_EIP_REGNUM && cache->pc_in_eax)
     return frame_unwind_got_register (this_frame, regnum, I386_EAX_REGNUM);
 
-  if (regnum == I386_ESP_REGNUM && cache->saved_sp)
-    return frame_unwind_got_constant (this_frame, regnum, cache->saved_sp);
+  if (regnum == I386_ESP_REGNUM)
+    {
+      /* If the SP has been saved, but we don't know where, then this
+        means that SAVED_SP_REG register was found unavailable back
+        when we built the cache.  */
+      if (cache->saved_sp == 0 && cache->saved_sp_reg != -1)
+       return frame_unwind_got_register (this_frame, regnum,
+                                         cache->saved_sp_reg);
+      else
+       return frame_unwind_got_constant (this_frame, regnum,
+                                         cache->saved_sp);
+    }
 
   if (regnum < I386_NUM_SAVED_REGS && cache->saved_regs[regnum] != -1)
     return frame_unwind_got_memory (this_frame, regnum,
@@ -1771,6 +1821,7 @@ i386_frame_prev_register (struct frame_info *this_frame, void **this_cache,
 static const struct frame_unwind i386_frame_unwind =
 {
   NORMAL_FRAME,
+  i386_frame_unwind_stop_reason,
   i386_frame_this_id,
   i386_frame_prev_register,
   NULL,
@@ -1814,6 +1865,7 @@ i386_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+  volatile struct gdb_exception ex;
   struct i386_frame_cache *cache;
   gdb_byte buf[4];
 
@@ -1823,23 +1875,43 @@ i386_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache)
   cache = i386_alloc_frame_cache ();
   *this_cache = cache;
 
-  /* Cache base will be %esp plus cache->sp_offset (-4).  */
-  get_frame_register (this_frame, I386_ESP_REGNUM, buf);
-  cache->base = extract_unsigned_integer (buf, 4, 
-                                         byte_order) + cache->sp_offset;
+  TRY_CATCH (ex, RETURN_MASK_ERROR)
+    {
+      /* Cache base will be %esp plus cache->sp_offset (-4).  */
+      get_frame_register (this_frame, I386_ESP_REGNUM, buf);
+      cache->base = extract_unsigned_integer (buf, 4,
+                                             byte_order) + cache->sp_offset;
 
-  /* Cache pc will be the frame func.  */
-  cache->pc = get_frame_pc (this_frame);
+      /* Cache pc will be the frame func.  */
+      cache->pc = get_frame_pc (this_frame);
 
-  /* The saved %esp will be at cache->base plus 8.  */
-  cache->saved_sp = cache->base + 8;
+      /* The saved %esp will be at cache->base plus 8.  */
+      cache->saved_sp = cache->base + 8;
 
-  /* The saved %eip will be at cache->base plus 4.  */
-  cache->saved_regs[I386_EIP_REGNUM] = cache->base + 4;
+      /* The saved %eip will be at cache->base plus 4.  */
+      cache->saved_regs[I386_EIP_REGNUM] = cache->base + 4;
+
+      cache->base_p = 1;
+    }
+  if (ex.reason < 0 && ex.error != NOT_AVAILABLE_ERROR)
+    throw_exception (ex);
 
   return cache;
 }
 
+static enum unwind_stop_reason
+i386_epilogue_frame_unwind_stop_reason (struct frame_info *this_frame,
+                                       void **this_cache)
+{
+  struct i386_frame_cache *cache
+    = i386_epilogue_frame_cache (this_frame, this_cache);
+
+  if (!cache->base_p)
+    return UNWIND_UNAVAILABLE;
+
+  return UNWIND_NO_REASON;
+}
+
 static void
 i386_epilogue_frame_this_id (struct frame_info *this_frame,
                             void **this_cache,
@@ -1848,12 +1920,16 @@ i386_epilogue_frame_this_id (struct frame_info *this_frame,
   struct i386_frame_cache *cache = i386_epilogue_frame_cache (this_frame,
                                                              this_cache);
 
+  if (!cache->base_p)
+    return;
+
   (*this_id) = frame_id_build (cache->base + 8, cache->pc);
 }
 
 static const struct frame_unwind i386_epilogue_frame_unwind =
 {
   NORMAL_FRAME,
+  i386_epilogue_frame_unwind_stop_reason,
   i386_epilogue_frame_this_id,
   i386_frame_prev_register,
   NULL, 
@@ -1869,6 +1945,7 @@ i386_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache)
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+  volatile struct gdb_exception ex;
   struct i386_frame_cache *cache;
   CORE_ADDR addr;
   gdb_byte buf[4];
@@ -1878,30 +1955,50 @@ i386_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache)
 
   cache = i386_alloc_frame_cache ();
 
-  get_frame_register (this_frame, I386_ESP_REGNUM, buf);
-  cache->base = extract_unsigned_integer (buf, 4, byte_order) - 4;
-
-  addr = tdep->sigcontext_addr (this_frame);
-  if (tdep->sc_reg_offset)
+  TRY_CATCH (ex, RETURN_MASK_ERROR)
     {
-      int i;
+      get_frame_register (this_frame, I386_ESP_REGNUM, buf);
+      cache->base = extract_unsigned_integer (buf, 4, byte_order) - 4;
 
-      gdb_assert (tdep->sc_num_regs <= I386_NUM_SAVED_REGS);
+      addr = tdep->sigcontext_addr (this_frame);
+      if (tdep->sc_reg_offset)
+       {
+         int i;
 
-      for (i = 0; i < tdep->sc_num_regs; i++)
-       if (tdep->sc_reg_offset[i] != -1)
-         cache->saved_regs[i] = addr + tdep->sc_reg_offset[i];
-    }
-  else
-    {
-      cache->saved_regs[I386_EIP_REGNUM] = addr + tdep->sc_pc_offset;
-      cache->saved_regs[I386_ESP_REGNUM] = addr + tdep->sc_sp_offset;
+         gdb_assert (tdep->sc_num_regs <= I386_NUM_SAVED_REGS);
+
+         for (i = 0; i < tdep->sc_num_regs; i++)
+           if (tdep->sc_reg_offset[i] != -1)
+             cache->saved_regs[i] = addr + tdep->sc_reg_offset[i];
+       }
+      else
+       {
+         cache->saved_regs[I386_EIP_REGNUM] = addr + tdep->sc_pc_offset;
+         cache->saved_regs[I386_ESP_REGNUM] = addr + tdep->sc_sp_offset;
+       }
+
+      cache->base_p = 1;
     }
+  if (ex.reason < 0 && ex.error != NOT_AVAILABLE_ERROR)
+    throw_exception (ex);
 
   *this_cache = cache;
   return cache;
 }
 
+static enum unwind_stop_reason
+i386_sigtramp_frame_unwind_stop_reason (struct frame_info *this_frame,
+                                       void **this_cache)
+{
+  struct i386_frame_cache *cache =
+    i386_sigtramp_frame_cache (this_frame, this_cache);
+
+  if (!cache->base_p)
+    return UNWIND_UNAVAILABLE;
+
+  return UNWIND_NO_REASON;
+}
+
 static void
 i386_sigtramp_frame_this_id (struct frame_info *this_frame, void **this_cache,
                             struct frame_id *this_id)
@@ -1909,6 +2006,9 @@ i386_sigtramp_frame_this_id (struct frame_info *this_frame, void **this_cache,
   struct i386_frame_cache *cache =
     i386_sigtramp_frame_cache (this_frame, this_cache);
 
+  if (!cache->base_p)
+    return;
+
   /* See the end of i386_push_dummy_call.  */
   (*this_id) = frame_id_build (cache->base + 8, get_frame_pc (this_frame));
 }
@@ -1956,6 +2056,7 @@ i386_sigtramp_frame_sniffer (const struct frame_unwind *self,
 static const struct frame_unwind i386_sigtramp_frame_unwind =
 {
   SIGTRAMP_FRAME,
+  i386_sigtramp_frame_unwind_stop_reason,
   i386_sigtramp_frame_this_id,
   i386_sigtramp_frame_prev_register,
   NULL,
index 842215fb8f8d1935095de21d1cd33f63d26fa065..480aa0cf5e4dbb07334a0c4d6f48f0d71546105f 100644 (file)
@@ -434,6 +434,7 @@ static const struct frame_unwind i386obsd_trapframe_unwind = {
      frame, but SIGTRAMP_FRAME would print <signal handler called>,
      which really is not what we want here.  */
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   i386obsd_trapframe_this_id,
   i386obsd_trapframe_prev_register,
   NULL,
index 363800dbf291cb67a539b408af87b5ec0f35b4f8..68e50217028351c3560710923fadaea629a33f2e 100644 (file)
@@ -2175,6 +2175,7 @@ ia64_frame_prev_register (struct frame_info *this_frame, void **this_cache,
 static const struct frame_unwind ia64_frame_unwind =
 {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   &ia64_frame_this_id,
   &ia64_frame_prev_register,
   NULL,
@@ -2366,6 +2367,7 @@ ia64_sigtramp_frame_sniffer (const struct frame_unwind *self,
 static const struct frame_unwind ia64_sigtramp_frame_unwind =
 {
   SIGTRAMP_FRAME,
+  default_frame_unwind_stop_reason,
   ia64_sigtramp_frame_this_id,
   ia64_sigtramp_frame_prev_register,
   NULL,
@@ -3051,6 +3053,7 @@ ia64_libunwind_frame_sniffer (const struct frame_unwind *self,
 static const struct frame_unwind ia64_libunwind_frame_unwind =
 {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   ia64_libunwind_frame_this_id,
   ia64_libunwind_frame_prev_register,
   NULL,
@@ -3139,6 +3142,7 @@ ia64_libunwind_sigtramp_frame_sniffer (const struct frame_unwind *self,
 static const struct frame_unwind ia64_libunwind_sigtramp_frame_unwind =
 {
   SIGTRAMP_FRAME,
+  default_frame_unwind_stop_reason,
   ia64_libunwind_sigtramp_frame_this_id,
   ia64_libunwind_sigtramp_frame_prev_register,
   NULL,
index 7554fc760004e3ca546ba985136a0030f3446e4c..dc05b8a344939452abfeab4725456bbe04806809 100644 (file)
@@ -260,6 +260,7 @@ inline_frame_sniffer (const struct frame_unwind *self,
 
 const struct frame_unwind inline_frame_unwind = {
   INLINE_FRAME,
+  default_frame_unwind_stop_reason,
   inline_frame_this_id,
   inline_frame_prev_register,
   NULL,
index 2e54478069a864f8c047a916e8d95901bbda8c56..1926da60b398edb9fce86a2ee0ce6b6d750c0ebb 100644 (file)
@@ -436,6 +436,7 @@ iq2000_frame_this_id (struct frame_info *this_frame, void **this_cache,
 
 static const struct frame_unwind iq2000_frame_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   iq2000_frame_this_id,
   iq2000_frame_prev_register,
   NULL,
index 327ac327d8aaa0f9c6c55d04410e056d6b59c3cf..d05b3b81a847bc00d24f7d7078abbd57345da269 100644 (file)
@@ -496,6 +496,7 @@ lm32_frame_prev_register (struct frame_info *this_frame,
 
 static const struct frame_unwind lm32_frame_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   lm32_frame_this_id,
   lm32_frame_prev_register,
   NULL,
index 454a4b681c2a8f920348aa6c04dcde3526b6f82f..673e40cb4160595535f150ceb0efa63629d6a08c 100644 (file)
@@ -1960,6 +1960,7 @@ m32c_prev_register (struct frame_info *this_frame,
 
 static const struct frame_unwind m32c_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   m32c_this_id,
   m32c_prev_register,
   NULL,
index 1339a872d216c32bbcf81d6d91b10bb0c4ffe515..a7efe612dec857ae4caa0ddb81a342a7dae8ba62 100644 (file)
@@ -305,6 +305,7 @@ m32r_linux_sigtramp_frame_sniffer (const struct frame_unwind *self,
 
 static const struct frame_unwind m32r_linux_sigtramp_frame_unwind = {
   SIGTRAMP_FRAME,
+  default_frame_unwind_stop_reason,
   m32r_linux_sigtramp_frame_this_id,
   m32r_linux_sigtramp_frame_prev_register,
   NULL,
index 659c3c87487256031e60c872fffecafa43d6015b..136fd7bc65dea71b75aebe9cfeea95701492e27f 100644 (file)
@@ -876,6 +876,7 @@ m32r_frame_prev_register (struct frame_info *this_frame,
 
 static const struct frame_unwind m32r_frame_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   m32r_frame_this_id,
   m32r_frame_prev_register,
   NULL,
index ced6eabb520d48d360beb7d19ab6b5996e398622..b789ce72c872b84198a6b03370305179c3468cf4 100644 (file)
@@ -949,6 +949,7 @@ m68hc11_frame_prev_register (struct frame_info *this_frame,
 
 static const struct frame_unwind m68hc11_frame_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   m68hc11_frame_this_id,
   m68hc11_frame_prev_register,
   NULL,
index 2706969dac5914d90b031cf048c0444ca6d8e686..6d7a824f79cd747de0f99be92a09701adec9f6e5 100644 (file)
@@ -976,6 +976,7 @@ m68k_frame_prev_register (struct frame_info *this_frame, void **this_cache,
 static const struct frame_unwind m68k_frame_unwind =
 {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   m68k_frame_this_id,
   m68k_frame_prev_register,
   NULL,
index b95fad566da6874ed98366fa62f0e8852363cd73..c3513bcd182e11701a6bc679a882825a3c969e9a 100644 (file)
@@ -328,6 +328,7 @@ m68k_linux_sigtramp_frame_sniffer (const struct frame_unwind *self,
 static const struct frame_unwind m68k_linux_sigtramp_frame_unwind =
 {
   SIGTRAMP_FRAME,
+  default_frame_unwind_stop_reason,
   m68k_linux_sigtramp_frame_this_id,
   m68k_linux_sigtramp_frame_prev_register,
   NULL,
index 76dcbe140186a397c9f592beb2dec5b2dd477901..1e4c546b0aef1617e36b9186f2210a79596894d2 100644 (file)
@@ -749,6 +749,7 @@ m88k_frame_prev_register (struct frame_info *this_frame,
 static const struct frame_unwind m88k_frame_unwind =
 {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   m88k_frame_this_id,
   m88k_frame_prev_register,
   NULL,
index dd5a4a541b3127a5e261d10905332bca181a638a..bc40b9980ec8038d0bd82e2d2dad58d369943514 100644 (file)
@@ -2094,6 +2094,7 @@ mep_frame_prev_register (struct frame_info *this_frame,
 
 static const struct frame_unwind mep_frame_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   mep_frame_this_id,
   mep_frame_prev_register,
   NULL,
index 1e994a2d6cfb0af19bdabd077ff547eda5e127b6..2482c87f48dd3e546694c2d429101527942ba4a6 100644 (file)
@@ -521,6 +521,7 @@ microblaze_frame_prev_register (struct frame_info *this_frame,
 static const struct frame_unwind microblaze_frame_unwind =
 {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   microblaze_frame_this_id,
   microblaze_frame_prev_register,
   NULL,
index e5aed94c578bba0c6595641df83be31c03dbc5af..47d9182b02da46dee53f7e0a9fc7cec9ca0ced69 100644 (file)
@@ -2028,6 +2028,7 @@ mips_insn16_frame_sniffer (const struct frame_unwind *self,
 static const struct frame_unwind mips_insn16_frame_unwind =
 {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   mips_insn16_frame_this_id,
   mips_insn16_frame_prev_register,
   NULL,
@@ -2381,6 +2382,7 @@ mips_insn32_frame_sniffer (const struct frame_unwind *self,
 static const struct frame_unwind mips_insn32_frame_unwind =
 {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   mips_insn32_frame_this_id,
   mips_insn32_frame_prev_register,
   NULL,
@@ -2505,6 +2507,7 @@ mips_stub_frame_sniffer (const struct frame_unwind *self,
 static const struct frame_unwind mips_stub_frame_unwind =
 {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   mips_stub_frame_this_id,
   mips_stub_frame_prev_register,
   NULL,
index 5b83b226a3d9b3c63236c612ac12225ac72bddf1..e949b403b7ab7d44089ceaae611fd7626f7dbc7c 100644 (file)
@@ -1174,6 +1174,7 @@ mn10300_frame_prev_register (struct frame_info *this_frame,
 
 static const struct frame_unwind mn10300_frame_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   mn10300_frame_this_id, 
   mn10300_frame_prev_register,
   NULL,
index 84d495fcfb6f402a728189b658be0a116b30b4b3..5fb3d108baa8a836a9714748dd8a2d186e23bc01 100644 (file)
@@ -461,6 +461,7 @@ moxie_frame_prev_register (struct frame_info *this_frame,
 
 static const struct frame_unwind moxie_frame_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   moxie_frame_this_id,
   moxie_frame_prev_register,
   NULL,
index 9b0971f76260b0eafc03cb778b94ea51b6579927..ee98d3d25caf39a4143f1fea90cfa75d32f4ecb0 100644 (file)
@@ -1115,6 +1115,7 @@ mt_frame_base_address (struct frame_info *this_frame,
 
 static const struct frame_unwind mt_frame_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   mt_frame_this_id,
   mt_frame_prev_register,
   NULL,
index ba70ffdd988979d1bbf0f5e44fde39bba87dac80..c6e4b838c09aad1f940e20e39438f7dd924d2495 100644 (file)
@@ -1472,6 +1472,7 @@ ppu2spu_dealloc_cache (struct frame_info *self, void *this_cache)
 
 static const struct frame_unwind ppu2spu_unwind = {
   ARCH_FRAME,
+  default_frame_unwind_stop_reason,
   ppu2spu_this_id,
   ppu2spu_prev_register,
   NULL,
index 51cb639dc2d112ed2406aa6e8c78ccd1bf1647e7..d4e2d792e02b58f445e71ccaf20685fb1c260fda 100644 (file)
@@ -239,6 +239,7 @@ ppcobsd_sigtramp_frame_prev_register (struct frame_info *this_frame,
 
 static const struct frame_unwind ppcobsd_sigtramp_frame_unwind = {
   SIGTRAMP_FRAME,
+  default_frame_unwind_stop_reason,
   ppcobsd_sigtramp_frame_this_id,
   ppcobsd_sigtramp_frame_prev_register,
   NULL,
index 23fe9e336fe3a5092c32cdda2bf9abb1fe9f523c..653964430f0b7153f5cb4c396084ae9e91a4a646 100644 (file)
@@ -3319,6 +3319,7 @@ rs6000_frame_prev_register (struct frame_info *this_frame,
 static const struct frame_unwind rs6000_frame_unwind =
 {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   rs6000_frame_this_id,
   rs6000_frame_prev_register,
   NULL,
index d74bbf058143fa8f3af8857fc0c63ae56cc9d3f9..d9407efeb839eff2523d8c70d941e3add132cdca 100644 (file)
@@ -1758,6 +1758,7 @@ s390_frame_prev_register (struct frame_info *this_frame,
 
 static const struct frame_unwind s390_frame_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   s390_frame_this_id,
   s390_frame_prev_register,
   NULL,
@@ -1841,6 +1842,7 @@ s390_stub_frame_sniffer (const struct frame_unwind *self,
 
 static const struct frame_unwind s390_stub_frame_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   s390_stub_frame_this_id,
   s390_stub_frame_prev_register,
   NULL,
@@ -2032,6 +2034,7 @@ s390_sigtramp_frame_sniffer (const struct frame_unwind *self,
 
 static const struct frame_unwind s390_sigtramp_frame_unwind = {
   SIGTRAMP_FRAME,
+  default_frame_unwind_stop_reason,
   s390_sigtramp_frame_this_id,
   s390_sigtramp_frame_prev_register,
   NULL,
index ffe562fa34104143026c5d91314f27be86373788..4ddcd2773cd681c61e46b15218878ce783a09453 100644 (file)
@@ -1369,6 +1369,7 @@ score_prologue_prev_register (struct frame_info *this_frame,
 static const struct frame_unwind score_prologue_unwind =
 {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   score_prologue_this_id,
   score_prologue_prev_register,
   NULL,
index e6000cc136c95c9e69985332cf574570b21d97ef..6c2f3e079d11f8467948b97da686a1dc8f409daf 100644 (file)
@@ -51,9 +51,10 @@ sentinel_frame_prev_register (struct frame_info *this_frame,
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   struct frame_unwind_cache *cache = *this_prologue_cache;
   struct value *value;
+  struct type *regtype = register_type (gdbarch, regnum);
 
   /* Return the actual value.  */
-  value = allocate_value (register_type (gdbarch, regnum));
+  value = allocate_value (regtype);
   VALUE_LVAL (value) = lval_register;
   VALUE_REGNUM (value) = regnum;
   VALUE_FRAME_ID (value) = get_frame_id (this_frame);
@@ -64,7 +65,7 @@ sentinel_frame_prev_register (struct frame_info *this_frame,
   if (regcache_cooked_read (cache->regcache,
                            regnum,
                            value_contents_raw (value)) == REG_UNAVAILABLE)
-    mark_value_bytes_unavailable (value, 0, register_size (gdbarch, regnum));
+    mark_value_bytes_unavailable (value, 0, TYPE_LENGTH (regtype));
 
   return value;
 }
@@ -92,6 +93,7 @@ sentinel_frame_prev_arch (struct frame_info *this_frame,
 const struct frame_unwind sentinel_frame_unwind =
 {
   SENTINEL_FRAME,
+  default_frame_unwind_stop_reason,
   sentinel_frame_this_id,
   sentinel_frame_prev_register,
   NULL,
index 49ef8c64a0fb77f0438cf01415077a941d415d97..e713cee2cfc3e4b9b886abbd594ac1c892e5911b 100644 (file)
@@ -2635,6 +2635,7 @@ sh_frame_this_id (struct frame_info *this_frame, void **this_cache,
 
 static const struct frame_unwind sh_frame_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   sh_frame_this_id,
   sh_frame_prev_register,
   NULL,
index dca560a1c567397cd376f3e14c7977f9756b9d0a..a4da7a4d30d7388f8a0d28e6e5925addd30423b4 100644 (file)
@@ -2437,6 +2437,7 @@ sh64_frame_this_id (struct frame_info *this_frame, void **this_cache,
 
 static const struct frame_unwind sh64_frame_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   sh64_frame_this_id,
   sh64_frame_prev_register,
   NULL,
index ee9d9b52661d7652fc2744995eec10bdb6aa3004..a49eb7f36b1ec1a40e0d677acb3f36cb36acd592 100644 (file)
@@ -164,6 +164,7 @@ sparc32_sol2_sigtramp_frame_sniffer (const struct frame_unwind *self,
 static const struct frame_unwind sparc32_sol2_sigtramp_frame_unwind =
 {
   SIGTRAMP_FRAME,
+  default_frame_unwind_stop_reason,
   sparc32_sol2_sigtramp_frame_this_id,
   sparc32_sol2_sigtramp_frame_prev_register,
   NULL,
index 90817c9caf61fa23e3c9b26dfa78d79530ee3ad7..1039bd8e76847003ffaaaef5b7210150de8aa155 100644 (file)
@@ -1031,6 +1031,7 @@ sparc32_frame_prev_register (struct frame_info *this_frame,
 static const struct frame_unwind sparc32_frame_unwind =
 {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   sparc32_frame_this_id,
   sparc32_frame_prev_register,
   NULL,
index a50943f572ee1376185090468546a41e086f7278..d11619d8691dd9906fecc9f8a56c686cfd70eb65 100644 (file)
@@ -141,6 +141,7 @@ sparc64_sol2_sigtramp_frame_sniffer (const struct frame_unwind *self,
 static const struct frame_unwind sparc64_sol2_sigtramp_frame_unwind =
 {
   SIGTRAMP_FRAME,
+  default_frame_unwind_stop_reason,
   sparc64_sol2_sigtramp_frame_this_id,
   sparc64_sol2_sigtramp_frame_prev_register,
   NULL,
index 4b42f01556b1c3ffbeb35b61296b26c624cdb5f8..674d390bdb3f12ff5335b0cc246d553c35680cdd 100644 (file)
@@ -562,6 +562,7 @@ sparc64_frame_prev_register (struct frame_info *this_frame, void **this_cache,
 static const struct frame_unwind sparc64_frame_unwind =
 {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   sparc64_frame_this_id,
   sparc64_frame_prev_register,
   NULL,
index 36a117711f05459e5f2e9b68cf4246c1d6877cc5..49d3050338454f02ec717db8747e46c63b7b5613 100644 (file)
@@ -202,6 +202,7 @@ sparc64fbsd_sigtramp_frame_sniffer (const struct frame_unwind *self,
 static const struct frame_unwind sparc64fbsd_sigtramp_frame_unwind =
 {
   SIGTRAMP_FRAME,
+  default_frame_unwind_stop_reason,
   sparc64fbsd_sigtramp_frame_this_id,
   sparc64fbsd_sigtramp_frame_prev_register,
   NULL,
index 12818d01a9f5f2240595b6cfeede097ee9fe884c..5d6c27c17f4c7036ad42b2699642ce62e0309589 100644 (file)
@@ -230,6 +230,7 @@ sparc64nbsd_sigtramp_frame_sniffer (const struct frame_unwind *self,
 static const struct frame_unwind sparc64nbsd_sigcontext_frame_unwind =
 {
   SIGTRAMP_FRAME,
+  default_frame_unwind_stop_reason,
   sparc64nbsd_sigcontext_frame_this_id,
   sparc64nbsd_sigcontext_frame_prev_register,
   NULL,
index 226f277b5b76d8af64db9a966a60d32dedb8b003..adc16a18a45be881c93850bcaf729170131245d6 100644 (file)
@@ -195,6 +195,7 @@ sparc64obsd_sigtramp_frame_sniffer (const struct frame_unwind *self,
 static const struct frame_unwind sparc64obsd_frame_unwind =
 {
   SIGTRAMP_FRAME,
+  default_frame_unwind_stop_reason,
   sparc64obsd_frame_this_id,
   sparc64obsd_frame_prev_register,
   NULL,
@@ -277,6 +278,7 @@ sparc64obsd_trapframe_sniffer (const struct frame_unwind *self,
 static const struct frame_unwind sparc64obsd_trapframe_unwind =
 {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   sparc64obsd_trapframe_this_id,
   sparc64obsd_trapframe_prev_register,
   NULL,
index 03eb1ef4739fc297bfca284b1883abdfa0729877..8bbaa4bc9da4ab11f0bb1ddcf827951d362f0b40 100644 (file)
@@ -254,6 +254,7 @@ sparc32nbsd_sigcontext_frame_sniffer (const struct frame_unwind *self,
 static const struct frame_unwind sparc32nbsd_sigcontext_frame_unwind =
 {
   SIGTRAMP_FRAME,
+  default_frame_unwind_stop_reason,
   sparc32nbsd_sigcontext_frame_this_id,
   sparc32nbsd_sigcontext_frame_prev_register,
   NULL,
index 6a3c43cb74fa5878e033b7bfd1a6fccfdc2b0fb2..b9e954001a4012614e925b4ee55aefbe374b31da 100644 (file)
@@ -139,6 +139,7 @@ sparc32obsd_sigtramp_frame_sniffer (const struct frame_unwind *self,
 static const struct frame_unwind sparc32obsd_sigtramp_frame_unwind =
 {
   SIGTRAMP_FRAME,
+  default_frame_unwind_stop_reason,
   sparc32obsd_sigtramp_frame_this_id,
   sparc32obsd_sigtramp_frame_prev_register,
   NULL,
index da7024a0b39e08586159a506a306ddd11d5e3454..7f2079474e673624cf853c78372d769b96b1ed6f 100644 (file)
@@ -1082,6 +1082,7 @@ spu_frame_prev_register (struct frame_info *this_frame,
 
 static const struct frame_unwind spu_frame_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   spu_frame_this_id,
   spu_frame_prev_register,
   NULL,
@@ -1236,6 +1237,7 @@ spu2ppu_dealloc_cache (struct frame_info *self, void *this_cache)
 
 static const struct frame_unwind spu2ppu_unwind = {
   ARCH_FRAME,
+  default_frame_unwind_stop_reason,
   spu2ppu_this_id,
   spu2ppu_prev_register,
   NULL,
index 620536f1f8284201dc65932fdb14f15353ba3060..96e8d22c6ed695fe015771d21ed0e5259632f81b 100644 (file)
@@ -935,6 +935,7 @@ v850_frame_this_id (struct frame_info *this_frame, void **this_cache,
 
 static const struct frame_unwind v850_frame_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   v850_frame_this_id,
   v850_frame_prev_register,
   NULL,
index b84977a5d1e3d5e4bf49c431722f39e048b8eef5..97d453452d6e828a4050d55ab11a5abf3e7f53f4 100644 (file)
@@ -402,6 +402,7 @@ vax_frame_prev_register (struct frame_info *this_frame,
 static const struct frame_unwind vax_frame_unwind =
 {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   vax_frame_this_id,
   vax_frame_prev_register,
   NULL,
index f87f2325542874362282dbbc4af2e03c189622ad..7089f1532cb79ad23f65c266046a4e9f6d42b26c 100644 (file)
@@ -135,6 +135,7 @@ vaxobsd_sigtramp_frame_prev_register (struct frame_info *this_frame,
 
 static const struct frame_unwind vaxobsd_sigtramp_frame_unwind = {
   SIGTRAMP_FRAME,
+  default_frame_unwind_stop_reason,
   vaxobsd_sigtramp_frame_this_id,
   vaxobsd_sigtramp_frame_prev_register,
   NULL,
index 1aef08a8eee880bc2427068ad577b3b7e3169559..53cbecdf9b69a90eaaffd55c172c4bd1019e5d31 100644 (file)
@@ -742,6 +742,7 @@ xstormy16_frame_base_address (struct frame_info *this_frame, void **this_cache)
 
 static const struct frame_unwind xstormy16_frame_unwind = {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   xstormy16_frame_this_id,
   xstormy16_frame_prev_register,
   NULL,
index 316a8cf5194a87b237de217d0eaa17492069c5e2..24cc79c42bdaf0a1d1cbc32eca4408fb1123c21e 100644 (file)
@@ -1549,6 +1549,7 @@ static const struct frame_unwind
 xtensa_unwind =
 {
   NORMAL_FRAME,
+  default_frame_unwind_stop_reason,
   xtensa_frame_this_id,
   xtensa_frame_prev_register,
   NULL,