Issue |
133446
|
Summary |
[riscv] Incorrect disassembly of c.lui when imm=0
|
Labels |
new issue
|
Assignees |
|
Reporter |
paulhuggett
|
# context:
During disassembly, a binary can contain an invalid instruction and `objdump`
tells that this instruction is unknown.
For example, Bytecode 0x6101 represents instruction `c.addi16sp x2, 0` (where
`c.addi16sp` shares the opcode with `c.lui`, but has a destination field of
`x2`) and `c.addi16sp` is only valid when the immediate is not equal to zero.
If I try to disassemble a binary with Bytecode 0x6101, I get:
```
$ cat disasm.s
.insn 0x6101 # c.addi16sp x2, 0
$ clang -c --target=riscv32 -march=rv32imafdc disasm.s -o disasm.o
$ llvm-objdump -M no-aliases -d disasm.o
disasm.o: file format elf32-littleriscv
Disassembly of section .text:
00000000 <.text>:
0: 6101 <unknown>
```
# description of the problem:
According to RISC-V Instruction Set Manual, instruction `c.lui rd, imm` is only
valid when `rd != {x0, x2}`, and when the immediate is not equal to zero.
As a consequence, the following instruction is invalid:
```
$ cat compile.s
c.lui x1, 0
```
`llvm` verifies this before compilation:
```
$ clang -c --target=riscv32 -march=rv32imafdc compile.s -o compile.o
compile.s:1:11: error: immediate must be in [0xfffe0, 0xfffff] or [1, 31]
c.lui x1, 0
^
```
But, if a binary contains such invalid instruction, `objdump` says that this is
valid:
```
$ cat problem.s
.insn 0x6081 # c.lui x1, 0
$ clang -c --target=riscv32 -march=rv32imafdc problem.s -o problem.o
$ llvm-objdump -M no-aliases -d problem.o
problem.o: file format elf32-littleriscv
Disassembly of section .text:
00000000 <.text>:
0: 6081 c.lui ra, 0x0
```
The problem occurs with the 31 following Bytecodes:
- 0x6001 is disassembled to `c.lui zero, 0x0`
- 0x6081 is disassembled to `c.lui ra, 0x0`
- 0x6181 is disassembled to `c.lui gp, 0x0`
- 0x6201 is disassembled to `c.lui tp, 0x0`
- 0x6281 is disassembled to `c.lui t0, 0x0`
- 0x6301 is disassembled to `c.lui t1, 0x0`
- 0x6381 is disassembled to `c.lui t2, 0x0`
- 0x6401 is disassembled to `c.lui s0, 0x0`
- 0x6481 is disassembled to `c.lui s1, 0x0`
- 0x6501 is disassembled to `c.lui a0, 0x0`
- 0x6581 is disassembled to `c.lui a1, 0x0`
- 0x6601 is disassembled to `c.lui a2, 0x0`
- 0x6681 is disassembled to `c.lui a3, 0x0`
- 0x6701 is disassembled to `c.lui a4, 0x0`
- 0x6781 is disassembled to `c.lui a5, 0x0`
- 0x6801 is disassembled to `c.lui a6, 0x0`
- 0x6881 is disassembled to `c.lui a7, 0x0`
- 0x6901 is disassembled to `c.lui s2, 0x0`
- 0x6981 is disassembled to `c.lui s3, 0x0`
- 0x6a01 is disassembled to `c.lui s4, 0x0`
- 0x6a81 is disassembled to `c.lui s5, 0x0`
- 0x6b01 is disassembled to `c.lui s6, 0x0`
- 0x6b81 is disassembled to `c.lui s7, 0x0`
- 0x6c01 is disassembled to `c.lui s8, 0x0`
- 0x6c81 is disassembled to `c.lui s9, 0x0`
- 0x6d01 is disassembled to `c.lui s10, 0x0`
- 0x6d81 is disassembled to `c.lui s11, 0x0`
- 0x6e01 is disassembled to `c.lui t3, 0x0`
- 0x6e81 is disassembled to `c.lui t4, 0x0`
- 0x6f01 is disassembled to `c.lui t5, 0x0`
- 0x6f81 is disassembled to `c.lui t6, 0x0`
# expected result:
Since these 31 Bytecodes represent invalid instructions, `objdump` should
say that the resulting instructions are unknown.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs