2011-01-05 Michael Snyder <msnyder@vmware.com>
[deliverable/binutils-gdb.git] / gdb / libunwind-frame.c
CommitLineData
0e5d83e3
JJ
1/* Frame unwinder for frames using the libunwind library.
2
7b6bb8da 3 Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011
0fb0cc75 4 Free Software Foundation, Inc.
0e5d83e3
JJ
5
6 Written by Jeff Johnston, contributed by Red Hat Inc.
7
8 This file is part of GDB.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
a9762ec7 12 the Free Software Foundation; either version 3 of the License, or
0e5d83e3
JJ
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
a9762ec7 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
0e5d83e3
JJ
22
23#include "defs.h"
24
25#include "inferior.h"
26#include "frame.h"
27#include "frame-base.h"
28#include "frame-unwind.h"
29#include "gdbcore.h"
30#include "gdbtypes.h"
31#include "symtab.h"
32#include "objfiles.h"
33#include "regcache.h"
34
35#include <dlfcn.h>
36
37#include "gdb_assert.h"
38#include "gdb_string.h"
39
40#include "libunwind-frame.h"
41
42#include "complaints.h"
43
44static int libunwind_initialized;
45static struct gdbarch_data *libunwind_descr_handle;
46
0e5d83e3
JJ
47/* Required function pointers from libunwind. */
48static int (*unw_get_reg_p) (unw_cursor_t *, unw_regnum_t, unw_word_t *);
49static int (*unw_get_fpreg_p) (unw_cursor_t *, unw_regnum_t, unw_fpreg_t *);
3e43a32a
MS
50static int (*unw_get_saveloc_p) (unw_cursor_t *, unw_regnum_t,
51 unw_save_loc_t *);
c5a27d9c 52static int (*unw_is_signal_frame_p) (unw_cursor_t *);
0e5d83e3
JJ
53static int (*unw_step_p) (unw_cursor_t *);
54static int (*unw_init_remote_p) (unw_cursor_t *, unw_addr_space_t, void *);
55static unw_addr_space_t (*unw_create_addr_space_p) (unw_accessors_t *, int);
f43ae3f1 56static void (*unw_destroy_addr_space_p) (unw_addr_space_t);
3e43a32a
MS
57static int (*unw_search_unwind_table_p) (unw_addr_space_t, unw_word_t,
58 unw_dyn_info_t *,
0e5d83e3 59 unw_proc_info_t *, int, void *);
503ff15d
KB
60static unw_word_t (*unw_find_dyn_list_p) (unw_addr_space_t, unw_dyn_info_t *,
61 void *);
0e5d83e3
JJ
62
63
64struct libunwind_frame_cache
65{
66 CORE_ADDR base;
67 CORE_ADDR func_addr;
68 unw_cursor_t cursor;
272dfcfd 69 unw_addr_space_t as;
0e5d83e3
JJ
70};
71
15c1e57f
JB
72/* We need to qualify the function names with a platform-specific prefix
73 to match the names used by the libunwind library. The UNW_OBJ macro is
74 provided by the libunwind.h header file. */
0e5d83e3
JJ
75#define STRINGIFY2(name) #name
76#define STRINGIFY(name) STRINGIFY2(name)
77
38e400fa 78#ifndef LIBUNWIND_SO
70f575cc
JK
79/* Use the stable ABI major version number. `libunwind-ia64.so' is a link time
80 only library, not a runtime one. */
81#define LIBUNWIND_SO "libunwind-" STRINGIFY(UNW_TARGET) ".so.7"
38e400fa
JJ
82#endif
83
0e5d83e3
JJ
84static char *get_reg_name = STRINGIFY(UNW_OBJ(get_reg));
85static char *get_fpreg_name = STRINGIFY(UNW_OBJ(get_fpreg));
86static char *get_saveloc_name = STRINGIFY(UNW_OBJ(get_save_loc));
c5a27d9c 87static char *is_signal_frame_name = STRINGIFY(UNW_OBJ(is_signal_frame));
0e5d83e3
JJ
88static char *step_name = STRINGIFY(UNW_OBJ(step));
89static char *init_remote_name = STRINGIFY(UNW_OBJ(init_remote));
90static char *create_addr_space_name = STRINGIFY(UNW_OBJ(create_addr_space));
f43ae3f1 91static char *destroy_addr_space_name = STRINGIFY(UNW_OBJ(destroy_addr_space));
3e43a32a
MS
92static char *search_unwind_table_name
93 = STRINGIFY(UNW_OBJ(search_unwind_table));
0e5d83e3
JJ
94static char *find_dyn_list_name = STRINGIFY(UNW_OBJ(find_dyn_list));
95
96static struct libunwind_descr *
97libunwind_descr (struct gdbarch *gdbarch)
98{
99 return gdbarch_data (gdbarch, libunwind_descr_handle);
100}
101
102static void *
103libunwind_descr_init (struct gdbarch *gdbarch)
104{
3e43a32a
MS
105 struct libunwind_descr *descr
106 = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct libunwind_descr);
e0881a8e 107
0e5d83e3
JJ
108 return descr;
109}
110
111void
3e43a32a
MS
112libunwind_frame_set_descr (struct gdbarch *gdbarch,
113 struct libunwind_descr *descr)
0e5d83e3
JJ
114{
115 struct libunwind_descr *arch_descr;
116
117 gdb_assert (gdbarch != NULL);
118
119 arch_descr = gdbarch_data (gdbarch, libunwind_descr_handle);
120
121 if (arch_descr == NULL)
122 {
123 /* First time here. Must initialize data area. */
124 arch_descr = libunwind_descr_init (gdbarch);
3e43a32a
MS
125 deprecated_set_gdbarch_data (gdbarch,
126 libunwind_descr_handle, arch_descr);
0e5d83e3
JJ
127 }
128
129 /* Copy new descriptor info into arch descriptor. */
130 arch_descr->gdb2uw = descr->gdb2uw;
131 arch_descr->uw2gdb = descr->uw2gdb;
132 arch_descr->is_fpreg = descr->is_fpreg;
133 arch_descr->accessors = descr->accessors;
c5a27d9c 134 arch_descr->special_accessors = descr->special_accessors;
0e5d83e3
JJ
135}
136
137static struct libunwind_frame_cache *
15c1e57f 138libunwind_frame_cache (struct frame_info *this_frame, void **this_cache)
0e5d83e3
JJ
139{
140 unw_accessors_t *acc;
141 unw_addr_space_t as;
142 unw_word_t fp;
143 unw_regnum_t uw_sp_regnum;
144 struct libunwind_frame_cache *cache;
145 struct libunwind_descr *descr;
15c1e57f 146 struct gdbarch *gdbarch = get_frame_arch (this_frame);
0e5d83e3
JJ
147 int i, ret;
148
149 if (*this_cache)
150 return *this_cache;
151
152 /* Allocate a new cache. */
153 cache = FRAME_OBSTACK_ZALLOC (struct libunwind_frame_cache);
154
93d42b30
DJ
155 /* We can assume we are unwinding a normal frame. Even if this is
156 for a signal trampoline, ia64 signal "trampolines" use a normal
157 subroutine call to start the signal handler. */
15c1e57f 158 cache->func_addr = get_frame_func (this_frame);
c5a27d9c 159 if (cache->func_addr == 0
15c1e57f
JB
160 && get_next_frame (this_frame)
161 && get_frame_type (get_next_frame (this_frame)) == NORMAL_FRAME)
c5a27d9c 162 return NULL;
0e5d83e3 163
15c1e57f
JB
164 /* Get a libunwind cursor to the previous frame.
165
166 We do this by initializing a cursor. Libunwind treats a new cursor
167 as the top of stack and will get the current register set via the
168 libunwind register accessor. Now, we provide the platform-specific
169 accessors and we set up the register accessor to use the frame
170 register unwinding interfaces so that we properly get the registers
171 for the current frame rather than the top. We then use the unw_step
172 function to move the libunwind cursor back one frame. We can later
173 use this cursor to find previous registers via the unw_get_reg
174 interface which will invoke libunwind's special logic. */
8cff2ae6 175 descr = libunwind_descr (gdbarch);
0e5d83e3
JJ
176 acc = descr->accessors;
177 as = unw_create_addr_space_p (acc,
8cff2ae6 178 gdbarch_byte_order (gdbarch)
4c6b5505 179 == BFD_ENDIAN_BIG
0e5d83e3
JJ
180 ? __BIG_ENDIAN
181 : __LITTLE_ENDIAN);
182
15c1e57f 183 unw_init_remote_p (&cache->cursor, as, this_frame);
c5a27d9c 184 if (unw_step_p (&cache->cursor) < 0)
f43ae3f1
AS
185 {
186 unw_destroy_addr_space_p (as);
187 return NULL;
188 }
0e5d83e3
JJ
189
190 /* To get base address, get sp from previous frame. */
8cff2ae6 191 uw_sp_regnum = descr->gdb2uw (gdbarch_sp_regnum (gdbarch));
0e5d83e3
JJ
192 ret = unw_get_reg_p (&cache->cursor, uw_sp_regnum, &fp);
193 if (ret < 0)
f43ae3f1
AS
194 {
195 unw_destroy_addr_space_p (as);
196 error (_("Can't get libunwind sp register."));
197 }
0e5d83e3
JJ
198
199 cache->base = (CORE_ADDR)fp;
272dfcfd 200 cache->as = as;
0e5d83e3
JJ
201
202 *this_cache = cache;
203 return cache;
204}
205
272dfcfd
AS
206void
207libunwind_frame_dealloc_cache (struct frame_info *self, void *this_cache)
208{
209 struct libunwind_frame_cache *cache = this_cache;
e0881a8e 210
272dfcfd
AS
211 if (cache->as)
212 unw_destroy_addr_space_p (cache->as);
213}
214
503ff15d
KB
215unw_word_t
216libunwind_find_dyn_list (unw_addr_space_t as, unw_dyn_info_t *di, void *arg)
0e5d83e3 217{
503ff15d 218 return unw_find_dyn_list_p (as, di, arg);
0e5d83e3
JJ
219}
220
221static const struct frame_unwind libunwind_frame_unwind =
222{
223 NORMAL_FRAME,
224 libunwind_frame_this_id,
272dfcfd
AS
225 libunwind_frame_prev_register,
226 NULL,
15c1e57f
JB
227 libunwind_frame_sniffer,
228 libunwind_frame_dealloc_cache,
0e5d83e3
JJ
229};
230
231/* Verify if there is sufficient libunwind information for the frame to use
232 libunwind frame unwinding. */
15c1e57f
JB
233int
234libunwind_frame_sniffer (const struct frame_unwind *self,
235 struct frame_info *this_frame, void **this_cache)
0e5d83e3
JJ
236{
237 unw_cursor_t cursor;
238 unw_accessors_t *acc;
239 unw_addr_space_t as;
240 struct libunwind_descr *descr;
15c1e57f 241 struct gdbarch *gdbarch = get_frame_arch (this_frame);
0e5d83e3
JJ
242 int i, ret;
243
15c1e57f
JB
244 /* To test for libunwind unwind support, initialize a cursor to
245 the current frame and try to back up. We use this same method
246 when setting up the frame cache (see libunwind_frame_cache()).
247 If libunwind returns success for this operation, it means that
248 it has found sufficient libunwind unwinding information to do so. */
0e5d83e3 249
8cff2ae6 250 descr = libunwind_descr (gdbarch);
0e5d83e3
JJ
251 acc = descr->accessors;
252 as = unw_create_addr_space_p (acc,
8cff2ae6 253 gdbarch_byte_order (gdbarch)
4c6b5505 254 == BFD_ENDIAN_BIG
0e5d83e3
JJ
255 ? __BIG_ENDIAN
256 : __LITTLE_ENDIAN);
257
15c1e57f 258 ret = unw_init_remote_p (&cursor, as, this_frame);
0e5d83e3 259
c5a27d9c 260 if (ret < 0)
f43ae3f1
AS
261 {
262 unw_destroy_addr_space_p (as);
15c1e57f 263 return 0;
f43ae3f1 264 }
c5a27d9c
JJ
265
266
267 /* Check to see if we have libunwind info by checking if we are in a
268 signal frame. If it doesn't return an error, we have libunwind info
269 and can use libunwind. */
270 ret = unw_is_signal_frame_p (&cursor);
f43ae3f1 271 unw_destroy_addr_space_p (as);
0e5d83e3
JJ
272
273 if (ret < 0)
15c1e57f 274 return 0;
0e5d83e3 275
15c1e57f 276 return 1;
0e5d83e3
JJ
277}
278
279void
15c1e57f
JB
280libunwind_frame_this_id (struct frame_info *this_frame, void **this_cache,
281 struct frame_id *this_id)
0e5d83e3
JJ
282{
283 struct libunwind_frame_cache *cache =
15c1e57f 284 libunwind_frame_cache (this_frame, this_cache);
0e5d83e3 285
c5a27d9c
JJ
286 if (cache != NULL)
287 (*this_id) = frame_id_build (cache->base, cache->func_addr);
0e5d83e3
JJ
288}
289
15c1e57f
JB
290struct value *
291libunwind_frame_prev_register (struct frame_info *this_frame,
292 void **this_cache, int regnum)
0e5d83e3
JJ
293{
294 struct libunwind_frame_cache *cache =
15c1e57f
JB
295 libunwind_frame_cache (this_frame, this_cache);
296 struct gdbarch *gdbarch = get_frame_arch (this_frame);
0e5d83e3
JJ
297
298 void *ptr;
299 unw_cursor_t *c;
300 unw_save_loc_t sl;
301 int i, ret;
302 unw_word_t intval;
303 unw_fpreg_t fpval;
304 unw_regnum_t uw_regnum;
305 struct libunwind_descr *descr;
15c1e57f 306 struct value *val = NULL;
0e5d83e3 307
c5a27d9c 308 if (cache == NULL)
15c1e57f 309 return frame_unwind_got_constant (this_frame, regnum, 0);
c5a27d9c 310
0e5d83e3 311 /* Convert from gdb register number to libunwind register number. */
15c1e57f 312 descr = libunwind_descr (get_frame_arch (this_frame));
0e5d83e3
JJ
313 uw_regnum = descr->gdb2uw (regnum);
314
315 gdb_assert (regnum >= 0);
316
317 if (!target_has_registers)
8a3fe4f8 318 error (_("No registers."));
0e5d83e3 319
0e5d83e3 320 if (uw_regnum < 0)
15c1e57f 321 return frame_unwind_got_constant (this_frame, regnum, 0);
0e5d83e3
JJ
322
323 if (unw_get_saveloc_p (&cache->cursor, uw_regnum, &sl) < 0)
15c1e57f 324 return frame_unwind_got_constant (this_frame, regnum, 0);
0e5d83e3
JJ
325
326 switch (sl.type)
327 {
0e5d83e3 328 case UNW_SLT_MEMORY:
15c1e57f 329 val = frame_unwind_got_memory (this_frame, regnum, sl.u.addr);
0e5d83e3
JJ
330 break;
331
332 case UNW_SLT_REG:
15c1e57f
JB
333 val = frame_unwind_got_register (this_frame, regnum,
334 descr->uw2gdb (sl.u.regnum));
0e5d83e3 335 break;
15c1e57f
JB
336 case UNW_SLT_NONE:
337 {
338 /* The register is not stored at a specific memory address nor
339 inside another register. So use libunwind to fetch the register
340 value for us, and create a constant value with the result. */
341 if (descr->is_fpreg (uw_regnum))
342 {
343 ret = unw_get_fpreg_p (&cache->cursor, uw_regnum, &fpval);
344 if (ret < 0)
345 return frame_unwind_got_constant (this_frame, regnum, 0);
346 val = frame_unwind_got_bytes (this_frame, regnum,
347 (gdb_byte *) &fpval);
348 }
349 else
350 {
351 ret = unw_get_reg_p (&cache->cursor, uw_regnum, &intval);
352 if (ret < 0)
353 return frame_unwind_got_constant (this_frame, regnum, 0);
354 val = frame_unwind_got_constant (this_frame, regnum, intval);
355 }
15c1e57f
JB
356 break;
357 }
0e5d83e3 358 }
15c1e57f
JB
359
360 return val;
0e5d83e3
JJ
361}
362
363CORE_ADDR
15c1e57f 364libunwind_frame_base_address (struct frame_info *this_frame, void **this_cache)
0e5d83e3
JJ
365{
366 struct libunwind_frame_cache *cache =
15c1e57f 367 libunwind_frame_cache (this_frame, this_cache);
0e5d83e3 368
c5a27d9c
JJ
369 if (cache == NULL)
370 return (CORE_ADDR)NULL;
0e5d83e3
JJ
371 return cache->base;
372}
373
374/* The following is a glue routine to call the libunwind unwind table
375 search function to get unwind information for a specified ip address. */
376int
377libunwind_search_unwind_table (void *as, long ip, void *di,
378 void *pi, int need_unwind_info, void *args)
379{
380 return unw_search_unwind_table_p (*(unw_addr_space_t *)as, (unw_word_t )ip,
381 di, pi, need_unwind_info, args);
382}
383
c5a27d9c 384/* Verify if we are in a sigtramp frame and we can use libunwind to unwind. */
15c1e57f
JB
385int
386libunwind_sigtramp_frame_sniffer (const struct frame_unwind *self,
387 struct frame_info *this_frame,
388 void **this_cache)
c5a27d9c
JJ
389{
390 unw_cursor_t cursor;
391 unw_accessors_t *acc;
392 unw_addr_space_t as;
393 struct libunwind_descr *descr;
15c1e57f 394 struct gdbarch *gdbarch = get_frame_arch (this_frame);
c5a27d9c
JJ
395 int i, ret;
396
397 /* To test for libunwind unwind support, initialize a cursor to the
398 current frame and try to back up. We use this same method when
399 setting up the frame cache (see libunwind_frame_cache()). If
400 libunwind returns success for this operation, it means that it
401 has found sufficient libunwind unwinding information to do
402 so. */
403
8cff2ae6 404 descr = libunwind_descr (gdbarch);
c5a27d9c
JJ
405 acc = descr->accessors;
406 as = unw_create_addr_space_p (acc,
8cff2ae6 407 gdbarch_byte_order (gdbarch)
4c6b5505 408 == BFD_ENDIAN_BIG
c5a27d9c
JJ
409 ? __BIG_ENDIAN
410 : __LITTLE_ENDIAN);
411
15c1e57f 412 ret = unw_init_remote_p (&cursor, as, this_frame);
c5a27d9c
JJ
413
414 if (ret < 0)
f43ae3f1
AS
415 {
416 unw_destroy_addr_space_p (as);
15c1e57f 417 return 0;
f43ae3f1 418 }
c5a27d9c
JJ
419
420 /* Check to see if we are in a signal frame. */
421 ret = unw_is_signal_frame_p (&cursor);
f43ae3f1 422 unw_destroy_addr_space_p (as);
c5a27d9c 423 if (ret > 0)
15c1e57f 424 return 1;
c5a27d9c 425
15c1e57f 426 return 0;
c5a27d9c
JJ
427}
428
429/* The following routine is for accessing special registers of the top frame.
430 A special set of accessors must be given that work without frame info.
431 This is used by ia64 to access the rse registers r32-r127. While they
432 are usually located at BOF, this is not always true and only the libunwind
433 info can decipher where they actually are. */
434int
45ecac4b
UW
435libunwind_get_reg_special (struct gdbarch *gdbarch, struct regcache *regcache,
436 int regnum, void *buf)
c5a27d9c
JJ
437{
438 unw_cursor_t cursor;
439 unw_accessors_t *acc;
440 unw_addr_space_t as;
441 struct libunwind_descr *descr;
442 int ret;
443 unw_regnum_t uw_regnum;
444 unw_word_t intval;
445 unw_fpreg_t fpval;
446 void *ptr;
447
448
449 descr = libunwind_descr (gdbarch);
450 acc = descr->special_accessors;
451 as = unw_create_addr_space_p (acc,
8cff2ae6 452 gdbarch_byte_order (gdbarch)
4c6b5505 453 == BFD_ENDIAN_BIG
c5a27d9c
JJ
454 ? __BIG_ENDIAN
455 : __LITTLE_ENDIAN);
456
45ecac4b 457 ret = unw_init_remote_p (&cursor, as, regcache);
c5a27d9c 458 if (ret < 0)
f43ae3f1
AS
459 {
460 unw_destroy_addr_space_p (as);
461 return -1;
462 }
c5a27d9c
JJ
463
464 uw_regnum = descr->gdb2uw (regnum);
465
466 if (descr->is_fpreg (uw_regnum))
467 {
468 ret = unw_get_fpreg_p (&cursor, uw_regnum, &fpval);
469 ptr = &fpval;
470 }
471 else
472 {
473 ret = unw_get_reg_p (&cursor, uw_regnum, &intval);
474 ptr = &intval;
475 }
476
f43ae3f1
AS
477 unw_destroy_addr_space_p (as);
478
c5a27d9c
JJ
479 if (ret < 0)
480 return -1;
481
482 if (buf)
8cff2ae6 483 memcpy (buf, ptr, register_size (gdbarch, regnum));
c5a27d9c
JJ
484
485 return 0;
486}
487
0e5d83e3
JJ
488static int
489libunwind_load (void)
490{
491 void *handle;
492
493 handle = dlopen (LIBUNWIND_SO, RTLD_NOW);
494 if (handle == NULL)
495 return 0;
496
497 /* Initialize pointers to the dynamic library functions we will use. */
498
499 unw_get_reg_p = dlsym (handle, get_reg_name);
500 if (unw_get_reg_p == NULL)
501 return 0;
502
503 unw_get_fpreg_p = dlsym (handle, get_fpreg_name);
504 if (unw_get_fpreg_p == NULL)
505 return 0;
506
507 unw_get_saveloc_p = dlsym (handle, get_saveloc_name);
508 if (unw_get_saveloc_p == NULL)
509 return 0;
510
c5a27d9c
JJ
511 unw_is_signal_frame_p = dlsym (handle, is_signal_frame_name);
512 if (unw_is_signal_frame_p == NULL)
513 return 0;
514
0e5d83e3
JJ
515 unw_step_p = dlsym (handle, step_name);
516 if (unw_step_p == NULL)
517 return 0;
518
519 unw_init_remote_p = dlsym (handle, init_remote_name);
520 if (unw_init_remote_p == NULL)
521 return 0;
522
523 unw_create_addr_space_p = dlsym (handle, create_addr_space_name);
524 if (unw_create_addr_space_p == NULL)
525 return 0;
526
f43ae3f1
AS
527 unw_destroy_addr_space_p = dlsym (handle, destroy_addr_space_name);
528 if (unw_destroy_addr_space_p == NULL)
529 return 0;
530
0e5d83e3
JJ
531 unw_search_unwind_table_p = dlsym (handle, search_unwind_table_name);
532 if (unw_search_unwind_table_p == NULL)
533 return 0;
534
535 unw_find_dyn_list_p = dlsym (handle, find_dyn_list_name);
536 if (unw_find_dyn_list_p == NULL)
537 return 0;
538
539 return 1;
540}
541
542int
543libunwind_is_initialized (void)
544{
545 return libunwind_initialized;
546}
547
548/* Provide a prototype to silence -Wmissing-prototypes. */
549void _initialize_libunwind_frame (void);
550
551void
552_initialize_libunwind_frame (void)
553{
3e43a32a
MS
554 libunwind_descr_handle
555 = gdbarch_data_register_post_init (libunwind_descr_init);
0e5d83e3
JJ
556
557 libunwind_initialized = libunwind_load ();
558}
This page took 0.668166 seconds and 4 git commands to generate.