This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH] Pass noaliases_p to aarch64_decode_insn
- From: Yao Qi <qiyaoltc at gmail dot com>
- To: binutils at sourceware dot org
- Date: Tue, 27 Oct 2015 16:35:42 +0000
- Subject: [PATCH] Pass noaliases_p to aarch64_decode_insn
- Authentication-results: sourceware.org; auth=none
Nowadays aarch64_decode_insn is a public interface used by both
opcodes and gdb. However, its behaviour relies on a global variable
no_aliases, which isn't a good practise. On the other hand, In default,
no_aliases is zero, but in GDB, we do want no alias when decoding
instructions for prologue analysis (patches to be posted), so that we
can handle both instructions "add" and "mov" (an alias of "add") as
"add". The code in GDB can be simplified.
This patch adds a new argument in aarch64_decode_insn, and pass no_aliases
to it. In GDB side, always pass 1 to it. Is it OK?
include/opcode:
2015-10-27 Yao Qi <yao.qi@linaro.org>
* aarch64.h (aarch64_decode_insn): Update declaration.
opcodes:
2015-10-27 Yao Qi <yao.qi@linaro.org>
* aarch64-dis.c (aarch64_decode_insn): Add one argument
noaliases_p. Update comments. Pass noaliases_p rather than
no_aliases to aarch64_opcode_decode.
(print_insn_aarch64_word): Pass no_aliases to
aarch64_decode_insn.
gdb:
2015-10-27 Yao Qi <yao.qi@linaro.org>
* aarch64-tdep.c (aarch64_software_single_step): Pass 1 to
aarch64_decode_insn.
---
gdb/aarch64-tdep.c | 4 ++--
include/opcode/aarch64.h | 2 +-
opcodes/aarch64-dis.c | 11 ++++++-----
3 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c
index 55c5fb8..d01a83f 100644
--- a/gdb/aarch64-tdep.c
+++ b/gdb/aarch64-tdep.c
@@ -2499,7 +2499,7 @@ aarch64_software_single_step (struct frame_info *frame)
int last_breakpoint = 0; /* Defaults to 0 (no breakpoints placed). */
aarch64_inst inst;
- if (aarch64_decode_insn (insn, &inst) != 0)
+ if (aarch64_decode_insn (insn, &inst, 1) != 0)
return 0;
/* Look for a Load Exclusive instruction which begins the sequence. */
@@ -2512,7 +2512,7 @@ aarch64_software_single_step (struct frame_info *frame)
insn = read_memory_unsigned_integer (loc, insn_size,
byte_order_for_code);
- if (aarch64_decode_insn (insn, &inst) != 0)
+ if (aarch64_decode_insn (insn, &inst, 1) != 0)
return 0;
/* Check if the instruction is a conditional branch. */
if (inst.opcode->iclass == condbranch)
diff --git a/include/opcode/aarch64.h b/include/opcode/aarch64.h
index c423858..2b3f4c6 100644
--- a/include/opcode/aarch64.h
+++ b/include/opcode/aarch64.h
@@ -930,7 +930,7 @@ extern int
aarch64_zero_register_p (const aarch64_opnd_info *);
extern int
-aarch64_decode_insn (aarch64_insn, aarch64_inst *);
+aarch64_decode_insn (aarch64_insn, aarch64_inst *, int);
/* Given an operand qualifier, return the expected data element size
of a qualified operand. */
diff --git a/opcodes/aarch64-dis.c b/opcodes/aarch64-dis.c
index 9b96cff..af8852d 100644
--- a/opcodes/aarch64-dis.c
+++ b/opcodes/aarch64-dis.c
@@ -2029,11 +2029,12 @@ user_friendly_fixup (aarch64_inst *inst)
}
}
-/* Decode INSN and fill in *INST the instruction information. Return zero
- on success. */
+/* Decode INSN and fill in *INST the instruction information. An alias
+ opcode may be filled in *INSN if NOALIASES_P is 0. Return zero on
+ success. */
int
-aarch64_decode_insn (aarch64_insn insn, aarch64_inst *inst)
+aarch64_decode_insn (aarch64_insn insn, aarch64_inst *inst, int noaliases_p)
{
const aarch64_opcode *opcode = aarch64_opcode_lookup (insn);
@@ -2060,7 +2061,7 @@ aarch64_decode_insn (aarch64_insn insn, aarch64_inst *inst)
{
/* But only one opcode can be decoded successfully for, as the
decoding routine will check the constraint carefully. */
- if (aarch64_opcode_decode (opcode, insn, inst, no_aliases) == 1)
+ if (aarch64_opcode_decode (opcode, insn, inst, noaliases_p) == 1)
return ERR_OK;
opcode = aarch64_find_next_opcode (opcode);
}
@@ -2172,7 +2173,7 @@ print_insn_aarch64_word (bfd_vma pc,
addresses, since the addend is not currently pc-relative. */
pc = 0;
- ret = aarch64_decode_insn (word, &inst);
+ ret = aarch64_decode_insn (word, &inst, no_aliases);
if (((word >> 21) & 0x3ff) == 1)
{
--
1.9.1