Skip to content

Commit

Permalink
RISC-V: don't disassemble unrecognized insns as .byte
Browse files Browse the repository at this point in the history
Insn width granularity being 16 bits, producing byte granular output
isn't very useful. With there being a way to specific otherwise
unknown insns to the assembler, use that same representation (to be
precise: its <length>,<encoding> flavor) for disassembly.
  • Loading branch information
jbeulich authored and ouuleilei-bot committed Jan 30, 2023
1 parent 8d31d08 commit 144bf37
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 49 deletions.
6 changes: 3 additions & 3 deletions binutils/testsuite/binutils-all/riscv/unknown.d
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
#as: -march=rv32ic
#objdump: -d
# Test the disassembly of unknown instruction encodings, specifically,
# ensure that we generate a .?byte opcode.
# ensure that we generate a .insn directive.

#...
Disassembly of section \.text:

[0-9a-f]+ <\.text>:
[0-9a-f]+: 0052018b \.4byte 0x52018b
[0-9a-f]+: 9c45 \.2byte 0x9c45
[0-9a-f]+: 0052018b \.insn 4, 0x0052018b
[0-9a-f]+: 9c45 \.insn 2, 0x9c45
16 changes: 8 additions & 8 deletions gas/testsuite/gas/riscv/insn-na.d
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,11 @@ Disassembly of section .text:
[^:]+:[ ]+007f 0000 0000 0000 0000[ ]+[._a-z].*
[^:]+:[ ]+0000107f 00000000 00000000[ ]+[._a-z].*
[^:]+:[ ]+607f 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000[ ]+[._a-z].*
[^:]+:[ ]+007f 0000 0000 0000 8000[ ]+\.byte[ ]+0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80
[^:]+:[ ]+007f 0000 0000 0000 8000[ ]+\.byte[ ]+0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80
[^:]+:[ ]+607f 89ab 4567 0123 3210 7654 ba98 fedc 0000 0000 0000[ ]+\.byte[ ]+0x7f, 0x60, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01, 0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
[^:]+:[ ]+607f 89ab 4567 0123 3210 7654 ba98 fedc 0000 0000 0000[ ]+\.byte[ ]+0x7f, 0x60, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01, 0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
[^:]+:[ ]+607f 33cc 55aa cdef 89ab 4567 0123 3210 7654 ba98 00dc[ ]+\.byte[ ]+0x7f, 0x60, 0xcc, 0x33, 0xaa, 0x55, 0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01, 0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0x00
[^:]+:[ ]+607f 33cc 55aa cdef 89ab 4567 0123 3210 7654 ba98 00dc[ ]+\.byte[ ]+0x7f, 0x60, 0xcc, 0x33, 0xaa, 0x55, 0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01, 0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0x00
[^:]+:[ ]+607f 33cc 55aa cdef 89ab 4567 0123 3210 7654 ba98 fedc[ ]+\.byte[ ]+0x7f, 0x60, 0xcc, 0x33, 0xaa, 0x55, 0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01, 0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe
[^:]+:[ ]+607f 33cc 55aa cdef 89ab 4567 0123 3210 7654 ba98 fedc[ ]+\.byte[ ]+0x7f, 0x60, 0xcc, 0x33, 0xaa, 0x55, 0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01, 0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe
[^:]+:[ ]+007f 0000 0000 0000 8000[ ]+\.insn[ ]+10, +0x8000000000000000007f
[^:]+:[ ]+007f 0000 0000 0000 8000[ ]+\.insn[ ]+10, +0x8000000000000000007f
[^:]+:[ ]+607f 89ab 4567 0123 3210 7654 ba98 fedc 0000 0000 0000[ ]+\.insn[ ]+22, 0xfedcba98765432100123456789ab607f
[^:]+:[ ]+607f 89ab 4567 0123 3210 7654 ba98 fedc 0000 0000 0000[ ]+\.insn[ ]+22, 0xfedcba98765432100123456789ab607f
[^:]+:[ ]+607f 33cc 55aa cdef 89ab 4567 0123 3210 7654 ba98 00dc[ ]+\.insn[ ]+22, 0x00dcba98765432100123456789abcdef55aa33cc607f
[^:]+:[ ]+607f 33cc 55aa cdef 89ab 4567 0123 3210 7654 ba98 00dc[ ]+\.insn[ ]+22, 0x00dcba98765432100123456789abcdef55aa33cc607f
[^:]+:[ ]+607f 33cc 55aa cdef 89ab 4567 0123 3210 7654 ba98 fedc[ ]+\.insn[ ]+22, 0xfedcba98765432100123456789abcdef55aa33cc607f
[^:]+:[ ]+607f 33cc 55aa cdef 89ab 4567 0123 3210 7654 ba98 fedc[ ]+\.insn[ ]+22, 0xfedcba98765432100123456789abcdef55aa33cc607f
16 changes: 8 additions & 8 deletions gas/testsuite/gas/riscv/insn.d
Original file line number Diff line number Diff line change
Expand Up @@ -92,25 +92,25 @@ Disassembly of section .text:
[^:]+:[ ]+607f 0000 0000 0000[ ]+[._a-z].*
[^:]+:[ ]+0000 0000 0000 0000 ?
[^:]+:[ ]+0000 0000 0000 ?
[^:]+:[ ]+007f 0000 0000 0000[ ]+\.byte[ ]+0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80
[^:]+:[ ]+007f 0000 0000 0000[ ]+\.insn[ ]+10, +0x8000000000000000007f
[^:]+:[ ]+8000 ?
[^:]+:[ ]+007f 0000 0000 0000[ ]+\.byte[ ]+0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80
[^:]+:[ ]+007f 0000 0000 0000[ ]+\.insn[ ]+10, +0x8000000000000000007f
[^:]+:[ ]+8000 ?
[^:]+:[ ]+607f 89ab 4567 0123[ ]+\.byte[ ]+0x7f, 0x60, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01, 0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
[^:]+:[ ]+607f 89ab 4567 0123[ ]+\.insn[ ]+22, 0xfedcba98765432100123456789ab607f
[^:]+:[ ]+3210 7654 ba98 fedc ?
[^:]+:[ ]+0000 0000 0000 ?
[^:]+:[ ]+607f 89ab 4567 0123[ ]+\.byte[ ]+0x7f, 0x60, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01, 0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
[^:]+:[ ]+607f 89ab 4567 0123[ ]+\.insn[ ]+22, 0xfedcba98765432100123456789ab607f
[^:]+:[ ]+3210 7654 ba98 fedc ?
[^:]+:[ ]+0000 0000 0000 ?
[^:]+:[ ]+607f 33cc 55aa cdef[ ]+\.byte[ ]+0x7f, 0x60, 0xcc, 0x33, 0xaa, 0x55, 0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01, 0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0x00
[^:]+:[ ]+607f 33cc 55aa cdef[ ]+\.insn[ ]+22, 0x00dcba98765432100123456789abcdef55aa33cc607f
[^:]+:[ ]+89ab 4567 0123 3210 ?
[^:]+:[ ]+7654 ba98 00dc ?
[^:]+:[ ]+607f 33cc 55aa cdef[ ]+\.byte[ ]+0x7f, 0x60, 0xcc, 0x33, 0xaa, 0x55, 0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01, 0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0x00
[^:]+:[ ]+607f 33cc 55aa cdef[ ]+\.insn[ ]+22, 0x00dcba98765432100123456789abcdef55aa33cc607f
[^:]+:[ ]+89ab 4567 0123 3210 ?
[^:]+:[ ]+7654 ba98 00dc ?
[^:]+:[ ]+607f 33cc 55aa cdef[ ]+\.byte[ ]+0x7f, 0x60, 0xcc, 0x33, 0xaa, 0x55, 0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01, 0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe
[^:]+:[ ]+607f 33cc 55aa cdef[ ]+\.insn[ ]+22, 0xfedcba98765432100123456789abcdef55aa33cc607f
[^:]+:[ ]+89ab 4567 0123 3210 ?
[^:]+:[ ]+7654 ba98 fedc ?
[^:]+:[ ]+607f 33cc 55aa cdef[ ]+\.byte[ ]+0x7f, 0x60, 0xcc, 0x33, 0xaa, 0x55, 0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01, 0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe
[^:]+:[ ]+607f 33cc 55aa cdef[ ]+\.insn[ ]+22, 0xfedcba98765432100123456789abcdef55aa33cc607f
[^:]+:[ ]+89ab 4567 0123 3210 ?
[^:]+:[ ]+7654 ba98 fedc ?
50 changes: 20 additions & 30 deletions opcodes/riscv-dis.c
Original file line number Diff line number Diff line change
Expand Up @@ -650,7 +650,8 @@ riscv_disassemble_insn (bfd_vma memaddr,
static bool init = false;
static const struct riscv_opcode *riscv_hash[OP_MASK_OP + 1];
struct riscv_private_data *pd;
int insnlen;
int insnlen, i;
bool printed;

#define OP_HASH_IDX(i) ((i) & (riscv_insn_length (i) == 2 ? 0x3 : OP_MASK_OP))

Expand All @@ -666,8 +667,6 @@ riscv_disassemble_insn (bfd_vma memaddr,

if (info->private_data == NULL)
{
int i;

pd = info->private_data = xcalloc (1, sizeof (struct riscv_private_data));
pd->gp = 0;
pd->print_addr = 0;
Expand Down Expand Up @@ -783,37 +782,28 @@ riscv_disassemble_insn (bfd_vma memaddr,
}
}

/* We did not find a match, so just print the instruction bits. */
/* We did not find a match, so just print the instruction bits in
the shape of an assembler .insn directive. */
info->insn_type = dis_noninsn;
switch (insnlen)
(*info->fprintf_styled_func)
(info->stream, dis_style_assembler_directive, ".insn");
(*info->fprintf_styled_func) (info->stream, dis_style_text, "\t");
(*info->fprintf_styled_func) (info->stream, dis_style_immediate,
"%d", insnlen);
(*info->fprintf_styled_func) (info->stream, dis_style_text, ", ");
(*info->fprintf_styled_func) (info->stream, dis_style_immediate, "0x");
for (i = insnlen, printed = false; i >= 2; )
{
case 2:
case 4:
case 8:
(*info->fprintf_styled_func)
(info->stream, dis_style_assembler_directive, ".%dbyte", insnlen);
(*info->fprintf_styled_func) (info->stream, dis_style_text, "\t");
i -= 2;
word = bfd_get_bits (packet + i, 16, false);
if (!word && !printed)
continue;

(*info->fprintf_styled_func) (info->stream, dis_style_immediate,
"0x%llx", (unsigned long long) word);
break;
default:
{
int i;
(*info->fprintf_styled_func)
(info->stream, dis_style_assembler_directive, ".byte");
(*info->fprintf_styled_func) (info->stream, dis_style_text, "\t");
for (i = 0; i < insnlen; ++i)
{
if (i > 0)
(*info->fprintf_styled_func) (info->stream, dis_style_text,
", ");
(*info->fprintf_styled_func) (info->stream, dis_style_immediate,
"0x%02x",
(unsigned int) (*packet++));
}
}
break;
"%04x", (unsigned int) word);
printed = true;
}

return insnlen;
}

Expand Down

0 comments on commit 144bf37

Please sign in to comment.