GDB (xrefs)
/tmp/gdb-7.10/gdb/frame-unwind.c
Go to the documentation of this file.
1 /* Definitions for frame unwinder, for GDB, the GNU debugger.
2 
3  Copyright (C) 2003-2015 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 "gdb_obstack.h"
28 #include "target.h"
29 
31 
33 {
34  const struct frame_unwind *unwinder;
36 };
37 
39 {
41  /* The head of the OSABI part of the search list. */
43 };
44 
45 static void *
46 frame_unwind_init (struct obstack *obstack)
47 {
48  struct frame_unwind_table *table
49  = OBSTACK_ZALLOC (obstack, struct frame_unwind_table);
50 
51  /* Start the table out with a few default sniffers. OSABI code
52  can't override this. */
53  table->list = OBSTACK_ZALLOC (obstack, struct frame_unwind_table_entry);
54  table->list->unwinder = &dummy_frame_unwind;
55  table->list->next = OBSTACK_ZALLOC (obstack,
58  /* The insertion point for OSABI sniffers. */
59  table->osabi_head = &table->list->next->next;
60  return table;
61 }
62 
63 void
65  const struct frame_unwind *unwinder)
66 {
67  struct frame_unwind_table *table = gdbarch_data (gdbarch, frame_unwind_data);
68  struct frame_unwind_table_entry *entry;
69 
70  /* Insert the new entry at the start of the list. */
71  entry = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct frame_unwind_table_entry);
72  entry->unwinder = unwinder;
73  entry->next = (*table->osabi_head);
74  (*table->osabi_head) = entry;
75 }
76 
77 void
79  const struct frame_unwind *unwinder)
80 {
81  struct frame_unwind_table *table = gdbarch_data (gdbarch, frame_unwind_data);
82  struct frame_unwind_table_entry **ip;
83 
84  /* Find the end of the list and insert the new entry there. */
85  for (ip = table->osabi_head; (*ip) != NULL; ip = &(*ip)->next);
86  (*ip) = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct frame_unwind_table_entry);
87  (*ip)->unwinder = unwinder;
88 }
89 
90 /* Call SNIFFER from UNWINDER. If it succeeded set UNWINDER for
91  THIS_FRAME and return 1. Otherwise the function keeps THIS_FRAME
92  unchanged and returns 0. */
93 
94 static int
95 frame_unwind_try_unwinder (struct frame_info *this_frame, void **this_cache,
96  const struct frame_unwind *unwinder)
97 {
98  struct cleanup *old_cleanup;
99  int res = 0;
100 
101  old_cleanup = frame_prepare_for_sniffer (this_frame, unwinder);
102 
103  TRY
104  {
105  res = unwinder->sniffer (unwinder, this_frame, this_cache);
106  }
108  {
109  if (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  throw_exception (ex);
119  }
120  END_CATCH
121 
122  if (res)
123  {
124  discard_cleanups (old_cleanup);
125  return 1;
126  }
127  else
128  {
129  do_cleanups (old_cleanup);
130  return 0;
131  }
132  gdb_assert_not_reached ("frame_unwind_try_unwinder");
133 }
134 
135 /* Iterate through sniffers for THIS_FRAME frame until one returns with an
136  unwinder implementation. THIS_FRAME->UNWIND must be NULL, it will get set
137  by this function. Possibly initialize THIS_CACHE. */
138 
139 void
140 frame_unwind_find_by_frame (struct frame_info *this_frame, void **this_cache)
141 {
142  struct gdbarch *gdbarch = get_frame_arch (this_frame);
143  struct frame_unwind_table *table = gdbarch_data (gdbarch, frame_unwind_data);
144  struct frame_unwind_table_entry *entry;
145  const struct frame_unwind *unwinder_from_target;
146 
147  unwinder_from_target = target_get_unwinder ();
148  if (unwinder_from_target != NULL
149  && frame_unwind_try_unwinder (this_frame, this_cache,
150  unwinder_from_target))
151  return;
152 
153  unwinder_from_target = target_get_tailcall_unwinder ();
154  if (unwinder_from_target != NULL
155  && frame_unwind_try_unwinder (this_frame, this_cache,
156  unwinder_from_target))
157  return;
158 
159  for (entry = table->list; entry != NULL; entry = entry->next)
160  if (frame_unwind_try_unwinder (this_frame, this_cache, entry->unwinder))
161  return;
162 
163  internal_error (__FILE__, __LINE__, _("frame_unwind_find_by_frame failed"));
164 }
165 
166 /* A default frame sniffer which always accepts the frame. Used by
167  fallback prologue unwinders. */
168 
169 int
171  struct frame_info *this_frame,
172  void **this_prologue_cache)
173 {
174  return 1;
175 }
176 
177 /* The default frame unwinder stop_reason callback. */
178 
181  void **this_cache)
182 {
183  struct frame_id this_id = get_frame_id (this_frame);
184 
185  if (frame_id_eq (this_id, outer_frame_id))
186  return UNWIND_OUTERMOST;
187  else
188  return UNWIND_NO_REASON;
189 }
190 
191 /* Helper functions for value-based register unwinding. These return
192  a (possibly lazy) value of the appropriate type. */
193 
194 /* Return a value which indicates that FRAME did not save REGNUM. */
195 
196 struct value *
198 {
199  struct gdbarch *gdbarch = frame_unwind_arch (frame);
200  struct type *type = register_type (gdbarch, regnum);
201  struct value *val;
202 
203  /* Return an lval_register value, so that we print it as
204  "<not saved>". */
205  val = allocate_value_lazy (type);
206  set_value_lazy (val, 0);
208  VALUE_LVAL (val) = lval_register;
209  VALUE_REGNUM (val) = regnum;
210  VALUE_FRAME_ID (val) = get_frame_id (frame);
211  return val;
212 }
213 
214 /* Return a value which indicates that FRAME copied REGNUM into
215  register NEW_REGNUM. */
216 
217 struct value *
219  int regnum, int new_regnum)
220 {
221  return value_of_register_lazy (frame, new_regnum);
222 }
223 
224 /* Return a value which indicates that FRAME saved REGNUM in memory at
225  ADDR. */
226 
227 struct value *
229 {
230  struct gdbarch *gdbarch = frame_unwind_arch (frame);
231  struct value *v = value_at_lazy (register_type (gdbarch, regnum), addr);
232 
233  set_value_stack (v, 1);
234  return v;
235 }
236 
237 /* Return a value which indicates that FRAME's saved version of
238  REGNUM has a known constant (computed) value of VAL. */
239 
240 struct value *
242  ULONGEST val)
243 {
244  struct gdbarch *gdbarch = frame_unwind_arch (frame);
245  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
246  struct value *reg_val;
247 
248  reg_val = value_zero (register_type (gdbarch, regnum), not_lval);
250  register_size (gdbarch, regnum), byte_order, val);
251  return reg_val;
252 }
253 
254 struct value *
256 {
257  struct gdbarch *gdbarch = frame_unwind_arch (frame);
258  struct value *reg_val;
259 
260  reg_val = value_zero (register_type (gdbarch, regnum), not_lval);
261  memcpy (value_contents_raw (reg_val), buf, register_size (gdbarch, regnum));
262  return reg_val;
263 }
264 
265 /* Return a value which indicates that FRAME's saved version of REGNUM
266  has a known constant (computed) value of ADDR. Convert the
267  CORE_ADDR to a target address if necessary. */
268 
269 struct value *
271  CORE_ADDR addr)
272 {
273  struct gdbarch *gdbarch = frame_unwind_arch (frame);
274  struct value *reg_val;
275 
276  reg_val = value_zero (register_type (gdbarch, regnum), not_lval);
278  register_type (gdbarch, regnum), addr);
279  return reg_val;
280 }
281 
282 /* -Wmissing-prototypes */
284 
285 void
287 {
289 }
struct value * value_zero(struct type *type, enum lval_type lv)
Definition: valops.c:842
struct value * frame_unwind_got_bytes(struct frame_info *frame, int regnum, gdb_byte *buf)
Definition: frame-unwind.c:255
#define VALUE_FRAME_ID(val)
Definition: value.h:436
bfd_vma CORE_ADDR
Definition: common-types.h:41
const struct frame_unwind * target_get_tailcall_unwinder(void)
Definition: target.c:3712
const struct frame_unwind * target_get_unwinder(void)
Definition: target.c:3704
struct value * frame_unwind_got_memory(struct frame_info *frame, int regnum, CORE_ADDR addr)
Definition: frame-unwind.c:228
const struct frame_unwind dummy_frame_unwind
Definition: dummy-frame.c:376
struct cleanup * frame_prepare_for_sniffer(struct frame_info *frame, const struct frame_unwind *unwind)
Definition: frame.c:2694
struct frame_unwind_table_entry * next
Definition: frame-unwind.c:35
void * gdbarch_data(struct gdbarch *gdbarch, struct gdbarch_data *data)
Definition: gdbarch.c:4845
struct value * allocate_value_lazy(struct type *type)
Definition: value.c:913
void internal_error(const char *file, int line, const char *fmt,...)
Definition: errors.c:50
frame_sniffer_ftype * sniffer
Definition: frame-unwind.h:154
void set_value_lazy(struct value *value, int val)
Definition: value.c:1311
unwind_stop_reason
Definition: frame.h:486
struct gdbarch_data * gdbarch_data_register_pre_init(gdbarch_data_pre_init_ftype *pre_init)
Definition: gdbarch.c:4806
#define _(String)
Definition: gdb_locale.h:40
#define END_CATCH
void frame_unwind_prepend_unwinder(struct gdbarch *gdbarch, const struct frame_unwind *unwinder)
Definition: frame-unwind.c:64
#define VALUE_LVAL(val)
Definition: value.h:411
void frame_unwind_append_unwinder(struct gdbarch *gdbarch, const struct frame_unwind *unwinder)
Definition: frame-unwind.c:78
void store_unsigned_integer(gdb_byte *, int, enum bfd_endian, ULONGEST)
Definition: findvar.c:212
#define GDBARCH_OBSTACK_ZALLOC(GDBARCH, TYPE)
Definition: gdbarch.h:1615
struct gdbarch * frame_unwind_arch(struct frame_info *next_frame)
Definition: frame.c:2541
struct value * frame_unwind_got_constant(struct frame_info *frame, int regnum, ULONGEST val)
Definition: frame-unwind.c:241
void frame_unwind_find_by_frame(struct frame_info *this_frame, void **this_cache)
Definition: frame-unwind.c:140
#define TRY
int frame_id_eq(struct frame_id l, struct frame_id r)
Definition: frame.c:604
struct frame_id get_frame_id(struct frame_info *fi)
Definition: frame.c:473
#define CATCH(EXCEPTION, MASK)
void initialize_file_ftype(void)
Definition: defs.h:281
struct frame_unwind_table_entry ** osabi_head
Definition: frame-unwind.c:42
struct value * value_of_register_lazy(struct frame_info *frame, int regnum)
Definition: findvar.c:281
const struct frame_unwind * unwinder
Definition: frame-unwind.c:34
initialize_file_ftype _initialize_frame_unwind
struct type * register_type(struct gdbarch *gdbarch, int regnum)
Definition: regcache.c:157
#define gdb_assert_not_reached(message)
Definition: gdb_assert.h:56
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
Definition: gdbarch.c:1420
Definition: gdbtypes.h:749
#define VALUE_REGNUM(val)
Definition: value.h:440
const struct frame_unwind inline_frame_unwind
Definition: inline-frame.c:263
int default_frame_sniffer(const struct frame_unwind *self, struct frame_info *this_frame, void **this_prologue_cache)
Definition: frame-unwind.c:170
gdb_byte * value_contents_writeable(struct value *value)
Definition: value.c:1338
static int frame_unwind_try_unwinder(struct frame_info *this_frame, void **this_cache, const struct frame_unwind *unwinder)
Definition: frame-unwind.c:95
struct value * value_at_lazy(struct type *type, CORE_ADDR addr)
Definition: valops.c:951
int regnum
Definition: aarch64-tdep.c:69
Definition: value.c:172
struct value * frame_unwind_got_optimized(struct frame_info *frame, int regnum)
Definition: frame-unwind.c:197
void throw_exception(struct gdb_exception exception)
bfd_byte gdb_byte
Definition: common-types.h:38
void discard_cleanups(struct cleanup *old_chain)
Definition: cleanups.c:213
void mark_value_bytes_optimized_out(struct value *value, int offset, int length)
Definition: value.c:1360
struct value * frame_unwind_got_register(struct frame_info *frame, int regnum, int new_regnum)
Definition: frame-unwind.c:218
static struct gdbarch_data * frame_unwind_data
Definition: frame-unwind.c:30
void set_value_stack(struct value *value, int val)
Definition: value.c:1323
static void * frame_unwind_init(struct obstack *obstack)
Definition: frame-unwind.c:46
Definition: frame-unwind.c:32
unsigned long long ULONGEST
Definition: common-types.h:53
enum unwind_stop_reason default_frame_unwind_stop_reason(struct frame_info *this_frame, void **this_cache)
Definition: frame-unwind.c:180
const struct frame_id outer_frame_id
Definition: frame.c:507
struct value * frame_unwind_got_address(struct frame_info *frame, int regnum, CORE_ADDR addr)
Definition: frame-unwind.c:270
int register_size(struct gdbarch *gdbarch, int regnum)
Definition: regcache.c:169
gdb_byte * value_contents_raw(struct value *value)
Definition: value.c:1084
struct frame_unwind_table_entry * list
Definition: frame-unwind.c:40
#define OBSTACK_ZALLOC(OBSTACK, TYPE)
Definition: gdb_obstack.h:27
#define TYPE_LENGTH(thistype)
Definition: gdbtypes.h:1237
Definition: defs.h:353
void pack_long(gdb_byte *buf, struct type *type, LONGEST num)
Definition: value.c:3392
enum bfd_endian byte_order
Definition: gdbarch.c:128
struct gdbarch * get_frame_arch(struct frame_info *this_frame)
Definition: frame.c:2535
void do_cleanups(struct cleanup *old_chain)
Definition: cleanups.c:175