X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fia64-tdep.c;h=a7a802ab8a6797d3417cf032a6c9e3f73d9805f2;hb=aa0fbdd82c86c683f6d2bf39dcc9dedfc9c7a8d0;hp=ea6918c1021426171eebd442fb45eee756e1c996;hpb=c4de7027e3081f32895dc41d121a96e9e6717128;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c index ea6918c102..a7a802ab8a 100644 --- a/gdb/ia64-tdep.c +++ b/gdb/ia64-tdep.c @@ -1,7 +1,6 @@ /* Target-dependent code for the IA-64 for GDB, the GNU debugger. - Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, - 2009, 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 1999-2012 Free Software Foundation, Inc. This file is part of GDB. @@ -43,8 +42,7 @@ #ifdef HAVE_LIBUNWIND_IA64_H #include "elf/ia64.h" /* for PT_IA_64_UNWIND value */ -#include "libunwind-frame.h" -#include "libunwind-ia64.h" +#include "ia64-libunwind-tdep.h" /* Note: KERNEL_START is supposed to be an address which is not going to ever contain any valid unwind info. For ia64 linux, the choice @@ -811,7 +809,7 @@ ia64_memory_remove_breakpoint (struct gdbarch *gdbarch, /* In BUNDLE_MEM, be careful to modify only the bits belonging to SLOTNUM and not any of the other ones that are stored in SHADOW_CONTENTS. */ replace_slotN_contents (bundle_mem, instr_saved, slotnum); - val = target_write_memory (addr, bundle_mem, BUNDLE_LEN); + val = target_write_raw_memory (addr, bundle_mem, BUNDLE_LEN); do_cleanups (cleanup); return val; @@ -933,11 +931,12 @@ rse_address_add(CORE_ADDR addr, int nslots) return new_addr; } -static void +static enum register_status ia64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, int regnum, gdb_byte *buf) { enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + enum register_status status; if (regnum >= V32_REGNUM && regnum <= V127_REGNUM) { @@ -952,12 +951,21 @@ ia64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, found sequentially in memory starting at $bof. This isn't always true, but without libunwind, this is the best we can do. */ + enum register_status status; ULONGEST cfm; ULONGEST bsp; CORE_ADDR reg; - regcache_cooked_read_unsigned (regcache, IA64_BSP_REGNUM, &bsp); - regcache_cooked_read_unsigned (regcache, IA64_CFM_REGNUM, &cfm); - + + status = regcache_cooked_read_unsigned (regcache, + IA64_BSP_REGNUM, &bsp); + if (status != REG_VALID) + return status; + + status = regcache_cooked_read_unsigned (regcache, + IA64_CFM_REGNUM, &cfm); + if (status != REG_VALID) + return status; + /* The bsp points at the end of the register frame so we subtract the size of frame from it to get start of register frame. */ @@ -979,7 +987,9 @@ ia64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, { ULONGEST unatN_val; ULONGEST unat; - regcache_cooked_read_unsigned (regcache, IA64_UNAT_REGNUM, &unat); + status = regcache_cooked_read_unsigned (regcache, IA64_UNAT_REGNUM, &unat); + if (status != REG_VALID) + return status; unatN_val = (unat & (1LL << (regnum - IA64_NAT0_REGNUM))) != 0; store_unsigned_integer (buf, register_size (gdbarch, regnum), byte_order, unatN_val); @@ -990,8 +1000,12 @@ ia64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, ULONGEST bsp; ULONGEST cfm; CORE_ADDR gr_addr = 0; - regcache_cooked_read_unsigned (regcache, IA64_BSP_REGNUM, &bsp); - regcache_cooked_read_unsigned (regcache, IA64_CFM_REGNUM, &cfm); + status = regcache_cooked_read_unsigned (regcache, IA64_BSP_REGNUM, &bsp); + if (status != REG_VALID) + return status; + status = regcache_cooked_read_unsigned (regcache, IA64_CFM_REGNUM, &cfm); + if (status != REG_VALID) + return status; /* The bsp points at the end of the register frame so we subtract the size of frame from it to get start of register frame. */ @@ -1027,9 +1041,12 @@ ia64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, It can be calculated as the bsp - sof (sizeof frame). */ ULONGEST bsp, vbsp; ULONGEST cfm; - CORE_ADDR reg; - regcache_cooked_read_unsigned (regcache, IA64_BSP_REGNUM, &bsp); - regcache_cooked_read_unsigned (regcache, IA64_CFM_REGNUM, &cfm); + status = regcache_cooked_read_unsigned (regcache, IA64_BSP_REGNUM, &bsp); + if (status != REG_VALID) + return status; + status = regcache_cooked_read_unsigned (regcache, IA64_CFM_REGNUM, &cfm); + if (status != REG_VALID) + return status; /* The bsp points at the end of the register frame so we subtract the size of frame from it to get beginning of frame. */ @@ -1042,9 +1059,12 @@ ia64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, ULONGEST pr; ULONGEST cfm; ULONGEST prN_val; - CORE_ADDR reg; - regcache_cooked_read_unsigned (regcache, IA64_PR_REGNUM, &pr); - regcache_cooked_read_unsigned (regcache, IA64_CFM_REGNUM, &cfm); + status = regcache_cooked_read_unsigned (regcache, IA64_PR_REGNUM, &pr); + if (status != REG_VALID) + return status; + status = regcache_cooked_read_unsigned (regcache, IA64_CFM_REGNUM, &cfm); + if (status != REG_VALID) + return status; if (VP16_REGNUM <= regnum && regnum <= VP63_REGNUM) { @@ -1062,6 +1082,8 @@ ia64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, } else memset (buf, 0, register_size (gdbarch, regnum)); + + return REG_VALID; } static void @@ -1074,7 +1096,6 @@ ia64_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, { ULONGEST bsp; ULONGEST cfm; - CORE_ADDR reg; regcache_cooked_read_unsigned (regcache, IA64_BSP_REGNUM, &bsp); regcache_cooked_read_unsigned (regcache, IA64_CFM_REGNUM, &cfm); @@ -1132,7 +1153,8 @@ ia64_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, collection from the computed address. */ if (nat_addr >= bsp) { - regcache_cooked_read_unsigned (regcache, IA64_RNAT_REGNUM, + regcache_cooked_read_unsigned (regcache, + IA64_RNAT_REGNUM, &nat_collection); if (natN_val) nat_collection |= natN_mask; @@ -1196,14 +1218,23 @@ ia64_convert_register_p (struct gdbarch *gdbarch, int regno, struct type *type) && type != ia64_ext_type (gdbarch)); } -static void +static int ia64_register_to_value (struct frame_info *frame, int regnum, - struct type *valtype, gdb_byte *out) + struct type *valtype, gdb_byte *out, + int *optimizedp, int *unavailablep) { struct gdbarch *gdbarch = get_frame_arch (frame); char in[MAX_REGISTER_SIZE]; - frame_register_read (frame, regnum, in); + + /* Convert to TYPE. */ + if (!get_frame_register_bytes (frame, regnum, 0, + register_size (gdbarch, regnum), + in, optimizedp, unavailablep)) + return 0; + convert_typed_floating (in, ia64_ext_type (gdbarch), out, valtype); + *optimizedp = *unavailablep = 0; + return 1; } static void @@ -1820,8 +1851,7 @@ ia64_frame_cache (struct frame_info *this_frame, void **this_cache) enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); struct ia64_frame_cache *cache; char buf[8]; - CORE_ADDR cfm, sof, sol, bsp, psr; - int i; + CORE_ADDR cfm, psr; if (*this_cache) return *this_cache; @@ -2139,6 +2169,7 @@ ia64_frame_prev_register (struct frame_info *this_frame, void **this_cache, static const struct frame_unwind ia64_frame_unwind = { NORMAL_FRAME, + default_frame_unwind_stop_reason, &ia64_frame_this_id, &ia64_frame_prev_register, NULL, @@ -2207,9 +2238,7 @@ ia64_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache) struct gdbarch *gdbarch = get_frame_arch (this_frame); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); struct ia64_frame_cache *cache; - CORE_ADDR addr; char buf[8]; - int i; if (*this_cache) return *this_cache; @@ -2330,6 +2359,7 @@ ia64_sigtramp_frame_sniffer (const struct frame_unwind *self, static const struct frame_unwind ia64_sigtramp_frame_unwind = { SIGTRAMP_FRAME, + default_frame_unwind_stop_reason, ia64_sigtramp_frame_this_id, ia64_sigtramp_frame_prev_register, NULL, @@ -2381,8 +2411,8 @@ ia64_rse_skip_regs (uint64_t addr, long num_regs) return addr + ((num_regs + delta/0x3f) << 3); } -/* Gdb libunwind-frame callback function to convert from an ia64 gdb register - number to a libunwind register number. */ +/* Gdb ia64-libunwind-tdep callback function to convert from an ia64 gdb + register number to a libunwind register number. */ static int ia64_gdb2uw_regnum (int regnum) { @@ -2414,8 +2444,8 @@ ia64_gdb2uw_regnum (int regnum) return -1; } -/* Gdb libunwind-frame callback function to convert from a libunwind register - number to a ia64 gdb register number. */ +/* Gdb ia64-libunwind-tdep callback function to convert from a libunwind + register number to a ia64 gdb register number. */ static int ia64_uw2gdb_regnum (int uw_regnum) { @@ -2445,8 +2475,8 @@ ia64_uw2gdb_regnum (int uw_regnum) return -1; } -/* Gdb libunwind-frame callback function to reveal if register is a float - register or not. */ +/* Gdb ia64-libunwind-tdep callback function to reveal if register is + a float register or not. */ static int ia64_is_fpreg (int uw_regnum) { @@ -3015,6 +3045,7 @@ ia64_libunwind_frame_sniffer (const struct frame_unwind *self, static const struct frame_unwind ia64_libunwind_frame_unwind = { NORMAL_FRAME, + default_frame_unwind_stop_reason, ia64_libunwind_frame_this_id, ia64_libunwind_frame_prev_register, NULL, @@ -3103,6 +3134,7 @@ ia64_libunwind_sigtramp_frame_sniffer (const struct frame_unwind *self, static const struct frame_unwind ia64_libunwind_sigtramp_frame_unwind = { SIGTRAMP_FRAME, + default_frame_unwind_stop_reason, ia64_libunwind_sigtramp_frame_this_id, ia64_libunwind_sigtramp_frame_prev_register, NULL, @@ -3110,7 +3142,7 @@ static const struct frame_unwind ia64_libunwind_sigtramp_frame_unwind = }; /* Set of libunwind callback acccessor functions. */ -static unw_accessors_t ia64_unw_accessors = +unw_accessors_t ia64_unw_accessors = { ia64_find_proc_info_x, ia64_put_unwind_info, @@ -3126,7 +3158,7 @@ static unw_accessors_t ia64_unw_accessors = the rse registers. At the top of the stack, we want libunwind to figure out how to read r32 - r127. Though usually they are found sequentially in memory starting from $bof, this is not always true. */ -static unw_accessors_t ia64_unw_rse_accessors = +unw_accessors_t ia64_unw_rse_accessors = { ia64_find_proc_info_x, ia64_put_unwind_info, @@ -3138,9 +3170,9 @@ static unw_accessors_t ia64_unw_rse_accessors = /* get_proc_name */ }; -/* Set of ia64 gdb libunwind-frame callbacks and data for generic - libunwind-frame code to use. */ -static struct libunwind_descr ia64_libunwind_descr = +/* Set of ia64-libunwind-tdep gdb callbacks and data for generic + ia64-libunwind-tdep code to use. */ +struct libunwind_descr ia64_libunwind_descr = { ia64_gdb2uw_regnum, ia64_uw2gdb_regnum, @@ -3302,7 +3334,7 @@ ia64_store_return_value (struct type *type, struct regcache *regcache, } static enum return_value_convention -ia64_return_value (struct gdbarch *gdbarch, struct type *func_type, +ia64_return_value (struct gdbarch *gdbarch, struct value *function, struct type *valtype, struct regcache *regcache, gdb_byte *readbuf, const gdb_byte *writebuf) {