README.md
1# How to update RISCV tables.
2
3* Checkout LLVM. Patches are tested on commit `b81d715c`.
4 ```
5 git clone https://github.com/llvm/llvm-project.git
6 git checkout b81d715c
7 ```
8* Apply patches from the current directory.
9* Run tablegen.
10 ```
11 cd $LLVM
12 mkdir build
13 cd build
14 cmake -DCMAKE_CXX_FLAGS=-DCAPSTONE -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD="RISCV" ..
15 make RISCVCommonTableGen
16 ```
17* Copy `.inc` files.
18 ```
19 cp arch/RISCV/RISCVGenInsnNameMaps.inc \
20 arch/RISCV/RISCVGenInsnNameMaps.inc.old
21 for inc in $(cd arch/RISCV && ls *.inc); do
22 cp $LLVM/build/lib/Target/RISCV/$inc arch/RISCV/
23 done
24 ```
25* Fixup `RISCVGenInsnNameMaps.inc`.
26 ```
27 comm -1 -3 \
28 <(grep RISCV_INS_ <arch/RISCV/RISCVGenInsnNameMaps.inc.old \
29 | sort -u) \
30 <(grep RISCV_INS_ <arch/RISCV/RISCVGenInsnNameMaps.inc \
31 | sort -u) \
32 >arch/RISCV/RISCVGenInsnNameMaps.inc.new
33 cat arch/RISCV/RISCVGenInsnNameMaps.inc.old \
34 arch/RISCV/RISCVGenInsnNameMaps.inc.new \
35 >arch/RISCV/RISCVGenInsnNameMaps.inc
36 ```
37* Add new groups, insns, registers and formats.
38 * `include/capstone/RISCV.h`
39 * `enum RISCV_insn`:
40 ```
41 comm -1 -3 \
42 <(perl -ne 'if (/(RISCV_INS_.+),/) { print "\t$1,\n" }' \
43 <include/capstone/RISCV.h | sort -u) \
44 <(perl -ne 'if (/(RISCV_INS_.+),/) { print "\t$1,\n" }' \
45 <arch/RISCV/RISCVMappingInsn.inc | sort -u)
46 ```
47 * `enum RISCV_insn_group`:
48 ```
49 perl -ne 'if (/(\{.RISCV_GRP_.*?\}),/) { print "\t$1,\n"; }' < \
50 arch/RISCV/RISCVMappingInsn.inc | sort -u
51 ```
52 * `arch/RISCV/RISCVDisassembler.c`
53 * `arch/RISCV/RISCVInstPrinter.c`
54 * `arch/RISCV/RISCVMCTargetDesc.c`
55 * `arch/RISCV/RISCVMCTargetDesc.h`
56 * `arch/RISCV/RISCVMapping.c`
57 * `enum group_name_maps`:
58 ```
59 perl -ne 'if (/(RISCV_GRP_(.*?)),/) { print "\t{ $1, \"" . lc($2) . "\" },\n"; }' \
60 arch/RISCV/RISCVMappingInsn.inc | sort -u
61 ```
62