*LLVMを利用してCbCコンパイラを開発した時のメモ [#v9d0fb30] **インストール [#m668d5c0] - まず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 (↑でつくったとこ) - configureを実行する。この時、インストール先のディレクトリに移動済みであることを確認すること。 % (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を有効化する。 - makeする % make -j オプションjをつけてうまくいかないときは -jなしで試す。 ※jは並列にビルドするオプション。速度は上がるがときどき上手くいかないことがある。 - インストールされたかチェックする。 % (インストールした場所)/Debug+Asserts/bin/clang -v 正しくインストールされていればバージョンが見れるはず。見れたら適当なコードで正しく動くか確認すること。 ** インストールしないでllvmのバージョンを調べる方法 [#nb7ca6d1] makeすると時間かかるからね。~ % configure -V ** gdbで動かす場合の手順 [#p32acde0] - まず動かすときの引数を得る % (CbC_LLVM) (source file) -### |& grep cc1 これで実際に実行されるコマンドと引数が取れるので引数だけコピーする。 - gdbを動かす % gdb --args (さっきコピーしたものを貼る) これでうごくはず。正しく動かない場合はmakeがちゃんとできているか、configureのオプションを間違えていないかなどを確認する。 ** lldbで動かす場合の手順 [#x868382f] 実行時の引数は一緒なのでgdbで動かす場合のとこ見て。 - lldbを動かす % lldb (clangのパス) - 実行 (lldb) r (コピーしたやつ) ** gdbのちょっとしたテクニック [#vedf8eb2] *** 何度も引っかかるタイプのブレークポイントの最後の一回が見たいとき [#v099a3df] -まずコンテニューかけまくる (gdb) c 9999 -おそらくは9999回もコンテニューせずに実行が終了する。ここでbreak pointの情報を見る (gdb) info b 見たいとこが何回止まったのかを確認する。already hit 〜 とかかかれているはず。 -最後の一回で止まるように仕向ける 通常実行したらさっき見た数字分break pointを通過するということなので、その回数-1回分無視するようにする。 (gdb) ignore (break pointの番号) (さっきの数字-1) これで止まるはず。 **distcleanについて [#w98f7652] LLVMの場合distcleanではなくdist-clean。なのでconfigureからやり直したかったりで綺麗にしたい場合は % make dist-clean 但し間違ってソースファイルと同じ場所に入れちゃった場合はできない。 **clang ASTを見る方法 [#y76a3eca] % clang -cc1 -ast-dump (source file) もしくは % clang -Xclang -ast-dump -c (source file) **最終的に生成されるASTと対応したコードの出力方法 [#p8539cd5] % clang -cc1 -ast-print (source file) 内部でコードを生成したときにそれが実際に上手くいったかどうか確認するときとか使える。 **LLVM IRのアセンブリ表現として出力する方法 [#aa668f44] % clang (source file) -S -emit-llvm **LLVM IRをlliで実行するためのバイナリとして出力する方法 [#h00162d6] % llvm-as (アセンブリ表現のbit code) **Machine Codeを見る方法 [#rf9a0cfc] % llc -print-machineinstrs (LLVM IR file) 標準エラー出力に出力される。 **CbC on LLVM のアップデート方法 [#idf64386] - まず最新版の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 [#b0ec8446] *** ヘッダファイルが見つからないと言われた時(stdio.h file not found 等) [#r0886da9] - command line tools がインストールされてない可能性があるのでインストールする - 以下のようにclangを実行することでclangの見るパスがわかるので確認してみる % clang -print-search-dirs ** homebrewでのインストール方法 [#p5c6039f] % brew tap ie-developers/ie % brew install cbc でcbcがインストールされる。 % brew install cbc --HEAD でRepositoryのHEADがインストールされる. ** llvm 3.8.0 lldb 用tar ball [#kd155f2c] 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 。