Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

[FYI] LLVM 15でのチャレンジ #7

Closed
ritalin opened this issue Jul 30, 2022 · 6 comments
Closed

[FYI] LLVM 15でのチャレンジ #7

ritalin opened this issue Jul 30, 2022 · 6 comments

Comments

@ritalin
Copy link

ritalin commented Jul 30, 2022

riscv_test.cをビルドしてspikeで走らせるまでを、現時点(2022/7/30)でのLLVMの最新であるLLVM 15で実現できたのでその記録を残しておきます。

環境

  • MacOS(Catalina)下のdocker
    • ベースイメージはubuntu:latest

ビルド環境のイメージを構築する

docker run --name=riscv_dev_container -it ubuntu:latest

# (in container)

apt-get update
apt-get -y dist-upgrade

apt-get install build-essential git -y
# LLVM gnu toolchainのビルドで必要
apt-get install -y autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev

# LLVMのビルドで必要
apt install cmake ninja-build -y

exit

# (in host)

docker commit riscv_dev_container riscv_dev_container 

LLVMのビルド

# コンテナを走らせる
docker run -v $PWD:/work -it riscv_dev_container

cd /work

#LLVM関連ソースを取得する

git clone --recursive --depth 1 https://github.com/riscv/riscv-gnu-toolchain
git clone --depth 1 https://github.com/llvm/llvm-project.git riscv-llvm

# ビルド成果物の展開先

mkdir _tools
export Build=/work/_tools

