diff options
author | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2006-10-13 20:51:49 +0000 |
---|---|---|
committer | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2006-10-13 20:51:49 +0000 |
commit | f52d66ff00b24111f87c274d3d7085ef2e1d27b1 (patch) | |
tree | d993cf48b4d89166701fe2f33976389d7634235d /toolchain/gdb/patches/640-debian_dwarf2-frame-signal-unwinder.patch | |
parent | 725611a466f2edf12f809d22339b22223af4afe7 (diff) | |
parent | 0c0df9eb082d5ff83d0f22f6e00bf580729fb49d (diff) |
finally move buildroot-ng to trunk
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@5059 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'toolchain/gdb/patches/640-debian_dwarf2-frame-signal-unwinder.patch')
-rw-r--r-- | toolchain/gdb/patches/640-debian_dwarf2-frame-signal-unwinder.patch | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/toolchain/gdb/patches/640-debian_dwarf2-frame-signal-unwinder.patch b/toolchain/gdb/patches/640-debian_dwarf2-frame-signal-unwinder.patch new file mode 100644 index 0000000000..246427ee6f --- /dev/null +++ b/toolchain/gdb/patches/640-debian_dwarf2-frame-signal-unwinder.patch @@ -0,0 +1,120 @@ +Status: Checked in to HEAD after 6.3. + +2004-11-07 Daniel Jacobowitz <dan@debian.org> + + * dwarf2-frame.c (struct dwarf2_frame_ops): Add signal_frame_p. + (dwarf2_frame_set_signal_frame_p, dwarf2_frame_signal_frame_p) + (dwarf2_signal_frame_unwind): New. + (dwarf2_frame_sniffer): Use dwarf2_frame_signal_frame_p. + * dwarf2-frame.h (dwarf2_frame_set_signal_frame_p): New prototype. + +Index: src/gdb/dwarf2-frame.c +=================================================================== +RCS file: /big/fsf/rsync/src-cvs/src/gdb/dwarf2-frame.c,v +retrieving revision 1.41 +diff -u -p -r1.41 dwarf2-frame.c +--- src/gdb/dwarf2-frame.c 4 Nov 2004 21:15:15 -0000 1.41 ++++ src/gdb/dwarf2-frame.c 7 Nov 2004 17:41:58 -0000 +@@ -471,6 +471,10 @@ struct dwarf2_frame_ops + { + /* Pre-initialize the register state REG for register REGNUM. */ + void (*init_reg) (struct gdbarch *, int, struct dwarf2_frame_state_reg *); ++ ++ /* Check whether the frame preceding NEXT_FRAME will be a signal ++ trampoline. */ ++ int (*signal_frame_p) (struct gdbarch *, struct frame_info *); + }; + + /* Default architecture-specific register state initialization +@@ -547,6 +551,33 @@ dwarf2_frame_init_reg (struct gdbarch *g + + ops->init_reg (gdbarch, regnum, reg); + } ++ ++/* Set the architecture-specific signal trampoline recognition ++ function for GDBARCH to SIGNAL_FRAME_P. */ ++ ++void ++dwarf2_frame_set_signal_frame_p (struct gdbarch *gdbarch, ++ int (*signal_frame_p) (struct gdbarch *, ++ struct frame_info *)) ++{ ++ struct dwarf2_frame_ops *ops = gdbarch_data (gdbarch, dwarf2_frame_data); ++ ++ ops->signal_frame_p = signal_frame_p; ++} ++ ++/* Query the architecture-specific signal frame recognizer for ++ NEXT_FRAME. */ ++ ++static int ++dwarf2_frame_signal_frame_p (struct gdbarch *gdbarch, ++ struct frame_info *next_frame) ++{ ++ struct dwarf2_frame_ops *ops = gdbarch_data (gdbarch, dwarf2_frame_data); ++ ++ if (ops->signal_frame_p == NULL) ++ return 0; ++ return ops->signal_frame_p (gdbarch, next_frame); ++} + + + struct dwarf2_frame_cache +@@ -841,6 +872,13 @@ static const struct frame_unwind dwarf2_ + dwarf2_frame_prev_register + }; + ++static const struct frame_unwind dwarf2_signal_frame_unwind = ++{ ++ SIGTRAMP_FRAME, ++ dwarf2_frame_this_id, ++ dwarf2_frame_prev_register ++}; ++ + const struct frame_unwind * + dwarf2_frame_sniffer (struct frame_info *next_frame) + { +@@ -848,10 +886,18 @@ dwarf2_frame_sniffer (struct frame_info + function. frame_pc_unwind(), for a no-return next function, can + end up returning something past the end of this function's body. */ + CORE_ADDR block_addr = frame_unwind_address_in_block (next_frame); +- if (dwarf2_frame_find_fde (&block_addr)) +- return &dwarf2_frame_unwind; ++ if (!dwarf2_frame_find_fde (&block_addr)) ++ return NULL; + +- return NULL; ++ /* On some targets, signal trampolines may have unwind information. ++ We need to recognize them so that we set the frame type ++ correctly. */ ++ ++ if (dwarf2_frame_signal_frame_p (get_frame_arch (next_frame), ++ next_frame)) ++ return &dwarf2_signal_frame_unwind; ++ ++ return &dwarf2_frame_unwind; + } + + +Index: src/gdb/dwarf2-frame.h +=================================================================== +RCS file: /big/fsf/rsync/src-cvs/src/gdb/dwarf2-frame.h,v +retrieving revision 1.6 +diff -u -p -r1.6 dwarf2-frame.h +--- src/gdb/dwarf2-frame.h 28 Feb 2004 16:59:32 -0000 1.6 ++++ src/gdb/dwarf2-frame.h 7 Nov 2004 17:40:41 -0000 +@@ -79,6 +79,14 @@ extern void dwarf2_frame_set_init_reg (s + void (*init_reg) (struct gdbarch *, int, + struct dwarf2_frame_state_reg *)); + ++/* Set the architecture-specific signal trampoline recognition ++ function for GDBARCH to SIGNAL_FRAME_P. */ ++ ++extern void ++ dwarf2_frame_set_signal_frame_p (struct gdbarch *gdbarch, ++ int (*signal_frame_p) (struct gdbarch *, ++ struct frame_info *)); ++ + /* Return the frame unwind methods for the function that contains PC, + or NULL if it can't be handled by DWARF CFI frame unwinder. */ + |