/* Frame unwinder for frames using the libunwind library.
- Copyright (C) 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
+ Copyright (C) 2003, 2004, 2006, 2007, 2008 Free Software Foundation, Inc.
Written by Jeff Johnston, contributed by Red Hat Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
unw_regnum_t uw_sp_regnum;
struct libunwind_frame_cache *cache;
struct libunwind_descr *descr;
+ struct gdbarch *gdbarch = get_frame_arch (next_frame);
int i, ret;
if (*this_cache)
the current frame rather than the top. We then use the unw_step function to
move the libunwind cursor back one frame. We can later use this cursor to find previous
registers via the unw_get_reg interface which will invoke libunwind's special logic. */
- descr = libunwind_descr (get_frame_arch (next_frame));
+ descr = libunwind_descr (gdbarch);
acc = descr->accessors;
as = unw_create_addr_space_p (acc,
- gdbarch_byte_order (current_gdbarch)
+ gdbarch_byte_order (gdbarch)
== BFD_ENDIAN_BIG
? __BIG_ENDIAN
: __LITTLE_ENDIAN);
}
/* To get base address, get sp from previous frame. */
- uw_sp_regnum = descr->gdb2uw (SP_REGNUM);
+ uw_sp_regnum = descr->gdb2uw (gdbarch_sp_regnum (gdbarch));
ret = unw_get_reg_p (&cache->cursor, uw_sp_regnum, &fp);
if (ret < 0)
{
libunwind_frame_prev_register,
NULL,
NULL,
- NULL,
libunwind_frame_dealloc_cache
};
unw_accessors_t *acc;
unw_addr_space_t as;
struct libunwind_descr *descr;
+ struct gdbarch *gdbarch = get_frame_arch (next_frame);
int i, ret;
/* To test for libunwind unwind support, initialize a cursor to the current frame and try to back
If libunwind returns success for this operation, it means that it has found sufficient
libunwind unwinding information to do so. */
- descr = libunwind_descr (get_frame_arch (next_frame));
+ descr = libunwind_descr (gdbarch);
acc = descr->accessors;
as = unw_create_addr_space_p (acc,
- gdbarch_byte_order (current_gdbarch)
+ gdbarch_byte_order (gdbarch)
== BFD_ENDIAN_BIG
? __BIG_ENDIAN
: __LITTLE_ENDIAN);
{
struct libunwind_frame_cache *cache =
libunwind_frame_cache (next_frame, this_cache);
+ struct gdbarch *gdbarch = get_frame_arch (next_frame);
void *ptr;
unw_cursor_t *c;
*realnump = -1;
if (valuep)
- memset (valuep, 0, register_size (current_gdbarch, regnum));
+ memset (valuep, 0, register_size (gdbarch, regnum));
if (uw_regnum < 0)
return;
return;
if (valuep)
- memcpy (valuep, ptr, register_size (current_gdbarch, regnum));
+ memcpy (valuep, ptr, register_size (gdbarch, regnum));
if (unw_get_saveloc_p (&cache->cursor, uw_regnum, &sl) < 0)
return;
unw_accessors_t *acc;
unw_addr_space_t as;
struct libunwind_descr *descr;
+ struct gdbarch *gdbarch = get_frame_arch (next_frame);
int i, ret;
/* To test for libunwind unwind support, initialize a cursor to the
has found sufficient libunwind unwinding information to do
so. */
- descr = libunwind_descr (get_frame_arch (next_frame));
+ descr = libunwind_descr (gdbarch);
acc = descr->accessors;
as = unw_create_addr_space_p (acc,
- gdbarch_byte_order (current_gdbarch)
+ gdbarch_byte_order (gdbarch)
== BFD_ENDIAN_BIG
? __BIG_ENDIAN
: __LITTLE_ENDIAN);
descr = libunwind_descr (gdbarch);
acc = descr->special_accessors;
as = unw_create_addr_space_p (acc,
- gdbarch_byte_order (current_gdbarch)
+ gdbarch_byte_order (gdbarch)
== BFD_ENDIAN_BIG
? __BIG_ENDIAN
: __LITTLE_ENDIAN);
return -1;
if (buf)
- memcpy (buf, ptr, register_size (current_gdbarch, regnum));
+ memcpy (buf, ptr, register_size (gdbarch, regnum));
return 0;
}