projects
/
deliverable
/
binutils-gdb.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Correct disassembly of dot product instructions.
[deliverable/binutils-gdb.git]
/
gdb
/
alpha-tdep.c
diff --git
a/gdb/alpha-tdep.c
b/gdb/alpha-tdep.c
index 80f5098f934ea7b9b6463c4cde98ad0ab12ea848..07144ceb4e76763e697df37ca737f3d4b5b6a801 100644
(file)
--- 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.
/* Target-dependent code for the ALPHA architecture, for GDB, the GNU Debugger.
- Copyright (C) 1993-20
03, 2005-2012
Free Software Foundation, Inc.
+ Copyright (C) 1993-20
17
Free Software Foundation, Inc.
This file is part of GDB.
This file is part of GDB.
@@
-18,7
+18,6
@@
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
-#include "doublest.h"
#include "frame.h"
#include "frame-unwind.h"
#include "frame-base.h"
#include "frame.h"
#include "frame-unwind.h"
#include "frame-base.h"
@@
-31,7
+30,6
@@
#include "dis-asm.h"
#include "symfile.h"
#include "objfiles.h"
#include "dis-asm.h"
#include "symfile.h"
#include "objfiles.h"
-#include "gdb_string.h"
#include "linespec.h"
#include "regcache.h"
#include "reggroups.h"
#include "linespec.h"
#include "regcache.h"
#include "reggroups.h"
@@
-44,6
+42,7
@@
#include "elf-bfd.h"
#include "alpha-tdep.h"
#include "elf-bfd.h"
#include "alpha-tdep.h"
+#include <algorithm>
/* Instruction decoding. The notations for registers, immediates and
opcodes are the same as the one used in Compaq's Alpha architecture
/* Instruction decoding. The notations for registers, immediates and
opcodes are the same as the one used in Compaq's Alpha architecture
@@
-186,7
+185,8
@@
static void
alpha_lds (struct gdbarch *gdbarch, void *out, const void *in)
{
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
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;
ULONGEST frac = (mem >> 0) & 0x7fffff;
ULONGEST sign = (mem >> 31) & 1;
ULONGEST exp_msb = (mem >> 30) & 1;
@@
-206,7
+206,7
@@
alpha_lds (struct gdbarch *gdbarch, void *out, const void *in)
}
reg = (sign << 63) | (exp << 52) | (frac << 29);
}
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
}
/* Similarly, this represents exactly the conversion performed by
@@
-218,15
+218,15
@@
alpha_sts (struct gdbarch *gdbarch, void *out, const void *in)
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
ULONGEST reg, mem;
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);
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
register is a floating point register and memory format is float, as the
register format must be double or memory format is an integer with 4
}
/* The alpha needs a conversion between register and memory format if the
register is a floating point register and memory format is float, as the
register format must be double or memory format is an integer with 4
- bytes
or less
, as the representation of integers in floating point
+ bytes, as the representation of integers in floating point
registers is different. */
static int
registers is different. */
static int
@@
-234,7
+234,7
@@
alpha_convert_register_p (struct gdbarch *gdbarch, int regno,
struct type *type)
{
return (regno >= ALPHA_FP0_REGNUM && regno < ALPHA_FP0_REGNUM + 31
struct type *type)
{
return (regno >= ALPHA_FP0_REGNUM && regno < ALPHA_FP0_REGNUM + 31
- && TYPE_LENGTH (type)
!= 8
);
+ && TYPE_LENGTH (type)
== 4
);
}
static int
}
static int
@@
-243,38
+243,40
@@
alpha_register_to_value (struct frame_info *frame, int regnum,
int *optimizedp, int *unavailablep)
{
struct gdbarch *gdbarch = get_frame_arch (frame);
int *optimizedp, int *unavailablep)
{
struct gdbarch *gdbarch = get_frame_arch (frame);
-
gdb_byte in[MAX_REGISTER_SIZE]
;
+
struct value *value = get_frame_register_value (frame, regnum)
;
- /* Convert to TYPE. */
- if (!get_frame_register_bytes (frame, regnum, 0,
- register_size (gdbarch, regnum),
- in, optimizedp, unavailablep))
- return 0;
+ gdb_assert (value != NULL);
+ *optimizedp = value_optimized_out (value);
+ *unavailablep = !value_entirely_available (value);
- if (
TYPE_LENGTH (valtype) == 4
)
+ if (
*optimizedp || *unavailablep
)
{
{
-
alpha_sts (gdbarch, out, in
);
-
*optimizedp = *unavailablep = 0
;
- return
1
;
+
release_value (value
);
+
value_free (value)
;
+ return
0
;
}
}
- error (_("Cannot retrieve value from floating point register"));
+ /* Convert to VALTYPE. */
+
+ gdb_assert (TYPE_LENGTH (valtype) == 4);
+ alpha_sts (gdbarch, out, value_contents_all (value));
+
+ release_value (value);
+ value_free (value);
+ return 1;
}
static void
alpha_value_to_register (struct frame_info *frame, int regnum,
struct type *valtype, const gdb_byte *in)
{
}
static void
alpha_value_to_register (struct frame_info *frame, int regnum,
struct type *valtype, const gdb_byte *in)
{
- gdb_byte out[MAX_REGISTER_SIZE];
+ gdb_byte out[ALPHA_REGISTER_SIZE];
+
+ gdb_assert (TYPE_LENGTH (valtype) == 4);
+ gdb_assert (register_size (get_frame_arch (frame), regnum)
+ <= ALPHA_REGISTER_SIZE);
+ alpha_lds (get_frame_arch (frame), out, in);
- switch (TYPE_LENGTH (valtype))
- {
- case 4:
- alpha_lds (get_frame_arch (frame), out, in);
- break;
- default:
- error (_("Cannot store value in floating point register"));
- }
put_frame_register (frame, regnum, out);
}
put_frame_register (frame, regnum, out);
}
@@
-306,8
+308,7
@@
alpha_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
int len;
int offset;
};
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;
struct alpha_arg *m_arg;
gdb_byte arg_reg_buffer[ALPHA_REGISTER_SIZE * ALPHA_NUM_ARG_REGS];
int required_arg_regs;
@@
-473,16
+474,15
@@
static void
alpha_extract_return_value (struct type *valtype, struct regcache *regcache,
gdb_byte *valbuf)
{
alpha_extract_return_value (struct type *valtype, struct regcache *regcache,
gdb_byte *valbuf)
{
- struct gdbarch *gdbarch =
get_regcache_arch (regcache
);
+ struct gdbarch *gdbarch =
regcache->arch (
);
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
- int length = TYPE_LENGTH (valtype);
gdb_byte raw_buffer[ALPHA_REGISTER_SIZE];
ULONGEST l;
switch (TYPE_CODE (valtype))
{
case TYPE_CODE_FLT:
gdb_byte raw_buffer[ALPHA_REGISTER_SIZE];
ULONGEST l;
switch (TYPE_CODE (valtype))
{
case TYPE_CODE_FLT:
- switch (
length
)
+ switch (
TYPE_LENGTH (valtype)
)
{
case 4:
regcache_cooked_read (regcache, ALPHA_FP0_REGNUM, raw_buffer);
{
case 4:
regcache_cooked_read (regcache, ALPHA_FP0_REGNUM, raw_buffer);
@@
-505,7
+505,7
@@
alpha_extract_return_value (struct type *valtype, struct regcache *regcache,
break;
case TYPE_CODE_COMPLEX:
break;
case TYPE_CODE_COMPLEX:
- switch (
length
)
+ switch (
TYPE_LENGTH (valtype)
)
{
case 8:
/* ??? This isn't correct wrt the ABI, but it's what GCC does. */
{
case 8:
/* ??? This isn't correct wrt the ABI, but it's what GCC does. */
@@
-518,7
+518,7
@@
alpha_extract_return_value (struct type *valtype, struct regcache *regcache,
break;
case 32:
break;
case 32:
- regcache_cooked_read_signed (regcache, ALPHA_V0_REGNUM, &l);
+ regcache_cooked_read_
un
signed (regcache, ALPHA_V0_REGNUM, &l);
read_memory (l, valbuf, 32);
break;
read_memory (l, valbuf, 32);
break;
@@
-531,7
+531,7
@@
alpha_extract_return_value (struct type *valtype, struct regcache *regcache,
default:
/* Assume everything else degenerates to an integer. */
regcache_cooked_read_unsigned (regcache, ALPHA_V0_REGNUM, &l);
default:
/* Assume everything else degenerates to an integer. */
regcache_cooked_read_unsigned (regcache, ALPHA_V0_REGNUM, &l);
- store_unsigned_integer (valbuf,
length
, byte_order, l);
+ store_unsigned_integer (valbuf,
TYPE_LENGTH (valtype)
, byte_order, l);
break;
}
}
break;
}
}
@@
-543,15
+543,14
@@
static void
alpha_store_return_value (struct type *valtype, struct regcache *regcache,
const gdb_byte *valbuf)
{
alpha_store_return_value (struct type *valtype, struct regcache *regcache,
const gdb_byte *valbuf)
{
- struct gdbarch *gdbarch = get_regcache_arch (regcache);
- int length = TYPE_LENGTH (valtype);
+ struct gdbarch *gdbarch = regcache->arch ();
gdb_byte raw_buffer[ALPHA_REGISTER_SIZE];
ULONGEST l;
switch (TYPE_CODE (valtype))
{
case TYPE_CODE_FLT:
gdb_byte raw_buffer[ALPHA_REGISTER_SIZE];
ULONGEST l;
switch (TYPE_CODE (valtype))
{
case TYPE_CODE_FLT:
- switch (
length
)
+ switch (
TYPE_LENGTH (valtype)
)
{
case 4:
alpha_lds (gdbarch, raw_buffer, valbuf);
{
case 4:
alpha_lds (gdbarch, raw_buffer, valbuf);
@@
-575,7
+574,7
@@
alpha_store_return_value (struct type *valtype, struct regcache *regcache,
break;
case TYPE_CODE_COMPLEX:
break;
case TYPE_CODE_COMPLEX:
- switch (
length
)
+ switch (
TYPE_LENGTH (valtype)
)
{
case 8:
/* ??? This isn't correct wrt the ABI, but it's what GCC does. */
{
case 8:
/* ??? This isn't correct wrt the ABI, but it's what GCC does. */
@@
-603,7
+602,7
@@
alpha_store_return_value (struct type *valtype, struct regcache *regcache,
/* Assume everything else degenerates to an integer. */
/* 32-bit values must be sign-extended to 64 bits
even if the base data type is unsigned. */
/* Assume everything else degenerates to an integer. */
/* 32-bit values must be sign-extended to 64 bits
even if the base data type is unsigned. */
- if (
length
== 4)
+ if (
TYPE_LENGTH (valtype)
== 4)
valtype = builtin_type (gdbarch)->builtin_int32;
l = unpack_long (valtype, valbuf);
regcache_cooked_write_unsigned (regcache, ALPHA_V0_REGNUM, l);
valtype = builtin_type (gdbarch)->builtin_int32;
l = unpack_long (valtype, valbuf);
regcache_cooked_write_unsigned (regcache, ALPHA_V0_REGNUM, l);
@@
-612,7
+611,7
@@
alpha_store_return_value (struct type *valtype, struct regcache *regcache,
}
static enum return_value_convention
}
static enum return_value_convention
-alpha_return_value (struct gdbarch *gdbarch, struct
type *func_type
,
+alpha_return_value (struct gdbarch *gdbarch, struct
value *function
,
struct type *type, struct regcache *regcache,
gdb_byte *readbuf, const gdb_byte *writebuf)
{
struct type *type, struct regcache *regcache,
gdb_byte *readbuf, const gdb_byte *writebuf)
{
@@
-647,14
+646,10
@@
alpha_return_in_memory_always (struct type *type)
return 1;
}
\f
return 1;
}
\f
-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;
\f
/* This returns the PC of the first insn after the prologue.
\f
/* This returns the PC of the first insn after the prologue.
@@
-685,11
+680,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];
{
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
gdb_byte buf[ALPHA_INSN_SIZE];
- int
statu
s;
+ int
re
s;
-
statu
s = target_read_memory (pc, buf, sizeof (buf));
- if (
status
)
- memory_error (
status
, pc);
+
re
s = 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);
}
return extract_unsigned_integer (buf, sizeof (buf), byte_order);
}
@@
-724,7
+719,7
@@
alpha_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
post_prologue_pc = alpha_after_prologue (pc);
if (post_prologue_pc != 0)
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. */
/* Can't determine prologue from the symbol table, need to examine
instructions. */
@@
-771,12
+766,9
@@
static const int stq_c_opcode = 0x2f;
is found, attempt to step through it. A breakpoint is placed at the end of
the sequence. */
is found, attempt to step through it. A breakpoint is placed at the end of
the sequence. */
-int
-alpha_deal_with_atomic_sequence (struct
frame_info *frame
)
+static std::vector<CORE_ADDR>
+alpha_deal_with_atomic_sequence (struct
gdbarch *gdbarch, CORE_ADDR pc
)
{
{
- struct gdbarch *gdbarch = get_frame_arch (frame);
- struct address_space *aspace = get_frame_address_space (frame);
- CORE_ADDR pc = get_frame_pc (frame);
CORE_ADDR breaks[2] = {-1, -1};
CORE_ADDR loc = pc;
CORE_ADDR closing_insn; /* Instruction that closes the atomic sequence. */
CORE_ADDR breaks[2] = {-1, -1};
CORE_ADDR loc = pc;
CORE_ADDR closing_insn; /* Instruction that closes the atomic sequence. */
@@
-790,7
+782,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)
/* 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. */
/* Assume that no atomic sequence is longer than "atomic_sequence_length"
instructions. */
@@
-809,8
+801,8
@@
alpha_deal_with_atomic_sequence (struct frame_info *frame)
immediate = (immediate ^ 0x400000) - 0x400000;
if (bc_insn_count >= 1)
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;
breaks[1] = loc + ALPHA_INSN_SIZE + immediate;
@@
-826,7
+818,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)
/* 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;
closing_insn = loc;
loc += ALPHA_INSN_SIZE;
@@
-841,11
+833,12
@@
alpha_deal_with_atomic_sequence (struct frame_info *frame)
|| (breaks[1] >= pc && breaks[1] <= closing_insn)))
last_breakpoint = 0;
|| (breaks[1] >= pc && breaks[1] <= closing_insn)))
last_breakpoint = 0;
- /* Effectively inserts the breakpoints. */
+ std::vector<CORE_ADDR> next_pcs;
+
for (index = 0; index <= last_breakpoint; index++)
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
;
}
\f
}
\f
@@
-893,7
+886,7
@@
alpha_sigtramp_frame_unwind_cache (struct frame_info *this_frame,
struct gdbarch_tdep *tdep;
if (*this_prologue_cache)
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;
info = FRAME_OBSTACK_ZALLOC (struct alpha_sigtramp_unwind_cache);
*this_prologue_cache = info;
@@
-1034,7
+1027,7
@@
static const struct frame_unwind alpha_sigtramp_frame_unwind = {
/* Heuristic_proc_start may hunt through the text section for a long
time across a 2400 baud serial line. Allows the user to limit this
search. */
/* Heuristic_proc_start may hunt through the text section for a long
time across a 2400 baud serial line. Allows the user to limit this
search. */
-static
unsigned
int heuristic_fence_post = 0;
+static int heuristic_fence_post = 0;
/* Attempt to locate the start of the function containing PC. We assume that
the previous function ends with an about_to_return insn. Not foolproof by
/* Attempt to locate the start of the function containing PC. We assume that
the previous function ends with an about_to_return insn. Not foolproof by
@@
-1061,7
+1054,7
@@
alpha_heuristic_proc_start (struct gdbarch *gdbarch, CORE_ADDR pc)
if (func)
return func;
if (func)
return func;
- if (heuristic_fence_post ==
UINT_MAX
+ if (heuristic_fence_post ==
-1
|| fence < tdep->vm_min_address)
fence = tdep->vm_min_address;
|| fence < tdep->vm_min_address)
fence = tdep->vm_min_address;
@@
-1243,7
+1236,7
@@
alpha_heuristic_frame_unwind_cache (struct frame_info *this_frame,
int frame_reg, frame_size, return_reg, reg;
if (*this_prologue_cache)
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;
info = FRAME_OBSTACK_ZALLOC (struct alpha_heuristic_unwind_cache);
*this_prologue_cache = info;
@@
-1466,7
+1459,8
@@
static const struct frame_base alpha_heuristic_frame_base = {
callable as an sfunc. Used by the "set heuristic-fence-post" command. */
static void
callable as an sfunc. Used by the "set heuristic-fence-post" command. */
static void
-reinit_frame_cache_sfunc (char *args, int from_tty, struct cmd_list_element *c)
+reinit_frame_cache_sfunc (const char *args,
+ int from_tty, struct cmd_list_element *c)
{
reinit_frame_cache ();
}
{
reinit_frame_cache ();
}
@@
-1502,7
+1496,7
@@
void
alpha_supply_int_regs (struct regcache *regcache, int regno,
const void *r0_r30, const void *pc, const void *unique)
{
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)
int i;
for (i = 0; i < 31; ++i)
@@
-1527,7
+1521,7
@@
void
alpha_fill_int_regs (const struct regcache *regcache,
int regno, void *r0_r30, void *pc, void *unique)
{
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)
int i;
for (i = 0; i < 31; ++i)
@@
-1545,7
+1539,7
@@
void
alpha_supply_fp_regs (struct regcache *regcache, int regno,
const void *f0_f30, const void *fpcr)
{
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)
int i;
for (i = ALPHA_FP0_REGNUM; i < ALPHA_FP0_REGNUM + 31; ++i)
@@
-1561,7
+1555,7
@@
void
alpha_fill_fp_regs (const struct regcache *regcache,
int regno, void *f0_f30, void *fpcr)
{
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)
int i;
for (i = ALPHA_FP0_REGNUM; i < ALPHA_FP0_REGNUM + 31; ++i)
@@
-1604,9
+1598,9
@@
fp_register_sign_bit (LONGEST reg)
the target of the coming instruction and breakpoint it. */
static CORE_ADDR
the target of the coming instruction and breakpoint it. */
static CORE_ADDR
-alpha_next_pc (struct
frame_info *fram
e, CORE_ADDR pc)
+alpha_next_pc (struct
regcache *regcach
e, CORE_ADDR pc)
{
{
- struct gdbarch *gdbarch =
get_frame_arch (frame
);
+ struct gdbarch *gdbarch =
regcache->arch (
);
unsigned int insn;
unsigned int op;
int regno;
unsigned int insn;
unsigned int op;
int regno;
@@
-1622,7
+1616,7
@@
alpha_next_pc (struct frame_info *frame, CORE_ADDR pc)
{
/* Jump format: target PC is:
RB & ~3 */
{
/* Jump format: target PC is:
RB & ~3 */
- return (
get_frame_register_unsigned (fram
e, (insn >> 16) & 0x1f) & ~3);
+ return (
regcache_raw_get_unsigned (regcach
e, (insn >> 16) & 0x1f) & ~3);
}
if ((op & 0x30) == 0x30)
}
if ((op & 0x30) == 0x30)
@@
-1653,7
+1647,7
@@
alpha_next_pc (struct frame_info *frame, CORE_ADDR pc)
regno += gdbarch_fp0_regnum (gdbarch);
}
regno += gdbarch_fp0_regnum (gdbarch);
}
- rav =
get_frame_register_signed (fram
e, regno);
+ rav =
regcache_raw_get_signed (regcach
e, regno);
switch (op)
{
switch (op)
{
@@
-1724,18
+1718,20
@@
alpha_next_pc (struct frame_info *frame, CORE_ADDR pc)
return (pc + ALPHA_INSN_SIZE);
}
return (pc + ALPHA_INSN_SIZE);
}
-int
-alpha_software_single_step (struct
frame_info *fram
e)
+std::vector<CORE_ADDR>
+alpha_software_single_step (struct
regcache *regcach
e)
{
{
- struct gdbarch *gdbarch = get_frame_arch (frame);
- struct address_space *aspace = get_frame_address_space (frame);
- CORE_ADDR pc, next_pc;
+ struct gdbarch *gdbarch = regcache->arch ();
- pc = get_frame_pc (frame);
- next_pc = alpha_next_pc (frame, pc);
+ CORE_ADDR pc = regcache_read_pc (regcache);
- insert_single_step_breakpoint (gdbarch, aspace, next_pc);
- return 1;
+ std::vector<CORE_ADDR> next_pcs
+ = alpha_deal_with_atomic_sequence (gdbarch, pc);
+ if (!next_pcs.empty ())
+ return next_pcs;
+
+ CORE_ADDR next_pc = alpha_next_pc (regcache, pc);
+ return {next_pc};
}
\f
}
\f
@@
-1752,20
+1748,12
@@
alpha_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
struct gdbarch_tdep *tdep;
struct gdbarch *gdbarch;
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;
/* 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 =
XCNEW (struct gdbarch_tdep
);
gdbarch = gdbarch_alloc (&info, tdep);
/* Lowest text address. This is used by heuristic_proc_start()
gdbarch = gdbarch_alloc (&info, tdep);
/* Lowest text address. This is used by heuristic_proc_start()
@@
-1787,6
+1775,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_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);
set_gdbarch_float_bit (gdbarch, 32);
set_gdbarch_double_bit (gdbarch, 64);
set_gdbarch_long_double_bit (gdbarch, 64);
@@
-1813,9
+1803,6
@@
alpha_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Prologue heuristics. */
set_gdbarch_skip_prologue (gdbarch, alpha_skip_prologue);
/* Prologue heuristics. */
set_gdbarch_skip_prologue (gdbarch, alpha_skip_prologue);
- /* Disassembler. */
- set_gdbarch_print_insn (gdbarch, print_insn_alpha);
-
/* Call info. */
set_gdbarch_return_value (gdbarch, alpha_return_value);
/* Call info. */
set_gdbarch_return_value (gdbarch, alpha_return_value);
@@
-1832,12
+1819,15
@@
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_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);
/* Handles single stepping of atomic sequences. */
set_gdbarch_decr_pc_after_break (gdbarch, ALPHA_INSN_SIZE);
set_gdbarch_cannot_step_breakpoint (gdbarch, 1);
/* Handles single stepping of atomic sequences. */
- set_gdbarch_software_single_step (gdbarch, alpha_
deal_with_atomic_sequence
);
+ set_gdbarch_software_single_step (gdbarch, alpha_
software_single_step
);
/* Hook in ABI-specific overrides, if they have been registered. */
gdbarch_init_osabi (info, gdbarch);
/* Hook in ABI-specific overrides, if they have been registered. */
gdbarch_init_osabi (info, gdbarch);
@@
-1863,12
+1853,9
@@
alpha_dwarf2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
frame_base_append_sniffer (gdbarch, dwarf2_frame_base_sniffer);
}
frame_base_append_sniffer (gdbarch, dwarf2_frame_base_sniffer);
}
-extern initialize_file_ftype _initialize_alpha_tdep; /* -Wmissing-prototypes */
-
void
_initialize_alpha_tdep (void)
{
void
_initialize_alpha_tdep (void)
{
- struct cmd_list_element *c;
gdbarch_register (bfd_arch_alpha, alpha_gdbarch_init, NULL);
gdbarch_register (bfd_arch_alpha, alpha_gdbarch_init, NULL);
This page took
0.033568 seconds
and
4
git commands to generate.