LLVM是一個構建編譯器的開源項目,其中Clang是其中一個比較典型的子項目。
LLVM的核心架構思想如下圖
上圖關鍵是LLVM IR,LLVM IR 把這個編譯流程分為前端-中間優化-后端三個部分。
前端是把某種語言編譯為LLVM IR,中間優化是LLVM的固定優化管線,后端是針對LLVM IR 生成各種目標框架支持的匯編語言。
LLVM IR有三種形式:二進制文件.bc、人類可閱讀文件.ll、內存的表達;
類似 clang -emit-llvm -c hello.c -o hello.bc 生成bc文件
類似 llvm-dis hello.bc 生成.ll文件
.ll文件結構如下:語法接近C語言,比匯編語言抽象,比C語言底層而繁雜。
IR的結構簡單分為Module、body
其中全局變量用@,局部變量用%,%1指的是第一個寄存器(抽象意義上的寄存器,不同於CPU的寄存器), alloca 是聲明, align是字節對齊位數,store是存儲,load是加載
通過LLVM源碼還可以定制自己的編譯器和編譯流程,我們留待下篇解答。