mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-24 10:35:12 +08:00
[ARC] Disassemble correctly extension instructions.
For each MAJOR-MINOR opcode tuple, we can have either a 3-operand, or 2-operand, or a single operand instruction format, depending on the values present in i-field, and a-field. The disassembler is reading the section containing the extension instruction format and stores them in a table. Each table element represents a linked list with encodings for a particular MAJOR-MINOR tuple. The current implementation checks only against the first element of the list, hence, the issue. This patch is walking the linked list until empty or finds an opcode match. It also adds a test outlining the found problem. opcodes/ 2016-09-15 Claudiu Zissulescu <claziss@synopsys.com> * arc-dis.c (find_format): Walk the linked list pointed by einsn. gas/ 2016-09-15 Claudiu Zissulescu <claziss@synopsys.com> * testsuite/gas/arc/textinsnxop.d: New file. * testsuite/gas/arc/textinsnxop.s: Likewise.
This commit is contained in:
parent
0a0df90827
commit
f807f43d7e
@ -1,3 +1,8 @@
|
|||||||
|
2016-09-15 Claudiu Zissulescu <claziss@synopsys.com>
|
||||||
|
|
||||||
|
* testsuite/gas/arc/textinsnxop.d: New file.
|
||||||
|
* testsuite/gas/arc/textinsnxop.s: Likewise.
|
||||||
|
|
||||||
2016-09-15 Jose E. Marchesi <jose.marchesi@oracle.com>
|
2016-09-15 Jose E. Marchesi <jose.marchesi@oracle.com>
|
||||||
|
|
||||||
* testsuite/gas/sparc/sparc.exp (gas_64_check): Run
|
* testsuite/gas/sparc/sparc.exp (gas_64_check): Run
|
||||||
|
12
gas/testsuite/gas/arc/textinsnxop.d
Normal file
12
gas/testsuite/gas/arc/textinsnxop.d
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#objdump: -d
|
||||||
|
|
||||||
|
.*: +file format .*arc.*
|
||||||
|
|
||||||
|
|
||||||
|
Disassembly of section .text:
|
||||||
|
|
||||||
|
[0-9a-f]+ <start>:
|
||||||
|
0: 3921 0080 insn1 r0,r1,r2
|
||||||
|
4: 382f 0061 insn2 r0,r1
|
||||||
|
8: 392f 407f insn3 r1
|
||||||
|
c: 396f 403f insn4
|
10
gas/testsuite/gas/arc/textinsnxop.s
Normal file
10
gas/testsuite/gas/arc/textinsnxop.s
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
.extInstruction insn1, 7, 0x21, SUFFIX_NONE, SYNTAX_3OP
|
||||||
|
.extInstruction insn2, 7, 0x21, SUFFIX_NONE, SYNTAX_2OP
|
||||||
|
.extInstruction insn3, 7, 0x21, SUFFIX_NONE, SYNTAX_1OP
|
||||||
|
.extInstruction insn4, 7, 0x21, SUFFIX_NONE, SYNTAX_NOP
|
||||||
|
|
||||||
|
start:
|
||||||
|
insn1 r0,r1,r2
|
||||||
|
insn2 r0,r1
|
||||||
|
insn3 r1
|
||||||
|
insn4
|
@ -1,3 +1,7 @@
|
|||||||
|
2016-09-15 Claudiu Zissulescu <claziss@synopsys.com>
|
||||||
|
|
||||||
|
* arc-dis.c (find_format): Walk the linked list pointed by einsn.
|
||||||
|
|
||||||
2016-09-14 Peter Bergner <bergner@vnet.ibm.com>
|
2016-09-14 Peter Bergner <bergner@vnet.ibm.com>
|
||||||
|
|
||||||
* ppc-opc.c (powerpc_opcodes) <slbiag>: New mnemonic.
|
* ppc-opc.c (powerpc_opcodes) <slbiag>: New mnemonic.
|
||||||
|
@ -477,15 +477,15 @@ find_format (bfd_vma memaddr,
|
|||||||
{
|
{
|
||||||
const struct arc_opcode *opcode = NULL;
|
const struct arc_opcode *opcode = NULL;
|
||||||
bfd_boolean needs_limm;
|
bfd_boolean needs_limm;
|
||||||
const extInstruction_t *einsn;
|
const extInstruction_t *einsn, *i;
|
||||||
|
|
||||||
/* First, try the extension instructions. */
|
/* First, try the extension instructions. */
|
||||||
einsn = arcExtMap_insn (OPCODE (insn[0]), insn[0]);
|
einsn = arcExtMap_insn (OPCODE (insn[0]), insn[0]);
|
||||||
if (einsn != NULL)
|
for (i = einsn; (i != NULL) && (opcode == NULL); i = i->next)
|
||||||
{
|
{
|
||||||
const char *errmsg = NULL;
|
const char *errmsg = NULL;
|
||||||
|
|
||||||
opcode = arcExtMap_genOpcode (einsn, isa_mask, &errmsg);
|
opcode = arcExtMap_genOpcode (i, isa_mask, &errmsg);
|
||||||
if (opcode == NULL)
|
if (opcode == NULL)
|
||||||
{
|
{
|
||||||
(*info->fprintf_func) (info->stream, "\
|
(*info->fprintf_func) (info->stream, "\
|
||||||
|
Loading…
Reference in New Issue
Block a user