llvm介紹
ollvm的前身
llvm是一個整體的功能代表詞,不是字母縮寫,他的功能主要是對語言的一個跨平臺處理,分為前段 ir 后端三部分,前段是各種語言的編寫,經(jīng)過中間ir的轉(zhuǎn)換,后端優(yōu)化輸出。
clang就是屬于llvm的一個子項目,我們可以通過編譯llvm源碼獲取clang
編譯llvm
在llvm的官網(wǎng)下載llvm源碼, 下載地址
根據(jù)官網(wǎng)把編譯環(huán)境配置下, 我這邊用的Ubuntu2004

image.png

image.png
下面的命令行可以配置大部分環(huán)境,剩下的用的時候,缺啥補(bǔ)上就行
sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
進(jìn)入下載的源碼目錄創(chuàng)建兩個debug和release文件夾,編譯兩個版本,編譯一個也行,編譯的時候,記得電腦磁盤空間要大一點,不然編不動,最少給個150g, 交換空間最少30g,我給的30G交換空間,還是出現(xiàn)了一次交換空間不足的情況,
linux swap 設(shè)置
free -m 查看當(dāng)前空間

image.png
sudo dd if=/dev/zero of=/swapfile bs=1024 count=1048576 設(shè)置10g bs是單位,count是數(shù)量
sudo mkswap /swapfile 制作swap交換文件
sudo swapon /swapfile 啟用交換文件
sudo swapoff -v /swapfile 關(guān)閉交換文件
sudo rm /swapfile 刪除交換文件
cmake配置
官方文檔說的編譯步驟

image.png
我選擇用NInja來編譯,設(shè)置編譯為debug,編譯項目為clang,llvm有多個子項目,也可以同時寫多個項目,用 ; 隔開就好

image.png
-j4 代表四個核處理編譯

image.png
release版,修改下編譯的type就好了
使用編譯的clang
344 export PATH=/home/shock/myfile/ollvm/llvm-project-11.0.0/llvm/cmake-build-debug/bin:$PATH 設(shè)置環(huán)境變量
345 clang hello.c -o hello 用clang將hello.c 輸出成可執(zhí)行文件
346 ./hello 運(yùn)行
348 clang -emit-llvm -S hello.c -o hello.ll 將c文件轉(zhuǎn)換llvm中間語言
350 lli hello.ll 運(yùn)行中間語言
352 llvm-as hello.ll -o hello.bc 將ll文件轉(zhuǎn)換成匯編文件,需要先轉(zhuǎn)換成bc文件
353 llc hello.bc -o hello.s
354 clang hello.s -o hello_s 將匯編文件輸出成可執(zhí)行文件
355 ./hello_s
hello.c 代碼
#include <stdio.h>
void test_hello(){
printf("hello pass test\n");
}
int main(int argc, char const *argv[])
{
printf("hello clang\n");
test_hello();
return 0;
}

image.png

image.png
llvm pass
編寫pass文件可以對ll文件進(jìn)行轉(zhuǎn)換,比如方法名的替換,加密等
寫個pass項目 修改下文件名,官網(wǎng)cmake配置 地址

image.png
使用clion 開發(fā)
項目目錄

image.png
配置下項目clang環(huán)境 在根目錄下配置 ,這是我的路徑
set(LLVM_DIR /home/shock/myfile/ollvm/llvm-project-11.0.0/llvm/cmake-build-debug/lib/cmake/llvm/)
項目地址
build project 編譯出LLVMencyrpass.so文件

image.png