Skip to content

Commit 4e11f89

Browse files
authored
[RISCV] Basic Objdump Mapping Symbol Support (#151452)
This implements very basic support for RISC-V mapping symbols in llvm-objdump, sharing the implementation with how Arm/AArch64/CSKY implement this feature. This only supports the `$x` (instruction) and `$d` (data) mapping symbols for RISC-V, and not the version of `$x` which includes an architecture string suffix.
1 parent 1e2e903 commit 4e11f89

File tree

8 files changed

+110
-50
lines changed

8 files changed

+110
-50
lines changed

llvm/docs/ReleaseNotes.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@ Changes to the PowerPC Backend
105105
Changes to the RISC-V Backend
106106
-----------------------------
107107

108+
* `llvm-objdump` now has basic support for switching between disassembling code
109+
and data using mapping symbols such as `$x` and `$d`. Switching architectures
110+
using `$x` with an architecture string suffix is not yet supported.
111+
108112
Changes to the WebAssembly Backend
109113
----------------------------------
110114

llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,8 @@ bool RISCVAsmBackend::writeNopData(raw_ostream &OS, uint64_t Count,
471471
Count -= 1;
472472
}
473473

474+
// TODO: emit a mapping symbol right here
475+
474476
if (Count % 4 == 2) {
475477
// The canonical nop with Zca is c.nop.
476478
OS.write(STI->hasFeature(RISCV::FeatureStdExtZca) ? "\x01\0" : "\0\0", 2);
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# RUN: llvm-mc --triple=riscv32-unknown-none-elf %s -filetype=obj -o - \
2+
# RUN: | llvm-objdump -dr - \
3+
# RUN: | FileCheck %s
4+
# RUN: llvm-mc --triple=riscv64-unknown-none-elf %s -filetype=obj -o - \
5+
# RUN: | llvm-objdump -dr - \
6+
# RUN: | FileCheck %s
7+
8+
9+
# CHECK: 00000013 nop
10+
nop
11+
12+
# CHECK-NEXT: 55 55 55 55 .word 0x55555555
13+
.word 0x55555555
14+
15+
# CHECK-NEXT: 00 00 00 00 .word 0x00000000
16+
# CHECK-NEXT: R_RISCV_32 foo
17+
.word foo
18+
19+
# CHECK-NEXT: 00000013 nop
20+
nop

llvm/test/MC/RISCV/large-instructions.s

Lines changed: 0 additions & 29 deletions
This file was deleted.
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# RUN: yaml2obj %s -o %t
2+
# RUN: llvm-objdump -d %t | FileCheck %s
3+
4+
## This CHECKs objdump's handling of wide instruction encodings, and how it
5+
## groups the instruction bytes when disassembling.
6+
##
7+
## This is written in YAML because using `.byte` emits the wrong mapping
8+
## symbols.
9+
10+
--- !ELF
11+
FileHeader:
12+
Class: ELFCLASS32
13+
Data: ELFDATA2LSB
14+
Type: ET_REL
15+
Machine: EM_RISCV
16+
SectionHeaderStringTable: .strtab
17+
Sections:
18+
- Name: .text
19+
Type: SHT_PROGBITS
20+
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
21+
AddressAlign: 0x1
22+
ContentArray: [
23+
# CHECK: 011f 4523 8967 <unknown>
24+
0x1f, 0x01, 0x23, 0x45, 0x67, 0x89,
25+
26+
# CHECK: 4523013f cdab8967 <unknown>
27+
0x3f, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd,
28+
29+
# CHECK: 007f 4523 8967 cdab feef <unknown>
30+
0x7f, 0x00, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe,
31+
32+
# CHECK: 4523107f cdab8967 badcfeef <unknown>
33+
0x7f, 0x10, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba,
34+
35+
# CHECK: 207f 4523 8967 cdab feef badc 7698 <unknown>
36+
0x7f, 0x20, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76,
37+
38+
# CHECK: 4523307f cdab8967 badcfeef 32547698 <unknown>
39+
0x7f, 0x30, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32,
40+
41+
# CHECK: 407f 4523 8967 cdab feef badc 7698 3254 1210 <unknown>
42+
0x7f, 0x40, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 0x12,
43+
44+
# CHECK: 4523507f cdab8967 badcfeef 32547698 56341210 <unknown>
45+
0x7f, 0x50, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 0x12, 0x34, 0x56,
46+
47+
# CHECK: 607f 4523 8967 cdab feef badc 7698 3254 1210 5634 9a78 <unknown>
48+
0x7f, 0x60, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 0x12, 0x34, 0x56, 0x78, 0x9a,
49+
]
50+
51+
- Type: SectionHeaderTable
52+
Sections:
53+
- Name: .strtab
54+
- Name: .symtab
55+
- Name: .text
56+
Symbols:
57+
- Name: "$x"
58+
Section: .text
59+
Value: 0x0
60+
...

llvm/test/MC/RISCV/nop-slide.s

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,15 @@
1010
auipc a0, 0
1111

1212
# CHECK-RVC-NORELAX: 0000000000000000 <.text>:
13-
# CHECK-RVC-NORELAX-NEXT: 0: 0000 unimp
14-
# CHECK-RVC-NORELAX-NEXT: 2: 0001 nop
13+
# CHECK-RVC-NORELAX-NEXT: 0: 00 00 01 00 .word 0x00010000
1514
# CHECK-RVC-NORELAX-NEXT: 4: 00000517 auipc a0, 0x0
1615

1716
# CHECK-RVC-RELAX: 0000000000000000 <.text>:
1817
# CHECK-RVC-RELAX-NEXT: 0: 0001 nop
19-
# CHECK-RVC-RELAX-NEXT: 2: 0100 addi s0, sp, 0x80
20-
# CHECK-RVC-RELAX-NEXT: 4: 1700 addi s0, sp, 0x3a0
21-
# CHECK-RVC-RELAX-NEXT: 6: 0005 c.nop 0x1
22-
# CHECK-RVC-RELAX-NEXT: 8: 00 <unknown>
18+
# CHECK-RVC-RELAX-NEXT: 2: 00 01 .short 0x0100
19+
# CHECK-RVC-RELAX-NEXT: 4: 00 .byte 0x00
20+
# CHECK-RVC-RELAX-NEXT: 5: 00000517 auipc a0, 0x0
2321

2422
# CHECK: 0000000000000000 <.text>:
25-
# CHECK-NEXT: 0: 0000 <unknown>
26-
# CHECK-NEXT: 2: 0000 <unknown>
23+
# CHECK-NEXT: 0: 00 00 00 00 .word 0x00000000
2724
# CHECK-NEXT: 4: 00000517 auipc a0, 0x0

llvm/test/MC/RISCV/rvv/vsetvl-invalid.s

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,37 +4,37 @@
44
# RUN: | llvm-objdump -d --mattr=+v - | FileCheck %s
55

66
# CHECK: vsetvli a1, a0, e64, m1, tu, mu
7-
.word 0x018575d7
7+
.insn 4, 0x018575d7
88

99
# CHECK: vsetvli a1, a0, 0x1c
10-
.word 0x01c575d7
10+
.insn 4, 0x01c575d7
1111

1212
# CHECK: vsetvli a1, a0, 0x24
13-
.word 0x024575d7
13+
.insn 4, 0x024575d7
1414

1515
# CHECK: vsetvli a1, a0, 0x29
16-
.word 0x029575d7
16+
.insn 4, 0x029575d7
1717

1818
# CHECK: vsetvli a1, a0, 0x110
19-
.word 0x110575d7
19+
.insn 4, 0x110575d7
2020

2121
# CHECK: vsetvli a1, a0, e64, mf8, tu, mu
22-
.word 0x01d575d7
22+
.insn 4, 0x01d575d7
2323

2424
# CHECK: vsetivli a1, 0x10, e8, m4, tu, mu
25-
.word 0xc02875d7
25+
.insn 4, 0xc02875d7
2626

2727
# CHECK: vsetivli a1, 0x10, 0xc
28-
.word 0xc0c875d7
28+
.insn 4, 0xc0c875d7
2929

3030
# CHECK: vsetivli a1, 0x10, 0x14
31-
.word 0xc14875d7
31+
.insn 4, 0xc14875d7
3232

3333
# CHECK: vsetivli a1, 0x10, 0x38
34-
.word 0xc38875d7
34+
.insn 4, 0xc38875d7
3535

3636
# CHECK: vsetivli a1, 0x10, 0x103
37-
.word 0xd03875d7
37+
.insn 4, 0xd03875d7
3838

3939
# CHECK: vsetivli a1, 0x10, e8, mf4, tu, mu
40-
.word 0xc06875d7
40+
.insn 4, 0xc06875d7

llvm/tools/llvm-objdump/llvm-objdump.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -636,8 +636,14 @@ static bool isCSKYElf(const ObjectFile &Obj) {
636636
return Elf && Elf->getEMachine() == ELF::EM_CSKY;
637637
}
638638

639+
static bool isRISCVElf(const ObjectFile &Obj) {
640+
const auto *Elf = dyn_cast<ELFObjectFileBase>(&Obj);
641+
return Elf && Elf->getEMachine() == ELF::EM_RISCV;
642+
}
643+
639644
static bool hasMappingSymbols(const ObjectFile &Obj) {
640-
return isArmElf(Obj) || isAArch64Elf(Obj) || isCSKYElf(Obj);
645+
return isArmElf(Obj) || isAArch64Elf(Obj) || isCSKYElf(Obj) ||
646+
isRISCVElf(Obj);
641647
}
642648

643649
static void printRelocation(formatted_raw_ostream &OS, StringRef FileName,

0 commit comments

Comments
 (0)