LLVM
Menu以下のCのソースコードがコンパイラによってどう変換されるかを調べる。
extern int printf(const char *,...); #define TYPE int TYPE f(TYPE a, TYPE b) { return a + b; } int main() { TYPE a = 1; TYPE b = 2; printf("%x = %x + %x \n",f(a,b),a,b); return 0; }
(1) cpp
clang -Eでの出力を調べる。
変換されている部分はどこか。 printf を protoptype ではなく #include <stdio.h> で定義した時はどうなるか。
(2) アセンブラ
clang -S -O0で出力されるアセンブラについて調べる。
clang -S -Oについても調べる。
関数f はどうなっているか。
(3) LLVM byte code
clang -emit-llvm -SLLVM バイトコードの出力が得られることを確認せよ。
アセンブラとの対応を示せ。
(4) a.out
出力される a.out を otool を使って調べる。
(5) ARMアセンブラ
macOS で-arch arm を付けて、ARMのアセンブラの出力を調べよ -arch i386 -arch x86_64 clang -print-targetsLinix なら
clang -target x86_64-linux-gnu endian.c -S
option
LLVM を、最新の source repository から git 取得して、make すること。(LLVM GCC は作らない)llvm git mirror clang も git clone するのを忘れずに。
../llvm/configure --prefix $HOME/src/public/llvm/local --disable-optimized make -j(24分ぐらいかかる)prefix を指定して、既存の llvm と干渉しないようにする。