モノトーンの伝説日記

Apex Legends, Splatoon, Programming, and so on...

clang/llvm 触れてみた (Linux/Debian jessie)

 どうもこんにちはー、モノトーンです。

 今日は自分の備忘録的なブログエントリーを書きたいと思います! clang/llvm ですね。詳しい歴史とかそーいうのはおいておいてどんな感じで使えばいいの? っていうのを書いていきます。

概要

  1. Debian Wheezy では clang-3.0。では…
  2. まずは普通の C++ プログラムを書こう!
  3. コンパイルしてみる
  4. Makefile for clang/llvm を書いてみよう
  5. おわりに

1. Debian Wheezy では clang-3.0。では…

 Debian Wheezy では apt-get install clang と入力しても、clang-3.3 しか入りません。そこで、vim /etc/apt/sources.list をいじります。そこに wheezy を testing に変更し、いろいろ入れていけば多分入ります。

  このあたりは試行錯誤して入れてみてください。私もいろいろ手こずりながらいれました。まあ Linux とか全然いじったことなかったわけで、そのあたりの細かいノウハウなかったので。今や NVIDIA のドライバーとかもきちんと入れて運用できているので割と問題ないと主ます。GTK のテーマがなくてダサくなってるのでそのうち入れなおしたいですw

2. まずは普通の C++ プログラムを書こう!

 普通ってのは、あれですよ、あれ。

#include <iostream>

int main( void )
{
 std::cout << "Hello, clang world!" << std::endl;
 return 0;
}

ってやつです。ね? 簡単でしょ?

3. コンパイルしてみる

 clang では、C/Objective-C をコンパイルするためにあるので、基本的に、C++/Objective-C++ では clang++ を用います。

clang++ -g -O0 testproject1.cc -o testproject

とでも、コマンドを打ち込みましょうか。これでコンパイルできます。軽くオプションを見て行きましょう。

  • -g
    デバッグオプション。デバッグに必要な情報を有しながらコンパイルします。
  • -O0
    最 適化レベル。clang は 0〜4 まであり、基本的に 0〜3 が通常の最適化 (数字が上がるごとに最適化度合いも上がる) で、4 は llvm bitcode を用いた最適化を行うので少しコンパイルの方法が違います。詳細は llvm を使ったコンパイルの Makefile を書くときに書きます。
  • -o
    オブジェクトファイル。特に何も指定していない場合、コンパイル、アセンブル、リンクを行って実行ファイル形式にしてもらえる。

 こんな感じです。O3 最適化だけ用いるのならこの程度解説すれば十分ですか、今日はもう一歩踏み込んで llvm を使った Makefile とかのサンプルとかそのあたりについて話します。

4. Makefile for clang/llvm を書いてみよう。

 それなりにクラスを書いた sub.h/sub.cc と、main.cc を準備します。そしてコマンドラインを打ち込んでいきましょう。 (なお、ここは Makefile の解説ではありませんので、コマンドラインで流れを把握していくことにします)

 まず、最初は llvm な bitcode を吐いてみましょう。

clang++ -c -emit-llvm -Werror -std=c++11 -stdlib=libc++ -O0 -g sub.cc -o sub.bc
clang++ -c -emit-llvm -Werror -std=c++11 -stdlib=libc++ -O0 -g testproject2.cc -o testproject2.bc

これで、bitcode が吐けます。

 通常この次の過程で bitcode に個々の最適化を書けますが、今回は行いません。

 次にこの bitcode をまとめる処理を行います。このコマンドを入れます。

llvm-link sub.bc test.bc -o merged.bc

 さらにこれをオブジェクトコードに変換します。

llc -march=x86-64 -mcpu=prescott -filetype=obj merged.bc -o merged.obj

 最後にリンクを行います。

clang++ -Werror -std=c++11 -stdlib=libc++ -O0 -g merged.obj -o testproject2

 こんな感じで実行ファイルが生成できるわけです。

 今回は簡単な参考ということでしたが、これの流れを周到した Makefile を含むプロジェクトを GitHub に公開しました。testproject2 のほうについて Makefile の簡単な使い方を記述して終わりにしたいと思います。

  • make all
    debug, release ともにビルドを行う
  • make または make debug
    debug ビルドを行う
  • make release
    release ビルドを行う
  • make run
    起動する
  • make clean
    clean する

と いった感じ。Makefile は中身をチェックしてもらえばいいんじゃないかなーって。あと amd64 上で i686 なコンパイルしたりはできるようになっていませんので、そのあたりは研究してみてください。bitcode を使うと途中までは同じようにして最後のオブジェクトコードにする過程を変えるだけで i686 にもできるかと思います。

5. おわりに

 長かった… 1 週間ぐらいかかったんじゃないかな? 環境構築から Linux になれるまで、時間がかかりましたが、今後の Linux について触れる機会があっても困らない程度にはある程度使えるようになったのかなー? とか思ったりします。

 はっきり言うと疲れました。でも llvm とか clang とかに触れてみたかったってのもあるので、非常に面白いかなーって思うので、皆様もよければ挑戦してみてください。

PS  Eclipse に llvm 用のプラグインがありますが、公式にも書いてある通り llvm 3.2 からは使えません。llvm-ld っていうのがなくなったからです。それ故 llvm 3.3 を使った環境では使えないのであしからず。 (llvm-ld とは llvm-link に相当するものです)

5.1 GitHub

 ライセンスは MIT license とします。https://github.com/mntone/clang-testproject