X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fia64-tdep.c;h=08eb79d7df4d49b79249b41a654124c29b2c0cb2;hb=976411d6b6aa5cae05259eb92b87a04262052e09;hp=cbd8514acc5a1b55da55c4e8688f564e43458bcb;hpb=05d1431c1e0a4ecf30462109f5fb9876d78b7b4a;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c index cbd8514acc..08eb79d7df 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-2014 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 @@ -372,7 +370,7 @@ ia64_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg) bit ``from''. */ static long long -extract_bit_field (const char *bundle, int from, int len) +extract_bit_field (const gdb_byte *bundle, int from, int len) { long long result = 0LL; int to = from + len; @@ -408,7 +406,7 @@ extract_bit_field (const char *bundle, int from, int len) /* Replace the specified bits in an instruction bundle. */ static void -replace_bit_field (char *bundle, long long val, int from, int len) +replace_bit_field (gdb_byte *bundle, long long val, int from, int len) { int to = from + len; int from_byte = from / 8; @@ -458,7 +456,7 @@ replace_bit_field (char *bundle, long long val, int from, int len) and instruction bundle. */ static long long -slotN_contents (char *bundle, int slotnum) +slotN_contents (gdb_byte *bundle, int slotnum) { return extract_bit_field (bundle, 5+41*slotnum, 41); } @@ -466,7 +464,7 @@ slotN_contents (char *bundle, int slotnum) /* Store an instruction in an instruction bundle. */ static void -replace_slotN_contents (char *bundle, long long instr, int slotnum) +replace_slotN_contents (gdb_byte *bundle, long long instr, int slotnum) { replace_bit_field (bundle, instr, 5+41*slotnum, 41); } @@ -513,7 +511,7 @@ static const enum instruction_type template_encoding_table[32][3] = static CORE_ADDR fetch_instruction (CORE_ADDR addr, instruction_type *it, long long *instr) { - char bundle[BUNDLE_LEN]; + gdb_byte bundle[BUNDLE_LEN]; int slotnum = (int) (addr & 0x0f) / SLOT_MULTIPLIER; long long template; int val; @@ -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; @@ -1043,7 +1041,6 @@ 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; status = regcache_cooked_read_unsigned (regcache, IA64_BSP_REGNUM, &bsp); if (status != REG_VALID) return status; @@ -1062,7 +1059,6 @@ ia64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, ULONGEST pr; ULONGEST cfm; ULONGEST prN_val; - CORE_ADDR reg; status = regcache_cooked_read_unsigned (regcache, IA64_PR_REGNUM, &pr); if (status != REG_VALID) return status; @@ -1100,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); @@ -1170,7 +1165,7 @@ ia64_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, } else { - char nat_buf[8]; + gdb_byte nat_buf[8]; nat_collection = read_memory_integer (nat_addr, 8, byte_order); if (natN_val) nat_collection |= natN_mask; @@ -1223,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); + gdb_byte in[MAX_REGISTER_SIZE]; + + /* 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 @@ -1238,7 +1242,7 @@ ia64_value_to_register (struct frame_info *frame, int regnum, struct type *valtype, const gdb_byte *in) { struct gdbarch *gdbarch = get_frame_arch (frame); - char out[MAX_REGISTER_SIZE]; + gdb_byte out[MAX_REGISTER_SIZE]; convert_typed_floating (in, valtype, out, ia64_ext_type (gdbarch)); put_frame_register (frame, regnum, out); } @@ -1376,7 +1380,7 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc, int frameless = 1; int i; CORE_ADDR addr; - char buf[8]; + gdb_byte buf[8]; CORE_ADDR bof, sor, sol, sof, cfm, rrb_gr; memset (instores, 0, sizeof instores); @@ -1510,7 +1514,7 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc, else if (qp == 0 && rN == 2 && ((rM == fp_reg && fp_reg != 0) || rM == 12)) { - char buf[MAX_REGISTER_SIZE]; + gdb_byte buf[MAX_REGISTER_SIZE]; CORE_ADDR saved_sp = 0; /* adds r2, spilloffset, rFramePointer or @@ -1846,9 +1850,8 @@ ia64_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; - char buf[8]; - CORE_ADDR cfm, sof, sol, bsp, psr; - int i; + gdb_byte buf[8]; + CORE_ADDR cfm, psr; if (*this_cache) return *this_cache; @@ -1915,7 +1918,7 @@ ia64_frame_prev_register (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 = ia64_frame_cache (this_frame, this_cache); - char buf[8]; + gdb_byte buf[8]; gdb_assert (regnum >= 0); @@ -2166,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, @@ -2234,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; + gdb_byte buf[8]; if (*this_cache) return *this_cache; @@ -2286,7 +2288,7 @@ static struct value * ia64_sigtramp_frame_prev_register (struct frame_info *this_frame, void **this_cache, int regnum) { - char buf[MAX_REGISTER_SIZE]; + gdb_byte buf[MAX_REGISTER_SIZE]; struct gdbarch *gdbarch = get_frame_arch (this_frame); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); @@ -2357,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, @@ -2408,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) { @@ -2441,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) { @@ -2472,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) { @@ -2491,7 +2494,7 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val, struct gdbarch *gdbarch = get_frame_arch (this_frame); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); long new_sof, old_sof; - char buf[MAX_REGISTER_SIZE]; + gdb_byte buf[MAX_REGISTER_SIZE]; /* We never call any libunwind routines that need to write registers. */ gdb_assert (!write); @@ -2555,7 +2558,7 @@ ia64_access_fpreg (unw_addr_space_t as, unw_regnum_t uw_regnum, /* We never call any libunwind routines that need to write registers. */ gdb_assert (!write); - get_frame_register (this_frame, regnum, (char *) val); + get_frame_register (this_frame, regnum, (gdb_byte *) val); return 0; } @@ -2571,7 +2574,7 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, struct gdbarch *gdbarch = get_regcache_arch (regcache); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); long new_sof, old_sof; - char buf[MAX_REGISTER_SIZE]; + gdb_byte buf[MAX_REGISTER_SIZE]; /* We never call any libunwind routines that need to write registers. */ gdb_assert (!write); @@ -2636,7 +2639,7 @@ ia64_access_rse_fpreg (unw_addr_space_t as, unw_regnum_t uw_regnum, /* We never call any libunwind routines that need to write registers. */ gdb_assert (!write); - regcache_cooked_read (regcache, regnum, (char *) val); + regcache_cooked_read (regcache, regnum, (gdb_byte *) val); return 0; } @@ -2661,9 +2664,9 @@ ia64_access_mem (unw_addr_space_t as, /* XXX do we need to normalize byte-order here? */ if (write) - return target_write_memory (addr, (char *) val, sizeof (unw_word_t)); + return target_write_memory (addr, (gdb_byte *) val, sizeof (unw_word_t)); else - return target_read_memory (addr, (char *) val, sizeof (unw_word_t)); + return target_read_memory (addr, (gdb_byte *) val, sizeof (unw_word_t)); } /* Call low-level function to access the kernel unwind table. */ @@ -2926,7 +2929,7 @@ ia64_libunwind_frame_this_id (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 frame_id id = outer_frame_id; - char buf[8]; + gdb_byte buf[8]; CORE_ADDR bsp; libunwind_frame_this_id (this_frame, this_cache, &id); @@ -2978,7 +2981,7 @@ ia64_libunwind_frame_prev_register (struct frame_info *this_frame, { int rrb_pr = 0; ULONGEST cfm; - unsigned char buf[MAX_REGISTER_SIZE]; + gdb_byte buf[MAX_REGISTER_SIZE]; /* Fetch predicate register rename base from current frame marker for this frame. */ @@ -3042,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, @@ -3056,7 +3060,7 @@ ia64_libunwind_sigtramp_frame_this_id (struct frame_info *this_frame, { struct gdbarch *gdbarch = get_frame_arch (this_frame); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - char buf[8]; + gdb_byte buf[8]; CORE_ADDR bsp; struct frame_id id = outer_frame_id; CORE_ADDR prev_ip; @@ -3130,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, @@ -3137,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, @@ -3153,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, @@ -3165,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, @@ -3223,7 +3228,7 @@ ia64_extract_return_value (struct type *type, struct regcache *regcache, float_elt_type = is_float_or_hfa_type (type); if (float_elt_type != NULL) { - char from[MAX_REGISTER_SIZE]; + gdb_byte from[MAX_REGISTER_SIZE]; int offset = 0; int regnum = IA64_FR8_REGNUM; int n = TYPE_LENGTH (type) / TYPE_LENGTH (float_elt_type); @@ -3288,7 +3293,7 @@ ia64_store_return_value (struct type *type, struct regcache *regcache, float_elt_type = is_float_or_hfa_type (type); if (float_elt_type != NULL) { - char to[MAX_REGISTER_SIZE]; + gdb_byte to[MAX_REGISTER_SIZE]; int offset = 0; int regnum = IA64_FR8_REGNUM; int n = TYPE_LENGTH (type) / TYPE_LENGTH (float_elt_type); @@ -3329,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) { @@ -3475,7 +3480,7 @@ ia64_find_global_pointer_from_dynamic_section (struct gdbarch *gdbarch, { int status; LONGEST tag; - char buf[8]; + gdb_byte buf[8]; status = target_read_memory (addr, buf, sizeof (buf)); if (status != 0) @@ -3558,7 +3563,7 @@ find_extant_func_descr (struct gdbarch *gdbarch, CORE_ADDR faddr) { int status; LONGEST faddr2; - char buf[8]; + gdb_byte buf[8]; status = target_read_memory (addr, buf, sizeof (buf)); if (status != 0) @@ -3591,7 +3596,7 @@ find_func_descr (struct regcache *regcache, CORE_ADDR faddr, CORE_ADDR *fdaptr) if (fdesc == 0) { ULONGEST global_pointer; - char buf[16]; + gdb_byte buf[16]; fdesc = *fdaptr; *fdaptr += 16; @@ -3646,11 +3651,12 @@ ia64_convert_from_func_ptr_addr (struct gdbarch *gdbarch, CORE_ADDR addr, /* There are also descriptors embedded in vtables. */ if (s) { - struct minimal_symbol *minsym; + struct bound_minimal_symbol minsym; minsym = lookup_minimal_symbol_by_pc (addr); - if (minsym && is_vtable_name (SYMBOL_LINKAGE_NAME (minsym))) + if (minsym.minsym + && is_vtable_name (MSYMBOL_LINKAGE_NAME (minsym.minsym))) return read_memory_unsigned_integer (addr, 8, byte_order); } @@ -3778,7 +3784,7 @@ ia64_push_dummy_call (struct gdbarch *gdbarch, struct value *function, && TYPE_CODE (type) == TYPE_CODE_PTR && TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_FUNC) { - char val_buf[8]; + gdb_byte val_buf[8]; ULONGEST faddr = extract_unsigned_integer (value_contents (arg), 8, byte_order); store_unsigned_integer (val_buf, 8, byte_order, @@ -3802,7 +3808,7 @@ ia64_push_dummy_call (struct gdbarch *gdbarch, struct value *function, argoffset = 0; while (len > 0) { - char val_buf[8]; + gdb_byte val_buf[8]; memset (val_buf, 0, 8); if (!ia64_struct_type_p (type) && len < 8) @@ -3898,7 +3904,7 @@ static struct frame_id ia64_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame) { enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - char buf[8]; + gdb_byte buf[8]; CORE_ADDR sp, bsp; get_frame_register (this_frame, sp_regnum, buf); @@ -3920,7 +3926,7 @@ static CORE_ADDR ia64_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame) { enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - char buf[8]; + gdb_byte buf[8]; CORE_ADDR ip, psr, pc; frame_unwind_register (next_frame, IA64_IP_REGNUM, buf);