- まず単純に、
$SNIPER_ROOT/riscv/build-riscv.shを実行するとどうなるか。
Setting SNIPER_ROOT to . Header 'bzlib.h' not found in the GCC include paths. Please install 'libbz2-dev / bzip2-devel'. Header 'boost' not found in the GCC include paths. Please install 'Boost'. Header 'sqlite3.h' not found in the GCC include paths. Please install 'libsqlite3-dev / sqlite-devel'. Resolve dependencies and come back!
いろいろ怒られた。これを解決するためには、Dockerなどで必要なコンテナファイルを作っておけばよい。
cd docker make # Ubuntu 22.04 版のDockerイメージがビルドされる
ビルドが完了すると、user-modeでDockerイメージにログインして作業を再開だ。
$ make run docker run --rm -it -v "/home/kimura:/home/kimura" --user 6016:7100 -w "/home/kimura/work/riscv/sniper/snipersim/docker" ubuntu:22.04-sniper-kimura groups: cannot find name for group ID 7100 I have no name!@ccf5be4cd091:/home/kimura/work/riscv/sniper/snipersim/docker$
./riscv/build-riscv.sh Setting SNIPER_ROOT to /home/kimura/work/riscv/sniper/snipersim Please set the PIN_ROOT environment variable to your copy of Pin
次は PIN_ROOTが無いと怒られる。実際にはPINはいらないと思うのだが、とりあえず設定する必要はあるらしい。
IntelのページからPinをダウンロードする: ../snipersim にダウンロードした。
curl -L https://software.intel.com/sites/landingpage/pintool/downloads/pin-3.18-98332-gaebd7b1e6-gcc-linux.tar.gz | tar xvz
export PIN_ROOT=$(realpath ../pin-3.18-98332-gaebd7b1e6-gcc-linux/) I have no name!@b5ce1506619c:/home/kimura/work/riscv/sniper/snipersim$ printenv PIN_ROOT
再び riscv/build-riscv.sh を実行すると、今度はCPU2006のディレクトリが無いと怒られる:これは普通ない気がするので、ダミーのディレクトリを作って対応してみる。
./riscv/build-riscv.sh Setting SNIPER_ROOT to /home/kimura/work/riscv/sniper/snipersim Please set the CPU2006_ROOT environment variable to your installed copy of SPEC CPU2006 v1.2
mkdir ../cpu2006_dummy export CPU2006_ROOT=$(realpath ../cpu2006_dummy/)
再度 riscv/build-riscv.sh を実行すると、今度はツールセットのダウンロードが始まった。こいつはでかそうだ。
./riscv/build-riscv.sh Setting SNIPER_ROOT to /home/kimura/work/riscv/sniper/snipersim Setting up Pin for Sniper... #################################################################################### Setting up riscv-tools... Cloning into 'riscv-tools'... remote: Enumerating objects: 1086, done. remote: Total 1086 (delta 0), reused 0 (delta 0), pack-reused 1086 (from 1) Receiving objects: 100% (1086/1086), 236.14 KiB | 1.72 MiB/s, done. Resolving deltas: 100% (542/542), done. Submodule 'riscv-fesvr' (https://github.com/riscv/riscv-fesvr.git) registered for path 'riscv-fesvr' Submodule 'riscv-gnu-toolchain' (https://github.com/riscv/riscv-gnu-toolchain.git) registered for path 'riscv-gnu-toolchain' Submodule 'riscv-isa-sim' (https://github.com/nus-comparch/riscv-isa-sim.git) registered for path 'riscv-isa-sim' Submodule 'riscv-opcodes' (https://github.com/riscv/riscv-opcodes.git) registered for path 'riscv-opcodes' Submodule 'riscv-openocd' (https://github.com/riscv/riscv-openocd.git) registered for path 'riscv-openocd' Submodule 'riscv-pk' (https://github.com/riscv/riscv-pk.git) registered for path 'riscv-pk' Submodule 'riscv-tests' (https://github.com/riscv/riscv-tests.git) registered for path 'riscv-tests' Cloning into '/home/kimura/work/riscv/sniper/snipersim/riscv/riscv-tools/riscv-fesvr'... Cloning into '/home/kimura/work/riscv/sniper/snipersim/riscv/riscv-tools/riscv-gnu-toolchain'... Cloning into '/home/kimura/work/riscv/sniper/snipersim/riscv/riscv-tools/riscv-isa-sim'... Cloning into '/home/kimura/work/riscv/sniper/snipersim/riscv/riscv-tools/riscv-opcodes'... Cloning into '/home/kimura/work/riscv/sniper/snipersim/riscv/riscv-tools/riscv-openocd'... Cloning into '/home/kimura/work/riscv/sniper/snipersim/riscv/riscv-tools/riscv-pk'... Cloning into '/home/kimura/work/riscv/sniper/snipersim/riscv/riscv-tools/riscv-tests'... Submodule path 'riscv-fesvr': checked out '68c12d06ebbdfe20856b886570822fe66804fd26' Submodule path 'riscv-gnu-toolchain': checked out 'a17086ff0ba63df488a511d20ca42c7953f6eecb' Submodule 'riscv-binutils-gdb' (https://github.com/riscv/riscv-binutils-gdb.git) registered for path 'riscv-gnu-toolchain/riscv-binutils-gdb' Submodule 'riscv-dejagnu' (https://github.com/riscv/riscv-dejagnu.git) registered for path 'riscv-gnu-toolchain/riscv-dejagnu' Submodule 'riscv-gcc' (https://github.com/riscv/riscv-gcc.git) registered for path 'riscv-gnu-toolchain/riscv-gcc' Submodule 'riscv-glibc' (https://github.com/riscv/riscv-glibc.git) registered for path 'riscv-gnu-toolchain/riscv-glibc' Submodule 'riscv-newlib' (https://github.com/riscv/riscv-newlib.git) registered for path 'riscv-gnu-toolchain/riscv-newlib' Submodule 'riscv-qemu' (git://github.com/riscv/riscv-qemu.git) registered for path 'riscv-gnu-toolchain/riscv-qemu' Cloning into '/home/kimura/work/riscv/sniper/snipersim/riscv/riscv-tools/riscv-gnu-toolchain/riscv-binutils-gdb'... Cloning into '/home/kimura/work/riscv/sniper/snipersim/riscv/riscv-tools/riscv-gnu-toolchain/riscv-dejagnu'... Cloning into '/home/kimura/work/riscv/sniper/snipersim/riscv/riscv-tools/riscv-gnu-toolchain/riscv-gcc'... ...
最終的に、コンパイルエラーが出た。
1. 修正部分: riscv_decoder の実装の変更
riscv_decoder の実装の部分だ。
In file included from decoder.cc:4: riscv_decoder.h:195:18: error: 'virtual void dl::RISCVDecodedInst::disassembly_to_str(char*, int) const' marked 'override', but does not override 195 | virtual void disassembly_to_str(char *, int) const override; | ^~~~~~~~~~~~~~~~~~ decoder.cc: In member function 'dl::Decoder* dl::DecoderFactory::CreateDecoder(dl::dl_arch, dl::dl_mode, dl::dl_syntax)': decoder.cc:71:49: error: invalid new-expression of abstract class type 'dl::RISCVDecoder' 71 | return new RISCVDecoder(arch, mode, syntax); | ^ In file included from decoder.cc:4: riscv_decoder.h:89:7: note: because the following virtual functions are pure within 'dl::RISCVDecoder': 89 | class RISCVDecoder : public Decoder | ^~~~~~~~~~~~ In file included from decoder.cc:1: decoder.h:93:18: note: 'virtual bool dl::Decoder::mem_base_upate(const dl::DecodedInst*, unsigned int)' 93 | virtual bool mem_base_upate(const DecodedInst* inst, unsigned int mem_idx) = 0; | ^~~~~~~~~~~~~~ decoder.h:96:18: note: 'virtual bool dl::Decoder::has_index_reg(const dl::DecodedInst*, unsigned int)' 96 | virtual bool has_index_reg (const DecodedInst * inst, unsigned int mem_idx) = 0; | ^~~~~~~~~~~~~
riscv_decoder.h
class RISCVDecodedInst : public DecodedInst { public: RISCVDecodedInst(Decoder* d, const uint8_t * code, size_t size, uint64_t address); riscv::inst_t * get_rv8_inst(); riscv::decode * get_rv8_dec(); void set_rv8_dec(riscv::decode d); /// Get the instruction numerical Id virtual unsigned int inst_num_id() const override; /// Get an string with the disassembled instruction virtual void disassembly_to_str(char *, int) const override;
decoder.h では違う関数の形を求めており、これは合っていない。
class DecodedInst { public: virtual ~DecodedInst(); // dtor -- virtual to be able to destroy polymorphically const bool & get_already_decoded() const; void set_already_decoded(const bool & b); size_t & get_size(); const uint8_t * & get_code(); uint64_t & get_address(); /// Get the instruction numerical Id virtual unsigned int inst_num_id() const = 0; /// Get an string with the disassembled instruction virtual std::string disassembly_to_str() const = 0;
以下のような形で修正した。
diff --git a/decoder_lib/riscv_decoder.cc b/decoder_lib/riscv_decoder.cc index 08f5bea..cd2fd98 100644 --- a/decoder_lib/riscv_decoder.cc +++ b/decoder_lib/riscv_decoder.cc @@ -545,7 +545,7 @@ std::string format_str(const char* fmt, ...) //rv8 src/util/util.cc } /// Get a string with the disassembled instruction -void RISCVDecodedInst::disassembly_to_str(char *str, int len) const +std::string RISCVDecodedInst::disassembly_to_str() const { riscv::decode dec = this->rv8_dec; std::string args; @@ -606,8 +606,7 @@ void RISCVDecodedInst::disassembly_to_str(char *str, int len) const fmt++; } - strncpy(str, args.c_str(), len-1); - str[len-1] = '\0'; + return args; } /// Check if this instruction is a NOP diff --git a/decoder_lib/riscv_decoder.h b/decoder_lib/riscv_decoder.h index 4570c29..6650007 100644 --- a/decoder_lib/riscv_decoder.h +++ b/decoder_lib/riscv_decoder.h @@ -192,7 +192,7 @@ class RISCVDecodedInst : public DecodedInst /// Get the instruction numerical Id virtual unsigned int inst_num_id() const override; /// Get an string with the disassembled instruction - virtual void disassembly_to_str(char *, int) const override; + virtual std::string disassembly_to_str() const override; /// Check if this instruction is a NOP virtual bool is_nop() const override; /// Check if this instruction is atomic
2. 修正部分 riscv-gnu-toolchainのビルドの修正
[SUCCESS]
[CXX ] standalone/exceptions.o
[CXX ] standalone/standalone.o
[LD ] lib/sniper
[CXX ] frontend/pin-frontend/sift/sift_reader.o
[CXX ] frontend/pin-frontend/sift/sift_utils.o
[CXX ] frontend/pin-frontend/sift/sift_writer.o
[CXX ] frontend/pin-frontend/sift/zfstream.o
[LD ] frontend/pin-frontend/sift/libsift.a
[CXX ] frontend/pin-frontend/obj-intel64/globals.o
[CXX ] frontend/pin-frontend/obj-intel64/pin_frontend.o
[CXX ] frontend/pin-frontend/bbv_count.o
[LD ] frontend/pin-frontend/obj-intel64/pin_frontend
####################################################################################
Building riscv-tools...
Building RISC-V Tools with 256 process(es)
Building RV64G toolchain...
Building riscv-gnu-toolchain... (writing output to /home/kimura/work/riscv/sniper/snipersim/riscv/riscv-tools/RV64G/build-log/riscv-gnu-toolchain.log)
ログを確認すると、以下のようなエラーが出力されていた:
mkdir build-binutils-newlib
cd build-binutils-newlib && CC_FOR_TARGET=riscv64-unknown-elf-gcc /home/kimura/work/riscv/sniper/snipersim/riscv/riscv-tools/RV64G/build-gnu-toolchain/../../riscv-gnu-toolchain/riscv-binutils-gdb/configure \
--target=riscv64-unknown-elf \
\
--prefix=/home/kimura/work/riscv/sniper/snipersim/riscv/riscv-tools/RV64G \
\
--disable-werror \
--with-expat=yes \
--enable-gdb
/bin/sh: 1: /home/kimura/work/riscv/sniper/snipersim/riscv/riscv-tools/RV64G/build-gnu-toolchain/../../riscv-gnu-toolchain/riscv-binutils-gdb/configure: not found
riscv-tools を確認すると、 riscv-gnu-toolchain は相当古いものを使っているようだ。 riscv-qemu などのリポジトリが存在しなくなっている。
commit a17086ff0ba63df488a511d20ca42c7953f6eecb (HEAD)
Author: Tim Newsome <tim@sifive.com>
Date: Mon Apr 16 12:34:02 2018 -0700
Actually bump to 2.29 now.
とりあえず、現状の最新版にアップデートしてみるとどうだろう:
$ cd riscv-tools/riscv-gnu-toolchain/ $ git checkout 2025.09.28 $ cd .. $ ./build-sift.sh
これで、 riscv-gnu-toolchain のビルドが可能だ。
最後に、全体をビルドし直して完了となる。riscv-toolsが再ビルドされないように気を付ける。
diff --git a/riscv/build-riscv.sh b/riscv/build-riscv.sh index dd2c57e..1325de5 100755 --- a/riscv/build-riscv.sh +++ b/riscv/build-riscv.sh @@ -60,13 +60,13 @@ cd $SNIPER_ROOT [[ ! -L "pin_kit" && ! -d "pin_kit" ]] && ln -s $PIN_ROOT pin_kit echo "####################################################################################" -# 1b) riscv-tools - includes Spike (that support sift generation) -echo "Setting up riscv-tools..." -URL=https://github.com/nus-comparch/riscv-tools.git -BRANCH=sift -FOLDER=riscv-tools -updateGitRepo "$URL" "$BRANCH" "$FOLDER" -echo "####################################################################################" +# # 1b) riscv-tools - includes Spike (that support sift generation) +# echo "Setting up riscv-tools..." +# URL=https://github.com/nus-comparch/riscv-tools.git +# BRANCH=sift +# FOLDER=riscv-tools +# updateGitRepo "$URL" "$BRANCH" "$FOLDER" +# echo "####################################################################################" # 1c) rv8 simulator (that support sift generation) echo "Setting up rv8 simulator..." @@ -95,16 +95,16 @@ if [ $? -ne 0 ]; then fi echo "####################################################################################" -# 2b) riscv-tools (includes Spike) -echo "Building riscv-tools..." -cd $LOCAL_ROOT/riscv-tools -echo "Building RISC-V Tools with $NPROC process(es)" -./build-sift.sh $NPROC -if [ $? -ne 0 ]; then - echo "Building riscv-tools failed!" - exit 1 -fi -echo "####################################################################################" +# # 2b) riscv-tools (includes Spike) +# echo "Building riscv-tools..." +# cd $LOCAL_ROOT/riscv-tools +# echo "Building RISC-V Tools with $NPROC process(es)" +# ./build-sift.sh $NPROC +# if [ $? -ne 0 ]; then +# echo "Building riscv-tools failed!" +# exit 1 +# fi +# echo "####################################################################################"
これで完了だ。最初のSniperのビルド環境が整った。
しかし、現状のSniperのRISC-V実装ではいろいろと不備があるので、改善していく。