LLVMに関する解説1
LLVMプロジェクト
任意のプログラミング言語の静的コンパイルと動的コンパイルの両方をサポートできる最新の SSA ベースのコンパイル戦略を提供することを目的としたプロジェクト
LLVMのサブプロジェクト
・Clang・・・「LLVM ネイティブ」の C/C++/Objective-C コンパイラ (コンパイラフロントエンド)
・LLD ・・・高速に動作するリンカーの機能
・LLDB ・・・デバッガの機能を持つ
LLVMのダウンロードページ
LLVM 16.0.0
・LLVM-16.0.0-win64.exeをダウンロードしてみます。
・ダウンロードしたexeファイルを実行してみます。
・インストールを実施してみます。(2.5GBも必要ですね)
いくつかのファイルが入っていることが確認できます。
C:\Program Files\LLVM\bin
試してみる。
Clang(クラン)コマンドを試してみます。
clang -v
> clang version 16.0.0
> Target: x86_64-pc-windows-msvc
> Thread model: posix
> InstalledDir: C:\Program Files\LLVM\bin
#include<stdio.h>
int main(){
printf("Hello,World!\n");
return 0;
}
clang test.c
>test.c:1:9: fatal error: 'stdio.h' file not found
今回の場合だと stdio.h(入出力の標準ヘッダ) を提供してないんですね。C 標準ライブラリの実装から取得する必要があるわけですね。
↑上記からインストールした場合は、エラーが発生しないです。
では標準ライブラリを探すことにしましょう。
今回はvisualstdioを入れてみます。
C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\ucrt
#include"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\ucrt\stdio.h"
int main(){
printf("Hello,World!\n");
return 0;
}
コマンドを実行して成功したらa.exeファイルが作成されていることが確認できました。
a.exe
> Hello,World!
LLVM IR
LLVMではLLVM IRという中間言語から機械語へのコンパイルが可能です。
基本的なC言語が実行ファイルになるまでの順序として
C言語ファイル→(プリプロセス)→(コンパイル)→アセンブラ→(アセンブル)→機械語(.o)→(リンカ)
(プリプロセスとコンパイル処理まで)
Clang -S test.c
test.s というアセンブラソースが生成される。
プリプロセス、コンパイル、アセンブルまで
Clang -c test.c
test.oファイルが作成されます(リンク未実施)
さてオプションで-emit-llvm
があります。
を出力する。
clang -S -emit-llvm test.c
test.ll(LLVM-IR)のファイルが生成されます。
clang -c -emit-llvm test.c
test.bcのファイルが生成されます。
Discussion