以下の内容はhttps://msyksphinz.hatenablog.com/entry/2025/10/14/040000より取得しました。


Snipersim 8.1をRISC-V対応でビルドさせる方法試行

github.com

  1. まず単純に、$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実装ではいろいろと不備があるので、改善していく。




以上の内容はhttps://msyksphinz.hatenablog.com/entry/2025/10/14/040000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14