Replace hardwired error handlers in tui_initialize_io
[platform/upstream/binutils.git] / gdb / frame-unwind.c
1 /* Definitions for frame unwinder, for GDB, the GNU debugger.
2
3    Copyright (C) 2003-2014 Free Software Foundation, Inc.
4
5    This file is part of GDB.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
20 #include "defs.h"
21 #include "frame.h"
22 #include "frame-unwind.h"
23 #include "dummy-frame.h"
24 #include "inline-frame.h"
25 #include "value.h"
26 #include "regcache.h"
27 #include "exceptions.h"
28 #include "gdb_obstack.h"
29 #include "target.h"
30
31 static struct gdbarch_data *frame_unwind_data;
32
33 struct frame_unwind_table_entry
34 {
35   const struct frame_unwind *unwinder;
36   struct frame_unwind_table_entry *next;
37 };
38
39 struct frame_unwind_table
40 {
41   struct frame_unwind_table_entry *list;
42   /* The head of the OSABI part of the search list.  */
43   struct frame_unwind_table_entry **osabi_head;
44 };
45
46 static void *
47 frame_unwind_init (struct obstack *obstack)
48 {
49   struct frame_unwind_table *table
50     = OBSTACK_ZALLOC (obstack, struct frame_unwind_table);
51
52   /* Start the table out with a few default sniffers.  OSABI code
53      can't override this.  */
54   table->list = OBSTACK_ZALLOC (obstack, struct frame_unwind_table_entry);
55   table->list->unwinder = &dummy_frame_unwind;
56   table->list->next = OBSTACK_ZALLOC (obstack,
57                                       struct frame_unwind_table_entry);
58   table->list->next->unwinder = &inline_frame_unwind;
59   /* The insertion point for OSABI sniffers.  */
60   table->osabi_head = &table->list->next->next;
61   return table;
62 }
63
64 void
65 frame_unwind_prepend_unwinder (struct gdbarch *gdbarch,
66                                 const struct frame_unwind *unwinder)
67 {
68   struct frame_unwind_table *table = gdbarch_data (gdbarch, frame_unwind_data);
69   struct frame_unwind_table_entry *entry;
70
71   /* Insert the new entry at the start of the list.  */
72   entry = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct frame_unwind_table_entry);
73   entry->unwinder = unwinder;
74   entry->next = (*table->osabi_head);
75   (*table->osabi_head) = entry;
76 }
77
78 void
79 frame_unwind_append_unwinder (struct gdbarch *gdbarch,
80                               const struct frame_unwind *unwinder)
81 {
82   struct frame_unwind_table *table = gdbarch_data (gdbarch, frame_unwind_data);
83   struct frame_unwind_table_entry **ip;
84
85   /* Find the end of the list and insert the new entry there.  */
86   for (ip = table->osabi_head; (*ip) != NULL; ip = &(*ip)->next);
87   (*ip) = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct frame_unwind_table_entry);
88   (*ip)->unwinder = unwinder;
89 }
90
91 /* Call SNIFFER from UNWINDER.  If it succeeded set UNWINDER for
92    THIS_FRAME and return 1.  Otherwise the function keeps THIS_FRAME
93    unchanged and returns 0.  */
94
95 static int
96 frame_unwind_try_unwinder (struct frame_info *this_frame, void **this_cache,
97                           const struct frame_unwind *unwinder)
98 {
99   struct cleanup *old_cleanup;
100   volatile struct gdb_exception ex;
101   int res = 0;
102
103   old_cleanup = frame_prepare_for_sniffer (this_frame, unwinder);
104
105   TRY_CATCH (ex, RETURN_MASK_ERROR)
106     {
107       res = unwinder->sniffer (unwinder, this_frame, this_cache);
108     }
109   if (ex.reason < 0 && ex.error == NOT_AVAILABLE_ERROR)
110     {
111       /* This usually means that not even the PC is available,
112         thus most unwinders aren't able to determine if they're
113         the best fit.  Keep trying.  Fallback prologue unwinders
114         should always accept the frame.  */
115       do_cleanups (old_cleanup);
116       return 0;
117     }
118   else if (ex.reason < 0)
119     throw_exception (ex);
120   else if (res)
121     {
122       discard_cleanups (old_cleanup);
123       return 1;
124     }
125   else
126     {
127       do_cleanups (old_cleanup);
128       return 0;
129     }
130   gdb_assert_not_reached ("frame_unwind_try_unwinder");
131 }
132
133 /* Iterate through sniffers for THIS_FRAME frame until one returns with an
134    unwinder implementation.  THIS_FRAME->UNWIND must be NULL, it will get set
135    by this function.  Possibly initialize THIS_CACHE.  */
136
137 void
138 frame_unwind_find_by_frame (struct frame_info *this_frame, void **this_cache)
139 {
140   struct gdbarch *gdbarch = get_frame_arch (this_frame);
141   struct frame_unwind_table *table = gdbarch_data (gdbarch, frame_unwind_data);
142   struct frame_unwind_table_entry *entry;
143   const struct frame_unwind *unwinder_from_target;
144
145   unwinder_from_target = target_get_unwinder ();
146   if (unwinder_from_target != NULL
147       && frame_unwind_try_unwinder (this_frame, this_cache,
148                                    unwinder_from_target))
149     return;
150
151   unwinder_from_target = target_get_tailcall_unwinder ();
152   if (unwinder_from_target != NULL
153       && frame_unwind_try_unwinder (this_frame, this_cache,
154                                    unwinder_from_target))
155     return;
156
157   for (entry = table->list; entry != NULL; entry = entry->next)
158     if (frame_unwind_try_unwinder (this_frame, this_cache, entry->unwinder))
159       return;
160
161   internal_error (__FILE__, __LINE__, _("frame_unwind_find_by_frame failed"));
162 }
163
164 /* A default frame sniffer which always accepts the frame.  Used by
165    fallback prologue unwinders.  */
166
167 int
168 default_frame_sniffer (const struct frame_unwind *self,
169                        struct frame_info *this_frame,
170                        void **this_prologue_cache)
171 {
172   return 1;
173 }
174
175 /* The default frame unwinder stop_reason callback.  */
176
177 enum unwind_stop_reason
178 default_frame_unwind_stop_reason (struct frame_info *this_frame,
179                                   void **this_cache)
180 {
181   struct frame_id this_id = get_frame_id (this_frame);
182
183   if (frame_id_eq (this_id, outer_frame_id))
184     return UNWIND_OUTERMOST;
185   else
186     return UNWIND_NO_REASON;
187 }
188
189 /* Helper functions for value-based register unwinding.  These return
190    a (possibly lazy) value of the appropriate type.  */
191
192 /* Return a value which indicates that FRAME did not save REGNUM.  */
193
194 struct value *
195 frame_unwind_got_optimized (struct frame_info *frame, int regnum)
196 {
197   struct gdbarch *gdbarch = frame_unwind_arch (frame);
198   struct type *type = register_type (gdbarch, regnum);
199   struct value *val;
200
201   /* Return an lval_register value, so that we print it as
202      "<not saved>".  */
203   val = allocate_value_lazy (type);
204   set_value_lazy (val, 0);
205   mark_value_bytes_optimized_out (val, 0, TYPE_LENGTH (type));
206   VALUE_LVAL (val) = lval_register;
207   VALUE_REGNUM (val) = regnum;
208   VALUE_FRAME_ID (val) = get_frame_id (frame);
209   return val;
210 }
211
212 /* Return a value which indicates that FRAME copied REGNUM into
213    register NEW_REGNUM.  */
214
215 struct value *
216 frame_unwind_got_register (struct frame_info *frame,
217                            int regnum, int new_regnum)
218 {
219   return value_of_register_lazy (frame, new_regnum);
220 }
221
222 /* Return a value which indicates that FRAME saved REGNUM in memory at
223    ADDR.  */
224
225 struct value *
226 frame_unwind_got_memory (struct frame_info *frame, int regnum, CORE_ADDR addr)
227 {
228   struct gdbarch *gdbarch = frame_unwind_arch (frame);
229   struct value *v = value_at_lazy (register_type (gdbarch, regnum), addr);
230
231   set_value_stack (v, 1);
232   return v;
233 }
234
235 /* Return a value which indicates that FRAME's saved version of
236    REGNUM has a known constant (computed) value of VAL.  */
237
238 struct value *
239 frame_unwind_got_constant (struct frame_info *frame, int regnum,
240                            ULONGEST val)
241 {
242   struct gdbarch *gdbarch = frame_unwind_arch (frame);
243   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
244   struct value *reg_val;
245
246   reg_val = value_zero (register_type (gdbarch, regnum), not_lval);
247   store_unsigned_integer (value_contents_writeable (reg_val),
248                           register_size (gdbarch, regnum), byte_order, val);
249   return reg_val;
250 }
251
252 struct value *
253 frame_unwind_got_bytes (struct frame_info *frame, int regnum, gdb_byte *buf)
254 {
255   struct gdbarch *gdbarch = frame_unwind_arch (frame);
256   struct value *reg_val;
257
258   reg_val = value_zero (register_type (gdbarch, regnum), not_lval);
259   memcpy (value_contents_raw (reg_val), buf, register_size (gdbarch, regnum));
260   return reg_val;
261 }
262
263 /* Return a value which indicates that FRAME's saved version of REGNUM
264    has a known constant (computed) value of ADDR.  Convert the
265    CORE_ADDR to a target address if necessary.  */
266
267 struct value *
268 frame_unwind_got_address (struct frame_info *frame, int regnum,
269                           CORE_ADDR addr)
270 {
271   struct gdbarch *gdbarch = frame_unwind_arch (frame);
272   struct value *reg_val;
273
274   reg_val = value_zero (register_type (gdbarch, regnum), not_lval);
275   pack_long (value_contents_writeable (reg_val),
276              register_type (gdbarch, regnum), addr);
277   return reg_val;
278 }
279
280 /* -Wmissing-prototypes */
281 extern initialize_file_ftype _initialize_frame_unwind;
282
283 void
284 _initialize_frame_unwind (void)
285 {
286   frame_unwind_data = gdbarch_data_register_pre_init (frame_unwind_init);
287 }