X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Falpha-tdep.c;h=d62566c4b0a333d6afe8e1f9693e26ac183aa468;hb=a0ff9e1ad221c11f58a9d8d12a84c21579132d85;hp=ebaa1dd1f502234f5021741e389b70f497b9a822;hpb=0e9f083f4cb94a9dc861f38ba151aac06efce2b8;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/alpha-tdep.c b/gdb/alpha-tdep.c index ebaa1dd1f5..d62566c4b0 100644 --- a/gdb/alpha-tdep.c +++ b/gdb/alpha-tdep.c @@ -1,6 +1,6 @@ /* Target-dependent code for the ALPHA architecture, for GDB, the GNU Debugger. - Copyright (C) 1993-2013 Free Software Foundation, Inc. + Copyright (C) 1993-2017 Free Software Foundation, Inc. This file is part of GDB. @@ -31,7 +31,6 @@ #include "dis-asm.h" #include "symfile.h" #include "objfiles.h" -#include #include "linespec.h" #include "regcache.h" #include "reggroups.h" @@ -44,6 +43,7 @@ #include "elf-bfd.h" #include "alpha-tdep.h" +#include /* Instruction decoding. The notations for registers, immediates and opcodes are the same as the one used in Compaq's Alpha architecture @@ -186,7 +186,8 @@ static void alpha_lds (struct gdbarch *gdbarch, void *out, const void *in) { enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - ULONGEST mem = extract_unsigned_integer (in, 4, byte_order); + ULONGEST mem + = extract_unsigned_integer ((const gdb_byte *) in, 4, byte_order); ULONGEST frac = (mem >> 0) & 0x7fffff; ULONGEST sign = (mem >> 31) & 1; ULONGEST exp_msb = (mem >> 30) & 1; @@ -206,7 +207,7 @@ alpha_lds (struct gdbarch *gdbarch, void *out, const void *in) } reg = (sign << 63) | (exp << 52) | (frac << 29); - store_unsigned_integer (out, 8, byte_order, reg); + store_unsigned_integer ((gdb_byte *) out, 8, byte_order, reg); } /* Similarly, this represents exactly the conversion performed by @@ -218,9 +219,9 @@ alpha_sts (struct gdbarch *gdbarch, void *out, const void *in) enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); ULONGEST reg, mem; - reg = extract_unsigned_integer (in, 8, byte_order); + reg = extract_unsigned_integer ((const gdb_byte *) in, 8, byte_order); mem = ((reg >> 32) & 0xc0000000) | ((reg >> 29) & 0x3fffffff); - store_unsigned_integer (out, 4, byte_order, mem); + store_unsigned_integer ((gdb_byte *) out, 4, byte_order, mem); } /* The alpha needs a conversion between register and memory format if the @@ -306,8 +307,7 @@ alpha_push_dummy_call (struct gdbarch *gdbarch, struct value *function, int len; int offset; }; - struct alpha_arg *alpha_args - = (struct alpha_arg *) alloca (nargs * sizeof (struct alpha_arg)); + struct alpha_arg *alpha_args = XALLOCAVEC (struct alpha_arg, nargs); struct alpha_arg *m_arg; gdb_byte arg_reg_buffer[ALPHA_REGISTER_SIZE * ALPHA_NUM_ARG_REGS]; int required_arg_regs; @@ -645,14 +645,10 @@ alpha_return_in_memory_always (struct type *type) return 1; } -static const gdb_byte * -alpha_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pc, int *len) -{ - static const gdb_byte break_insn[] = { 0x80, 0, 0, 0 }; /* call_pal bpt */ - *len = sizeof(break_insn); - return break_insn; -} +constexpr gdb_byte alpha_break_insn[] = { 0x80, 0, 0, 0 }; /* call_pal bpt */ + +typedef BP_MANIPULATION (alpha_break_insn) alpha_breakpoint; /* This returns the PC of the first insn after the prologue. @@ -683,11 +679,11 @@ alpha_read_insn (struct gdbarch *gdbarch, CORE_ADDR pc) { enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); gdb_byte buf[ALPHA_INSN_SIZE]; - int status; + int res; - status = target_read_memory (pc, buf, sizeof (buf)); - if (status) - memory_error (status, pc); + res = target_read_memory (pc, buf, sizeof (buf)); + if (res != 0) + memory_error (TARGET_XFER_E_IO, pc); return extract_unsigned_integer (buf, sizeof (buf), byte_order); } @@ -722,7 +718,7 @@ alpha_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc) post_prologue_pc = alpha_after_prologue (pc); if (post_prologue_pc != 0) - return max (pc, post_prologue_pc); + return std::max (pc, post_prologue_pc); /* Can't determine prologue from the symbol table, need to examine instructions. */ @@ -769,12 +765,11 @@ static const int stq_c_opcode = 0x2f; is found, attempt to step through it. A breakpoint is placed at the end of the sequence. */ -static int -alpha_deal_with_atomic_sequence (struct frame_info *frame) +static std::vector +alpha_deal_with_atomic_sequence (struct regcache *regcache) { - struct gdbarch *gdbarch = get_frame_arch (frame); - struct address_space *aspace = get_frame_address_space (frame); - CORE_ADDR pc = get_frame_pc (frame); + struct gdbarch *gdbarch = get_regcache_arch (regcache); + CORE_ADDR pc = regcache_read_pc (regcache); CORE_ADDR breaks[2] = {-1, -1}; CORE_ADDR loc = pc; CORE_ADDR closing_insn; /* Instruction that closes the atomic sequence. */ @@ -788,7 +783,7 @@ alpha_deal_with_atomic_sequence (struct frame_info *frame) /* Assume all atomic sequences start with a LDL_L/LDQ_L instruction. */ if (INSN_OPCODE (insn) != ldl_l_opcode && INSN_OPCODE (insn) != ldq_l_opcode) - return 0; + return {}; /* Assume that no atomic sequence is longer than "atomic_sequence_length" instructions. */ @@ -807,8 +802,8 @@ alpha_deal_with_atomic_sequence (struct frame_info *frame) immediate = (immediate ^ 0x400000) - 0x400000; if (bc_insn_count >= 1) - return 0; /* More than one branch found, fallback - to the standard single-step code. */ + return {}; /* More than one branch found, fallback + to the standard single-step code. */ breaks[1] = loc + ALPHA_INSN_SIZE + immediate; @@ -824,7 +819,7 @@ alpha_deal_with_atomic_sequence (struct frame_info *frame) /* Assume that the atomic sequence ends with a STL_C/STQ_C instruction. */ if (INSN_OPCODE (insn) != stl_c_opcode && INSN_OPCODE (insn) != stq_c_opcode) - return 0; + return {}; closing_insn = loc; loc += ALPHA_INSN_SIZE; @@ -839,11 +834,12 @@ alpha_deal_with_atomic_sequence (struct frame_info *frame) || (breaks[1] >= pc && breaks[1] <= closing_insn))) last_breakpoint = 0; - /* Effectively inserts the breakpoints. */ + std::vector next_pcs; + for (index = 0; index <= last_breakpoint; index++) - insert_single_step_breakpoint (gdbarch, aspace, breaks[index]); + next_pcs.push_back (breaks[index]); - return 1; + return next_pcs; } @@ -891,7 +887,7 @@ alpha_sigtramp_frame_unwind_cache (struct frame_info *this_frame, struct gdbarch_tdep *tdep; if (*this_prologue_cache) - return *this_prologue_cache; + return (struct alpha_sigtramp_unwind_cache *) *this_prologue_cache; info = FRAME_OBSTACK_ZALLOC (struct alpha_sigtramp_unwind_cache); *this_prologue_cache = info; @@ -1241,7 +1237,7 @@ alpha_heuristic_frame_unwind_cache (struct frame_info *this_frame, int frame_reg, frame_size, return_reg, reg; if (*this_prologue_cache) - return *this_prologue_cache; + return (struct alpha_heuristic_unwind_cache *) *this_prologue_cache; info = FRAME_OBSTACK_ZALLOC (struct alpha_heuristic_unwind_cache); *this_prologue_cache = info; @@ -1500,7 +1496,7 @@ void alpha_supply_int_regs (struct regcache *regcache, int regno, const void *r0_r30, const void *pc, const void *unique) { - const gdb_byte *regs = r0_r30; + const gdb_byte *regs = (const gdb_byte *) r0_r30; int i; for (i = 0; i < 31; ++i) @@ -1525,7 +1521,7 @@ void alpha_fill_int_regs (const struct regcache *regcache, int regno, void *r0_r30, void *pc, void *unique) { - gdb_byte *regs = r0_r30; + gdb_byte *regs = (gdb_byte *) r0_r30; int i; for (i = 0; i < 31; ++i) @@ -1543,7 +1539,7 @@ void alpha_supply_fp_regs (struct regcache *regcache, int regno, const void *f0_f30, const void *fpcr) { - const gdb_byte *regs = f0_f30; + const gdb_byte *regs = (const gdb_byte *) f0_f30; int i; for (i = ALPHA_FP0_REGNUM; i < ALPHA_FP0_REGNUM + 31; ++i) @@ -1559,7 +1555,7 @@ void alpha_fill_fp_regs (const struct regcache *regcache, int regno, void *f0_f30, void *fpcr) { - gdb_byte *regs = f0_f30; + gdb_byte *regs = (gdb_byte *) f0_f30; int i; for (i = ALPHA_FP0_REGNUM; i < ALPHA_FP0_REGNUM + 31; ++i) @@ -1602,9 +1598,9 @@ fp_register_sign_bit (LONGEST reg) the target of the coming instruction and breakpoint it. */ static CORE_ADDR -alpha_next_pc (struct frame_info *frame, CORE_ADDR pc) +alpha_next_pc (struct regcache *regcache, CORE_ADDR pc) { - struct gdbarch *gdbarch = get_frame_arch (frame); + struct gdbarch *gdbarch = get_regcache_arch (regcache); unsigned int insn; unsigned int op; int regno; @@ -1620,7 +1616,7 @@ alpha_next_pc (struct frame_info *frame, CORE_ADDR pc) { /* Jump format: target PC is: RB & ~3 */ - return (get_frame_register_unsigned (frame, (insn >> 16) & 0x1f) & ~3); + return (regcache_raw_get_unsigned (regcache, (insn >> 16) & 0x1f) & ~3); } if ((op & 0x30) == 0x30) @@ -1651,7 +1647,7 @@ alpha_next_pc (struct frame_info *frame, CORE_ADDR pc) regno += gdbarch_fp0_regnum (gdbarch); } - rav = get_frame_register_signed (frame, regno); + rav = regcache_raw_get_signed (regcache, regno); switch (op) { @@ -1722,18 +1718,15 @@ alpha_next_pc (struct frame_info *frame, CORE_ADDR pc) return (pc + ALPHA_INSN_SIZE); } -int -alpha_software_single_step (struct frame_info *frame) +std::vector +alpha_software_single_step (struct regcache *regcache) { - struct gdbarch *gdbarch = get_frame_arch (frame); - struct address_space *aspace = get_frame_address_space (frame); - CORE_ADDR pc, next_pc; + struct gdbarch *gdbarch = get_regcache_arch (regcache); + CORE_ADDR pc; - pc = get_frame_pc (frame); - next_pc = alpha_next_pc (frame, pc); + pc = alpha_next_pc (regcache, regcache_read_pc (regcache)); - insert_single_step_breakpoint (gdbarch, aspace, next_pc); - return 1; + return {pc}; } @@ -1750,20 +1743,12 @@ alpha_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) struct gdbarch_tdep *tdep; struct gdbarch *gdbarch; - /* Try to determine the ABI of the object we are loading. */ - if (info.abfd != NULL && info.osabi == GDB_OSABI_UNKNOWN) - { - /* If it's an ECOFF file, assume it's OSF/1. */ - if (bfd_get_flavour (info.abfd) == bfd_target_ecoff_flavour) - info.osabi = GDB_OSABI_OSF1; - } - /* Find a candidate among extant architectures. */ arches = gdbarch_list_lookup_by_info (arches, &info); if (arches != NULL) return arches->gdbarch; - tdep = xmalloc (sizeof (struct gdbarch_tdep)); + tdep = XNEW (struct gdbarch_tdep); gdbarch = gdbarch_alloc (&info, tdep); /* Lowest text address. This is used by heuristic_proc_start() @@ -1785,6 +1770,8 @@ alpha_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_int_bit (gdbarch, 32); set_gdbarch_long_bit (gdbarch, 64); set_gdbarch_long_long_bit (gdbarch, 64); + set_gdbarch_wchar_bit (gdbarch, 64); + set_gdbarch_wchar_signed (gdbarch, 0); set_gdbarch_float_bit (gdbarch, 32); set_gdbarch_double_bit (gdbarch, 64); set_gdbarch_long_double_bit (gdbarch, 64); @@ -1830,7 +1817,10 @@ alpha_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_inner_than (gdbarch, core_addr_lessthan); set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); - set_gdbarch_breakpoint_from_pc (gdbarch, alpha_breakpoint_from_pc); + set_gdbarch_breakpoint_kind_from_pc (gdbarch, + alpha_breakpoint::kind_from_pc); + set_gdbarch_sw_breakpoint_from_kind (gdbarch, + alpha_breakpoint::bp_from_kind); set_gdbarch_decr_pc_after_break (gdbarch, ALPHA_INSN_SIZE); set_gdbarch_cannot_step_breakpoint (gdbarch, 1); @@ -1866,7 +1856,6 @@ extern initialize_file_ftype _initialize_alpha_tdep; /* -Wmissing-prototypes */ void _initialize_alpha_tdep (void) { - struct cmd_list_element *c; gdbarch_register (bfd_arch_alpha, alpha_gdbarch_init, NULL);