LLVM で Hello, World の puts 関数
前回のように簡単なプログラムでも、実際に書いてみると疑問が湧いてくる。
まず、文字列を出力している puts
関数。こいつの実体はどこにあるんだろう? C のプログラムなら、リンカが標準ライブラリをこっそりリンクしている、という結末になるのだが…。検索してみると、やはり、同じように疑問をもった人がいるようで、lli
が実行時のライブラリとして標準 C ライブラリを利用しているらしい。
ということは printf
なんかも使えるはずだよね。
@.LC0 = internal constant [14 x i8] c"Hello world!\0A\00"
**declare i32 @printf(i8 *, ...)**
define i32 @main() {
%cast210 = getelementptr [14 x i8]* @.LC0, i64 0, i64 0
**call i32 (i8 *, ...)* @printf(i8 * %cast210)**
ret i32 0
}
では、コンパイル、実行。
% llvm-as -f hello-printf.ll
% lli hello-printf.bc
Hello world!
うんうん。