#author(“2018-11-30T05:03:23+00:00”,“game”,“game”)
#
LLVMを利用してCbCコンパイラを開発した時のメモ
#
インストール
1
2
3
|
% git clone http://llvm.org/git/llvm.git (保存先。指定しない場合./llvmになる)
% cd llvm/tools
% git clone http://llvm.org/git/clang.git
|
* 研究室のmercurialからCbCをコンパイルできるよう拡張されたllvmを取ってくる場合
1
|
% hg clone ssh://one@www.cr.ie.u-ryukyu.ac.jp/hg/CbC/CbC_llvm (保存先。指定しない場合./CbC_llvmになる)
|
- 次にインストール先のディレクトリを作る。ついでにそこに移動。 (!! 必ずCbC_llvmの外に作ってね! !!)
1
2
|
% mkdir (いんすとーるするとこ)
% cd (↑でつくったとこ)
|
#
今は古い!!
* configureを実行する。この時、インストール先のディレクトリに移動済みであることを確認すること。
1
2
|
% (llvmとってきた場所)/configure --prefix=$PWD --disable-optimized --enable-debug-runtime\
% --enable-debug-symbols --enable-assertions
|
* 各オプションについて
* --prefix=dir~
インストール先のディレクトリ指定
* –disable-optimized~
最適化無効化
* –enable-debug-symbols~
デバッグ情報を含めてコンパイルする。
* –enable-debug-runtime~
実行時に使用するライブラリのデバッグ情報を含めてコンパイルする。
* –enable-assertions~
assertionを有効化する。
オプションjをつけてうまくいかないときは -jなしで試す。
※jは並列にビルドするオプション。速度は上がるがときどき上手くいかないことがある。
#
Cmakeを使う方法
詳しくはcross compilerのとこ
- cmakeする
このときにビルドするディレクトリに移動すること.
1
|
%cmake3 -G Ninja -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_INSTALL_PREFIX:PATH=/usr/local/cbclang --sysroot=/usr/arm-linux-gnu/sys-root ~/src/CbC_llvm
|
インストールパスは$PWDで良い
ちなみにubuntuで行う場合はninja-buildでいれないとaptに登録されているninjaが古いという問題がある
1
|
% (インストールした場所)/Debug+Asserts/bin/clang -v
|
正しくインストールされていればバージョンが見れるはず。見れたら適当なコードで正しく動くか確認すること。
#
インストールしないでllvmのバージョンを調べる方法
makeすると時間かかるからね。~
#
gdbで動かす場合の手順
1
|
% (CbC_LLVM) (source file) -### |& grep cc1
|
これで実際に実行されるコマンドと引数が取れるので引数だけコピーする。
1
|
% gdb --args (さっきコピーしたものを貼る)
|
これでうごくはず。正しく動かない場合はmakeがちゃんとできているか、configureのオプションを間違えていないかなどを確認する。
#
lldbで動かす場合の手順
実行時の引数は一緒なのでgdbで動かす場合のとこ見て。
#
gdbのちょっとしたテクニック
#
何度も引っかかるタイプのブレークポイントの最後の一回が見たいとき
- おそらくは9999回もコンテニューせずに実行が終了する。ここでbreak pointの情報を見る
見たいとこが何回止まったのかを確認する。already hit 〜 とかかかれているはず。
- 最後の一回で止まるように仕向ける
通常実行したらさっき見た数字分break pointを通過するということなので、その回数-1回分無視するようにする。
1
|
(gdb) ignore (break pointの番号) (さっきの数字-1)
|
これで止まるはず。
#
distcleanについて
LLVMの場合distcleanではなくdist-clean。なのでconfigureからやり直したかったりで綺麗にしたい場合は
但し間違ってソースファイルと同じ場所に入れちゃった場合はできない。
#
clang ASTを見る方法
1
|
% clang -cc1 -ast-dump (source file)
|
もしくは
1
|
% clang -Xclang -ast-dump -c (source file)
|
#
最終的に生成されるASTと対応したコードの出力方法
1
|
% clang -cc1 -ast-print (source file)
|
内部でコードを生成したときにそれが実際に上手くいったかどうか確認するときとか使える。
#
LLVM IRのアセンブリ表現として出力する方法
1
|
% clang (source file) -S -emit-llvm
|
#
LLVM IRをlliで実行するためのバイナリとして出力する方法
1
|
% llvm-as (アセンブリ表現のbit code)
|
#
Machine Codeを見る方法
1
|
% llc -print-machineinstrs (LLVM IR file)
|
標準エラー出力に出力される。
#
CbC on LLVM のアップデート方法
1
2
3
|
% git clone http://llvm.org/git/llvm.git (保存先。指定しない場合./llvmになる)
% cd llvm/tools
% git clone http://llvm.org/git/clang.git
|
- 研究室のmercurialにオリジナルのLLVMを置いたリポジトリがあるので、その中身を最新版で置き換える。
1
2
3
4
|
% hg clone ssh://one@www.cr.ie.u-ryukyu.ac.jp/hg/CbC/LLVM_original
% cd LLVM_original
% rm -rf ./*
% mv ../llvm/* ./
|
- リポジトリの状態を確認し、消えてるものは消す、新しく増えたものは登録する。
1
2
3
4
5
|
% hg status
% hg remove --after
% hg add (新しく増えたファイルで必要なもの。)
% hg commit
% hg push
|
1
|
% hg tag -r (リビジョン番号) "LLVM X.X"
|
- CbC on LLVM の方のディレクトリに移動し、更新作業を行う。
- emacs の場合 ediff-merge を使うと少し楽かも。
1
2
3
4
|
% cd ../CbC_LLVM
% hg incoming ../LLVM_original
% hg pull ../LLVM_original
% hg merge
|
- 動くようになったら commit, push して終了。
1
2
|
% hg commit
% hg push
|
1
|
% 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の見るパスがわかるので確認してみる
1
|
% clang -print-search-dirs
|
#
homebrewでのインストール方法
1
2
|
% brew tap ie-developers/ie
% brew install cbc
|
でcbcがインストールされる。
1
2
|
% 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 が必要。
1
2
3
|
% 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
|
で、
1
|
% sudo lldb -- ./Debug+Asserts/bin/clang -cc1 -S hello.c
|
l main で main が表示されれば Ok 。