🐙

LLVMに関する解説1

2023/04/13に公開

LLVMプロジェクト

任意のプログラミング言語の静的コンパイルと動的コンパイルの両方をサポートできる最新の SSA ベースのコンパイル戦略を提供することを目的としたプロジェクト

LLVMのサブプロジェクト

・Clang・・・「LLVM ネイティブ」の C/C++/Objective-C コンパイラ (コンパイラフロントエンド)
・LLD ・・・高速に動作するリンカーの機能
・LLDB ・・・デバッガの機能を持つ

LLVMのダウンロードページ

https://releases.llvm.org/

LLVM 16.0.0
https://github.com/llvm/llvm-project/releases/tag/llvmorg-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
test.c
#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 標準ライブラリの実装から取得する必要があるわけですね。

https://github.com/mstorsjo/llvm-mingw/releases
↑上記からインストールした場合は、エラーが発生しないです。

では標準ライブラリを探すことにしましょう。
今回はvisualstdioを入れてみます。
https://visualstudio.microsoft.com/ja/downloads/

stdio,hファイルを発見
C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\ucrt
test.c(パターン2)
#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