-
Notifications
You must be signed in to change notification settings - Fork 1
/
patch_toolchain.sh
executable file
·66 lines (56 loc) · 2.73 KB
/
patch_toolchain.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/usr/bin/env bash
set -Eeuo pipefail
trap cleanup SIGINT SIGTERM ERR EXIT
script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P)
cleanup() {
trap - SIGINT SIGTERM ERR EXIT
}
setup_colors() {
if [[ -t 2 ]] && [[ -z "${NO_COLOR-}" ]] && [[ "${TERM-}" != "dumb" ]]; then
NOFORMAT='\033[0m' RED='\033[0;31m' GREEN='\033[0;32m' ORANGE='\033[0;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' CYAN='\033[0;36m' YELLOW='\033[1;33m'
else
NOFORMAT='' RED='' GREEN='' ORANGE='' BLUE='' PURPLE='' CYAN='' YELLOW=''
fi
}
die() {
local msg=$1
local code=${2-1} # default exit status 1
msg "$msg"
exit "$code"
}
msg() {
echo >&2 -e "${1-}"
}
setup_colors
# Cloning submodules (toolchain)
msg "${GREEN}> Updating submodules${NOFORMAT}"
git submodule update --init --recursive
# Patching the two necessary files to add:
# - match/masks
# - CSR info
# - instruction declaration
# - actual instr info
msg "${ORANGE}> Patching binutils${NOFORMAT}"
sed -i '/#define RISCV_ENCODING_H/ r patch/opch-match-mask.patch' riscv-gnu-toolchain/binutils/include/opcode/riscv-opc.h
sed -i '/#define CSR_PMPADDR63 0x3ef/ r patch/opch-csr.patch' riscv-gnu-toolchain/binutils/include/opcode/riscv-opc.h
sed -i '/#ifdef DECLARE_INSN/ r patch/opch-insn.patch' riscv-gnu-toolchain/binutils/include/opcode/riscv-opc.h
sed -i '/DECLARE_CSR(pmpaddr63, CSR_PMPADDR63, CSR_CLASS_I, PRIV_SPEC_CLASS_1P12, PRIV_SPEC_CLASS_DRAFT)/ r patch/opch-declare-csr.patch' riscv-gnu-toolchain/binutils/include/opcode/riscv-opc.h
sed -i '/MATCH_SUBW, MASK_SUBW, match_opcode, 0 \},/ r patch/opcc.patch' riscv-gnu-toolchain/binutils/opcodes/riscv-opc.c
# Duplicated for gdb
msg "${ORANGE}> Patching gdb${NOFORMAT}"
sed -i '/#define RISCV_ENCODING_H/ r patch/opch-match-mask.patch' riscv-gnu-toolchain/gdb/include/opcode/riscv-opc.h
sed -i '/#define CSR_PMPADDR63 0x3ef/ r patch/opch-csr.patch' riscv-gnu-toolchain/gdb/include/opcode/riscv-opc.h
sed -i '/#ifdef DECLARE_INSN/ r patch/opch-insn.patch' riscv-gnu-toolchain/gdb/include/opcode/riscv-opc.h
sed -i '/DECLARE_CSR(pmpaddr63, CSR_PMPADDR63, CSR_CLASS_I, PRIV_SPEC_CLASS_1P12, PRIV_SPEC_CLASS_DRAFT)/ r patch/opch-declare-csr.patch' riscv-gnu-toolchain/gdb/include/opcode/riscv-opc.h
sed -i '/MATCH_SUBW, MASK_SUBW, match_opcode, 0 \},/ r patch/opcc.patch' riscv-gnu-toolchain/gdb/opcodes/riscv-opc.c
# Modified toolchain building
msg "${GREEN}> Compiling toolchain${NOFORMAT}"
cd riscv-gnu-toolchain
./configure --prefix=/opt/riscv-newlib-jitdomain-test --enable-multilib
sudo make
msg "${GREEN}> Toolchain patched!!${NOFORMAT}"
# Removing the submodule
msg "${ORANGE}> To remove the toolchain sources run the following:${NOFORMAT}"
msg "> cd .."
msg "> sudo rm -rf riscv-gnu-toolchain/*"
msg "> git submodule deinit -f riscv-gnu-toolchain"