# Toolchainのビルド
cd riscv-gnu-toolchain
./configure --prefix=`${Build} --enable-multilib
make 

#Clangのビルド

cd iscv-llvm
ln -s ../../clang llvm/tools || true
mkdir _build

cmake \
-B ./_build \
-G Ninja -DCMAKE_BUILD_TYPE="Debug" \
-DLLVM_TARGETS_TO_BUILD="RISCV" \
-DLLVM_DEFAULT_TARGET_TRIPLE="riscv64-unknown-elf" \
-DBUILD_SHARED_LIBS=ON \
-DLLVM_OPTIMIZED_TABLEGEN=ON \
-DLLVM_USE_SPLIT_DWARF=ON \
-DLLVM_BUILD_TESTS=OFF \
-DLLVM_ENABLE_THREADS=OFF \
-DCMAKE_INSTALL_PREFIX="${Build}" \
-DDEFAULT_SYSROOT="${Build}/riscv64-unknown-elf" \
-S ./llvm

ninja -j`nproc` 
  • 現状、上記のconfigurationでビルドすると、runtimesまで進んだ所でビルドエラーになります。
  • ただし、書籍やサポートページのように、clang単独ではなくclang+llc+gccの組み合わせであれば、runtimesなしでも実行できることは確認できました。
# runtimesのビルドがこけるためビルド成果物をマニュアルで移動

ninja \
install-clang \
install-clang-libraries \
install-llvm-libraries \
install-llvm-headers \
install-clang-headers \
install-clang-resource-headers \
install-llc
  • 無駄なものもインストールしているかもしれない・・・

PS

C++何も分からない勢なので、runtimesを外す方法が分からず、そのまま突っ走りましたが、
フォローアップで教えていただければ幸いです。

@ritalin
Copy link
Author

ritalin commented Jul 30, 2022

初めから、

ninja  -j`nproc` install-clang install-llc

すればよかったのか・・・?

でもobjdumpとかのサポートツールも欲しかったから(言い訳)

@ritalin ritalin closed this as completed Jul 30, 2022
@ritalin
Copy link
Author

ritalin commented Jul 30, 2022

ninja  -j`nproc` install-clang

だけだと、clangの共有ライブラリがインストールされん。どうするのが正しい?

追記:
install-clang-cpp install-clang-libraries加えたら共有ライブラリ入りました

@msyksphinz-self
Copy link
Owner

ご連絡ありがとうございます。ご教示いただいた方法でDocker上でこちらでも試行した結果、以下のエラーでストップしました。runtimesのエラーというのはこちらでしょうか?同じエラーが出力されましたでしょうか?

/usr/bin/c++ -DGTEST_HAS_RTTI=0 -D_DEBUG -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/work/riscv-llvm/_build/lib/Debuginfod -I/work/riscv-llvm/llvm/lib/Debuginfod -I/work/riscv-llvm/_build/include -I/work/riscv-llvm/llvm/include -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror=date-time -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wimplicit-fallthrough -Wno-maybe-uninitialized -Wno-class-memaccess -Wno-redundant-move -Wno-pessimizing-move -Wno-noexceginfod -I/work/riscv-llvm/_build/include -I/work/riscv-llvm/llvm/inclupt-type -Wdelete-non-virtual-dtor -Wsuggest-override -Wno-comment -Wmisleading-indentation -fdiagnostics-color -g -fPIC  -fno-exceptions -fno-rtti -gsplit-dwarf -std=c++14 -MD -MT lib/Debuginfod/CMa-long -Wimplicit-fallthrough -Wno-maybe-uninitialized -Wno-class-memackeFiles/LLVMDebuginfod.dir/Debuginfod.cpp.o -MF lib/Debuginfod/CMakeFiles/LLVMDebuginfod.dir/Debuginfod.cpp.o.d -o lib/Debuginfod/CMakeFiles/LLVMDebuginfod.dir/Debuginfod.cpp.o -c /work/riscv-llvm/lo-rtti -gsplit-dwarf -std=c++14 -MD -MT lib/Debuginfod/CMakeFiles/LLVMlvm/lib/Debuginfod/Debuginfod.cpp                                                                                                                                                                     ginfod/Debuginfod.cpp
/work/riscv-llvm/llvm/lib/Debuginfod/Debuginfod.cpp: In member function 'llvm::Error llvm::DebuginfodCollection::updateForever(std::chrono::milliseconds)':
/work/riscv-llvm/llvm/lib/Debuginfod/Debuginfod.cpp:298:23: error: 'sleep_for' is not a member of 'std::this_thread'
  298 |     std::this_thread::sleep_for(Interval);
      |                       ^~~~~~~~~
[1681/3569] Building CXX object lib/DebugInfo/DWARF/CMakeFiles/LLVMDebugInfoDWARF.dir/DWARFAcceleratorTable.cpp.o

いろいろ調べてみると、UBuntuのLatestであるGCC-11と相性が良くなさそうでしたので、GCCをダウングレードして再度ビルドした結果最後まで実行できました。

cmake -B ./_build -G Ninja \
	-DCMAKE_C_COMPILER="gcc-10" \
	-DCMAKE_CXX_COMPILER="g++-10" \
	-DCMAKE_BUILD_TYPE=Debug \
	-DLLVM_TARGETS_TO_BUILD="RISCV" \
	-DLLVM_DEFAULT_TARGET_TRIPLE="riscv64-unknown-elf" \
	-DBUILD_SHARED_LIBS=ON \
	-DLLVM_OPTIMIZED_TABLEGEN=ON \
	-DLLVM_USE_SPLIT_DWARF=ON \
	-DLLVM_BUILD_TESTS=OFF \
	-DLLVM_ENABLE_THREADS=OFF \
	-DCMAKE_INSTALL_PREFIX="${Build}" \
	-DDEFAULT_SYSROOT="${Build}/riscv64-unknown-elf" -S ./llvm

なお、私の環境では途中でエラーメッセージ無しで落ちますが、メモリ不足のようでしたので並列度を減らして再度実行をした結果ビルド環境できるようでした。

@ritalin
Copy link
Author

ritalin commented Aug 1, 2022

はい、そのエラーで落ちていました。
makeであれば、-D_GLIBCXX_USE_NANOSLEEPのオプションで回避できるというのを見かけたのですが、cmakeで同じ指定はできなかったため、Debuginfod.cppにむりくり#include this_thread_sleep.h;加えてエラーの回避を試みるも

最終的に

/work/riscv-llvm/_build/include/c++/v1/__config:911:8: error: "No thread API"
#      error "No thread API"

で落ちたところで、断念しました。

@msyksphinz-self
Copy link
Owner

同じエラーということで了解しました。そうしますと、Ubuntu上でgcc-10を使用して再度試行いただけますでしょうか?

apt install gcc-10
apt install g++-10

でGCC-10をインストールしたうえで、cmakeのオプションに以下を追加してみてください。

	-DCMAKE_C_COMPILER="gcc-10" \
	-DCMAKE_CXX_COMPILER="g++-10" \

@ritalin
Copy link
Author

ritalin commented Aug 2, 2022

手間ではあるが、*.sまでLLVM、そこから先をgccでとすることで先には進めているので、
これでどうにもならないようならgcc-10での環境構築も行ってみたいと思います

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants