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 -S 

LLVM バイトコードの出力が得られることを確認せよ。

アセンブラとの対応を示せ。


(4) a.out

出力される a.out を otool を使って調べる。


(5) ARMアセンブラ

macOS で
  -arch arm を付けて、ARMのアセンブラの出力を調べよ
  -arch i386 
  -arch x86_64 
   clang -print-targets

Linix なら
   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 と干渉しないようにする。


Shinji KONO / Fri Oct 4 15:23:33 2024