yann@96
|
1 |
Status: Checked in to HEAD after 6.3.
|
yann@96
|
2 |
|
yann@96
|
3 |
2004-11-07 Daniel Jacobowitz <dan@debian.org>
|
yann@96
|
4 |
|
yann@96
|
5 |
* dwarf2-frame.c (struct dwarf2_frame_ops): Add signal_frame_p.
|
yann@96
|
6 |
(dwarf2_frame_set_signal_frame_p, dwarf2_frame_signal_frame_p)
|
yann@96
|
7 |
(dwarf2_signal_frame_unwind): New.
|
yann@96
|
8 |
(dwarf2_frame_sniffer): Use dwarf2_frame_signal_frame_p.
|
yann@96
|
9 |
* dwarf2-frame.h (dwarf2_frame_set_signal_frame_p): New prototype.
|
yann@96
|
10 |
|
yann@96
|
11 |
Index: src/gdb/dwarf2-frame.c
|
yann@96
|
12 |
===================================================================
|
yann@96
|
13 |
RCS file: /big/fsf/rsync/src-cvs/src/gdb/dwarf2-frame.c,v
|
yann@96
|
14 |
retrieving revision 1.41
|
yann@96
|
15 |
diff -u -p -r1.41 dwarf2-frame.c
|
yann@96
|
16 |
--- src/gdb/dwarf2-frame.c 4 Nov 2004 21:15:15 -0000 1.41
|
yann@96
|
17 |
+++ src/gdb/dwarf2-frame.c 7 Nov 2004 17:41:58 -0000
|
yann@96
|
18 |
@@ -471,6 +471,10 @@ struct dwarf2_frame_ops
|
yann@96
|
19 |
{
|
yann@96
|
20 |
/* Pre-initialize the register state REG for register REGNUM. */
|
yann@96
|
21 |
void (*init_reg) (struct gdbarch *, int, struct dwarf2_frame_state_reg *);
|
yann@96
|
22 |
+
|
yann@96
|
23 |
+ /* Check whether the frame preceding NEXT_FRAME will be a signal
|
yann@96
|
24 |
+ trampoline. */
|
yann@96
|
25 |
+ int (*signal_frame_p) (struct gdbarch *, struct frame_info *);
|
yann@96
|
26 |
};
|
yann@96
|
27 |
|
yann@96
|
28 |
/* Default architecture-specific register state initialization
|
yann@96
|
29 |
@@ -547,6 +551,33 @@ dwarf2_frame_init_reg (struct gdbarch *g
|
yann@96
|
30 |
|
yann@96
|
31 |
ops->init_reg (gdbarch, regnum, reg);
|
yann@96
|
32 |
}
|
yann@96
|
33 |
+
|
yann@96
|
34 |
+/* Set the architecture-specific signal trampoline recognition
|
yann@96
|
35 |
+ function for GDBARCH to SIGNAL_FRAME_P. */
|
yann@96
|
36 |
+
|
yann@96
|
37 |
+void
|
yann@96
|
38 |
+dwarf2_frame_set_signal_frame_p (struct gdbarch *gdbarch,
|
yann@96
|
39 |
+ int (*signal_frame_p) (struct gdbarch *,
|
yann@96
|
40 |
+ struct frame_info *))
|
yann@96
|
41 |
+{
|
yann@96
|
42 |
+ struct dwarf2_frame_ops *ops = gdbarch_data (gdbarch, dwarf2_frame_data);
|
yann@96
|
43 |
+
|
yann@96
|
44 |
+ ops->signal_frame_p = signal_frame_p;
|
yann@96
|
45 |
+}
|
yann@96
|
46 |
+
|
yann@96
|
47 |
+/* Query the architecture-specific signal frame recognizer for
|
yann@96
|
48 |
+ NEXT_FRAME. */
|
yann@96
|
49 |
+
|
yann@96
|
50 |
+static int
|
yann@96
|
51 |
+dwarf2_frame_signal_frame_p (struct gdbarch *gdbarch,
|
yann@96
|
52 |
+ struct frame_info *next_frame)
|
yann@96
|
53 |
+{
|
yann@96
|
54 |
+ struct dwarf2_frame_ops *ops = gdbarch_data (gdbarch, dwarf2_frame_data);
|
yann@96
|
55 |
+
|
yann@96
|
56 |
+ if (ops->signal_frame_p == NULL)
|
yann@96
|
57 |
+ return 0;
|
yann@96
|
58 |
+ return ops->signal_frame_p (gdbarch, next_frame);
|
yann@96
|
59 |
+}
|
yann@96
|
60 |
|
yann@96
|
61 |
|
yann@96
|
62 |
struct dwarf2_frame_cache
|
yann@96
|
63 |
@@ -841,6 +872,13 @@ static const struct frame_unwind dwarf2_
|
yann@96
|
64 |
dwarf2_frame_prev_register
|
yann@96
|
65 |
};
|
yann@96
|
66 |
|
yann@96
|
67 |
+static const struct frame_unwind dwarf2_signal_frame_unwind =
|
yann@96
|
68 |
+{
|
yann@96
|
69 |
+ SIGTRAMP_FRAME,
|
yann@96
|
70 |
+ dwarf2_frame_this_id,
|
yann@96
|
71 |
+ dwarf2_frame_prev_register
|
yann@96
|
72 |
+};
|
yann@96
|
73 |
+
|
yann@96
|
74 |
const struct frame_unwind *
|
yann@96
|
75 |
dwarf2_frame_sniffer (struct frame_info *next_frame)
|
yann@96
|
76 |
{
|
yann@96
|
77 |
@@ -848,10 +886,18 @@ dwarf2_frame_sniffer (struct frame_info
|
yann@96
|
78 |
function. frame_pc_unwind(), for a no-return next function, can
|
yann@96
|
79 |
end up returning something past the end of this function's body. */
|
yann@96
|
80 |
CORE_ADDR block_addr = frame_unwind_address_in_block (next_frame);
|
yann@96
|
81 |
- if (dwarf2_frame_find_fde (&block_addr))
|
yann@96
|
82 |
- return &dwarf2_frame_unwind;
|
yann@96
|
83 |
+ if (!dwarf2_frame_find_fde (&block_addr))
|
yann@96
|
84 |
+ return NULL;
|
yann@96
|
85 |
|
yann@96
|
86 |
- return NULL;
|
yann@96
|
87 |
+ /* On some targets, signal trampolines may have unwind information.
|
yann@96
|
88 |
+ We need to recognize them so that we set the frame type
|
yann@96
|
89 |
+ correctly. */
|
yann@96
|
90 |
+
|
yann@96
|
91 |
+ if (dwarf2_frame_signal_frame_p (get_frame_arch (next_frame),
|
yann@96
|
92 |
+ next_frame))
|
yann@96
|
93 |
+ return &dwarf2_signal_frame_unwind;
|
yann@96
|
94 |
+
|
yann@96
|
95 |
+ return &dwarf2_frame_unwind;
|
yann@96
|
96 |
}
|
yann@96
|
97 |
|
yann@96
|
98 |
|
yann@96
|
99 |
Index: src/gdb/dwarf2-frame.h
|
yann@96
|
100 |
===================================================================
|
yann@96
|
101 |
RCS file: /big/fsf/rsync/src-cvs/src/gdb/dwarf2-frame.h,v
|
yann@96
|
102 |
retrieving revision 1.6
|
yann@96
|
103 |
diff -u -p -r1.6 dwarf2-frame.h
|
yann@96
|
104 |
--- src/gdb/dwarf2-frame.h 28 Feb 2004 16:59:32 -0000 1.6
|
yann@96
|
105 |
+++ src/gdb/dwarf2-frame.h 7 Nov 2004 17:40:41 -0000
|
yann@96
|
106 |
@@ -79,6 +79,14 @@ extern void dwarf2_frame_set_init_reg (s
|
yann@96
|
107 |
void (*init_reg) (struct gdbarch *, int,
|
yann@96
|
108 |
struct dwarf2_frame_state_reg *));
|
yann@96
|
109 |
|
yann@96
|
110 |
+/* Set the architecture-specific signal trampoline recognition
|
yann@96
|
111 |
+ function for GDBARCH to SIGNAL_FRAME_P. */
|
yann@96
|
112 |
+
|
yann@96
|
113 |
+extern void
|
yann@96
|
114 |
+ dwarf2_frame_set_signal_frame_p (struct gdbarch *gdbarch,
|
yann@96
|
115 |
+ int (*signal_frame_p) (struct gdbarch *,
|
yann@96
|
116 |
+ struct frame_info *));
|
yann@96
|
117 |
+
|
yann@96
|
118 |
/* Return the frame unwind methods for the function that contains PC,
|
yann@96
|
119 |
or NULL if it can't be handled by DWARF CFI frame unwinder. */
|
yann@96
|
120 |
|