Mercurial > hg > Document > Growi
view CbC/LLVM.md @ 2:b6c284fd5ae4
backup 2020-12-16
author | autobackup |
---|---|
date | Wed, 16 Dec 2020 15:11:16 +0900 |
parents | e12992dca4a0 |
children |
line wrap: on
line source
# LLVMを利用してCbCコンパイラを開発した時のメモ ## インストール - まずLLVMを取得する。 - [[llvm.org:http://llvm.org]]から純粋なLLVMを取ってくる場合 (この場合clangも) ``` % git clone http://llvm.org/git/llvm.git (保存先。指定しない場合./llvmになる) % cd llvm/tools % git clone http://llvm.org/git/clang.git ``` - 研究室のmercurialからCbCをコンパイルできるよう拡張されたllvmを取ってくる場合 ``` % hg clone ssh://one@www.cr.ie.u-ryukyu.ac.jp/hg/CbC/CbC_llvm (保存先。指定しない場合./CbC_llvmになる) ``` - 次にインストール先のディレクトリを作る。ついでにそこに移動。 (!! 必ずCbC_llvmの外に作ってね! !!) ``` % mkdir (いんすとーるするとこ) % cd (↑でつくったとこ) ``` ## Cmakeを使う方法 詳しくはcross compilerのとこ - cmakeする このときにビルドするディレクトリに移動すること. llvm-project の直下に llvm と clang がある。llvm の下で cmake する。 ``` export CC=/usr/local/llvm/bin/clang export CXX=/usr/local/llvm/bin/clang++ export LLVM_DIR=CbC_llvm export PATH=$PATH:usr/local/llvm/bin %cmake3 -G Ninja -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_INSTALL_PREFIX:PATH=/usr/local/cbclang -DLLVM_ENABLE_PROJECTS=clang;lld" --sysroot=/usr/arm-linux-gnu/sys-root /src/CbC_llvm ``` インストールパスは$PWDで良い - ninja ``` % ninja-build ``` ちなみにubuntuで行う場合はninja-buildでいれないとaptに登録されているninjaが古いという問題がある ## LLVM 10 on macOS 元から入っているclangではcompileできないので、brew install llvm で入れたものを使う。 ``` export CC=/usr/local/llvm/bin/clang export CXX=/usr/local/llvm/bin/clang++ cmake ... .../clang ``` ninja で build すれば良いが MRT.appという macOS のmulware検出システムが暴走してしまう。 ``` sudo launchctl stop com.apple.MRTd ``` で止めてから build する。 ## インストールされたかチェックする。 ``` % (インストールした場所)/Debug+Asserts/bin/clang -v ``` 正しくインストールされていればバージョンが見れるはず。見れたら適当なコードで正しく動くか確認すること。 ## インストールしないでllvmのバージョンを調べる方法 makeすると時間かかるからね。 ``` % configure -V ``` ## gdbで動かす場合の手順 - まず動かすときの引数を得る ``` % (CbC_LLVM) (source file) -### |& grep cc1 ``` これで実際に実行されるコマンドと引数が取れるので引数だけコピーする。 debug buildであれば SEGV した時に再現用のscriptが生成されるので、それを編集して実行して良い。この時に、include の様子をdebugしたければ Original command の方を用いる。 - gdbを動かす ``` % gdb --args (さっきコピーしたものを貼る) ``` これでうごくはず。正しく動かない場合はmakeがちゃんとできているか、configureのオプションを間違えていないかなどを確認する。 ## lldbで動かす場合の手順 実行時の引数は一緒なのでgdbで動かす場合のとこ見て。 - lldbを動かす ``` % lldb (clangのパス) ``` - 実行 ``` (lldb) r (コピーしたやつ) ``` ## gdbのちょっとしたテクニック ### 何度も引っかかるタイプのブレークポイントの最後の一回が見たいとき - まずコンテニューかけまくる ``` (gdb) c 9999 ``` - おそらくは9999回もコンテニューせずに実行が終了する。ここでbreak pointの情報を見る ``` (gdb) info b ``` 見たいとこが何回止まったのかを確認する。already hit 〜 とかかかれているはず。 - 最後の一回で止まるように仕向ける 通常実行したらさっき見た数字分break pointを通過するということなので、その回数-1回分無視するようにする。 ``` (gdb) ignore (break pointの番号) (さっきの数字-1) ``` これで止まるはず。 ## distcleanについて LLVMの場合distcleanではなくdist-clean。なのでconfigureからやり直したかったりで綺麗にしたい場合は ``` % make dist-clean ``` 但し間違ってソースファイルと同じ場所に入れちゃった場合はできない。 ##clang ASTを見る方法 ``` % clang -cc1 -ast-dump (source file) ``` もしくは ``` % clang -Xclang -ast-dump -c (source file) ``` ## 最終的に生成されるASTと対応したコードの出力方法 ``` % clang -cc1 -ast-print (source file) ``` 内部でコードを生成したときにそれが実際に上手くいったかどうか確認するときとか使える。 ## LLVM IRのアセンブリ表現として出力する方法 ``` % clang (source file) -S -emit-llvm ``` ## LLVM IRをlliで実行するためのバイナリとして出力する方法 ``` % llvm-as (アセンブリ表現のbit code) ``` ## Machine Codeを見る方法 ``` % llc -print-machineinstrs (LLVM IR file) ``` 標準エラー出力に出力される。 ## CbC on LLVM のアップデート方法 - まず最新版のLLVM, clangを取得する。 ``` % git clone http://llvm.org/git/llvm.git (保存先。指定しない場合./llvmになる) % cd llvm/tools % git clone http://llvm.org/git/clang.git ``` - 研究室のmercurialにオリジナルのLLVMを置いたリポジトリがあるので、その中身を最新版で置き換える。 ``` % hg clone ssh://one@www.cr.ie.u-ryukyu.ac.jp/hg/CbC/LLVM_original % cd LLVM_original % rm -rf ./* % mv ../llvm/* ./ ``` - リポジトリの状態を確認し、消えてるものは消す、新しく増えたものは登録する。 ``` % hg status % hg remove --after % hg add (新しく増えたファイルで必要なもの。) % hg commit % hg push ``` - タグを付ける。 ``` % hg tag -r (リビジョン番号) "LLVM X.X" ``` - CbC on LLVM の方のディレクトリに移動し、更新作業を行う。 - emacs の場合 ediff-merge を使うと少し楽かも。 ``` % cd ../CbC_LLVM % hg incoming ../LLVM_original % hg pull ../LLVM_original % hg merge ``` - 動くようになったら commit, push して終了。 ``` % hg commit % hg push ``` - cmake ``` % cmake -G Ninja -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_INSTALL_PREFIX:PATH=`pwd` /hg/CbC/LLVM_original ``` ## memo ### ヘッダファイルが見つからないと言われた時(stdio.h file not found 等) - command line tools がインストールされてない可能性があるのでインストールする - 以下のようにclangを実行することでclangの見るパスがわかるので確認してみる ``` % clang -print-search-dirs ``` ## homebrewでのインストール方法 ``` % brew tap ie-developers/ie % brew install cbc ``` でcbcがインストールされる。 ``` % brew install cbc --HEAD ``` でRepositoryのHEADがインストールされる. ## llvm 3.8.0 lldb 用tar ball http://www.cr.ie.u-ryukyu.ac.jp/software/debug/CbCM.tgz lldbがソースを見つけられるようにsymbolic link が必要。 ``` % sudo mkdir -p /Users/kono/src/public % sudo ln -s `pwd`/CbC /Users/kono/src/public % sudo ln -s `pwd`/CbC_llvm /Users/kono/src/public ``` で、 ``` % sudo lldb -- ./Debug+Asserts/bin/clang -cc1 -S hello.c ``` l main で main が表示されれば Ok 。 # 最近のLLVMのビルド - dalmoreでstdlibが古いと文句を付けられる - cmakeの実行時にrpathとLのオプションビルドしたgcc9に指定する ``` $cmake3 -G Ninja -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_INSTALL_PREFIX:PATH=/usr/local/llvm -DLLVM_ENABLE_PROJECTS="clang;libgcc;libcxx;libcxxabi" -DCMAKE_CXX_LINK_FLAGS="-Wl,-rpath,/usr/local/gcc9/lib64 -L$HOME/usr/local/gcc9/lib64" ~/src/LLVM_original/llvm ``` # テクニック ## helpをもっと表示する `../bin/clang --help-hidden |less` ## 実行フェーズを確認する ``` $ ../bin/clang -ccc-print-phases fact-e.c +- 0: input, "fact-e.c", c +- 1: preprocessor, {0}, cpp-output +- 2: compiler, {1}, ir +- 3: backend, {2}, assembler +- 4: assembler, {3}, object 5: linker, {4}, image ``` ## debug-pass ``` ../bin/clang -O -mllvm -debug-pass=Arguments fact-e.c ../bin/clang -O -mllvm -debug-pass=Structure fact-e.c -mllvm -debug-pass=Executions ```