llvm初識

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容