LLVM 使用手冊(cè)

簡(jiǎn)介

LLVM 是一個(gè)發(fā)展中的前言編輯器技術(shù)框架,它易于擴(kuò)展并設(shè)計(jì)成多個(gè)庫(kù)的形式,可以為編譯器開發(fā)者提供流暢的體驗(yàn),并能使編譯器開發(fā)所涉及的學(xué)習(xí)過(guò)程變得非常流暢吐绵。

LLVM 架構(gòu)特性

  1. C++ 語(yǔ)言實(shí)現(xiàn)
  2. 前端與后端分離,支持多種前端和后端河绽,使用中間代碼 IR 進(jìn)行銜接
LLVM 架構(gòu)組成
  1. 第一個(gè) Release 版本發(fā)布于 2003 年己单,代碼開源
  2. 提供了很多工具用于編譯和優(yōu)化代碼
LLVM 工具集
  1. 與 GCC 相比,編譯出的程序運(yùn)行效率更高

Tools 使用

LLVM 的一些優(yōu)化和繪圖都針對(duì) bitcode 文件耙饰,這里介紹與之相關(guān)的工具使用

從 源文件 生成 bitcode 文件

clang -c -emit-llvm const.c -o const.bc

clang 是 LLVM 的前端編譯工具纹笼,可以用它來(lái)生成目標(biāo)文件,這個(gè)指令將 .c 代碼生成 .bc 文件.

warning:
使用這個(gè)命令的時(shí)候會(huì)自動(dòng)帶有 -O0 級(jí)別的優(yōu)化(新版本中)苟跪,可以禁止它廷痘,參考

clang -c -emit-llvm -Xclang -disable-O0-optnone const.c -o const.bc    

llvm tools 提供了產(chǎn)生 cfg callgraph 等圖片參數(shù)的工具(opt),注意件已,不會(huì)自己生成圖片笋额,還需要工具(如:graphviz MacOS下安裝 brew install graphviz)
cfg 圖

opt –view-cfg const.bc

call 圖

opt -view-callgraph file.bc

中間代碼優(yōu)化
用 opt ,還可以調(diào)用 LLVM 提供的優(yōu)化器對(duì) bitcode 文件進(jìn)行代碼優(yōu)化

opt -mem2reg const.bc -o const.reg.bc

-constprop 臨時(shí)變量
-early-cse 消除公共部分
運(yùn)行 help 篷扩,可以查看 LLVM 提供的優(yōu)化器

opt -help

-load 可以加載自定義的優(yōu)化器(或其他分析器)兄猩,如

opt -load LLVMCountOp.dylib -opCounter file.bc -o file.oc.bc
opt -load LLVMCountOp.dylib -help

-opCounter LLVMCountOp.dylib 里面 Pass 的注冊(cè)標(biāo)記

如果僅僅分析代碼,可以用 -disable-output 禁用輸出

opt -load LLVMCountOp.dylib -opCounter -disable-output -time-passes file.bc

-time-passes pass 運(yùn)行時(shí)間

bitcode 文件生產(chǎn) .ll ,中間代碼 IR 文件

llvm-dis const.bc  

可以對(duì) .ll 進(jìn)行即時(shí)運(yùn)行(JIT)

lli const.ll   

bitcode 文件生成可執(zhí)行文件

clang const.ll
./a.out

bitcode 文件生成目標(biāo)平臺(tái)機(jī)器碼

llc -march=x86 ex0.reg.bc -o ex0.reg.x86

使用官方二進(jìn)制庫(kù)

LLVM 官網(wǎng)提供了各個(gè)版本的下載瞻惋,有二進(jìn)制文件和源碼厦滤,使用二進(jìn)制文件中包含了可以直接運(yùn)行在目標(biāo)平臺(tái)的 Tools 和 LLVM 的基礎(chǔ)功能靜態(tài)庫(kù)。
直接使用二進(jìn)制靜態(tài)庫(kù)歼狼,可以開發(fā)出我們自己的編譯工具掏导,Tools 里有 llvm-config 提供了補(bǔ)充 LLVM 各個(gè)依賴參數(shù)功能,可以方便編寫 MakeFile 文件羽峰,編譯工程趟咆。
倉(cāng)庫(kù)下 JIT 提供了一個(gè)編譯工具的工程添瓷,依賴的 LLVM 版本是 3.4 。提供了一個(gè)通用的 MakeFile 模板值纱。

LLVM_CONFIG ?= ../bin_3.4/bin/llvm-config

ifndef VERBOSE
QUIET := @
endif

SRC_DIR ?= $(PWD)

LLVM_LDFLAGS := $(shell $(LLVM_CONFIG) --ldflags)
COMMON_FLAGS = -Wall -Wextra
LLVM_CXXFLAGS += $(COMMON_FLAGS) $(shell $(LLVM_CONFIG) --cxxflags)
LLVM_CPPFLAGS += $(shell $(LLVM_CONFIG) --cppflags) -I$(SRC_DIR)
LLVM_LIBS = $(shell $(LLVM_CONFIG) --libs jit interpreter nativecodegen)

objects = Driver.o Expr.o Lexer.o Parser.o
name = driver

default: $(name)

$(name) : $(objects)
        @echo Linking $@
        $(QUIET)$(CXX) -o $@ $(LLVM_CXXFLAGS) $(LLVM_LDFLAGS) $^ $(LLVM_LIBS)

%.o : %.cpp
        @echo Compiling $*.cpp
        $(QUIET)$(CXX) -c $< $(LLVM_CPPFLAGS) -o $@

clean::
        $(QUIET)rm -f $(name) $(objects)

系統(tǒng)下配置好 clang 環(huán)境鳞贷,然后設(shè)置好 LLVM_CONFIG 目錄,即可運(yùn)行 make 命令虐唠,進(jìn)行編譯搀愧。

使用官方源碼

借助于官網(wǎng)提供的源代碼也能開發(fā)出高效工具,這里以 Pass 的開發(fā)為例疆偿。
從官網(wǎng)找到一個(gè)版本(如:3.4)的代碼后咱筛,下載到本地,代碼工程由 cmake 工具組織杆故,可以在工程下創(chuàng)建目錄llvm_xcode迅箩,然后進(jìn)入目錄執(zhí)行

cmake -G Xcode ../llvm 

就能生成支持 Xcode 的項(xiàng)目,用 Xcode IDE 可以打開工程(還支持其他IDE工具处铛,詳情參考官網(wǎng))饲趋。
在源碼工程下我們可以找到一個(gè)實(shí)例工程 Hello ,這是一個(gè) Pass 工程撤蟆,在 llvm/lib/Transforms 目錄下(不是 llvm_xcode 下的 lib)奕塑。我們使用目錄工具進(jìn)入該文件下,模仿Hello工程的配置家肯,新建自己的工程爵川,修改 Transforms 目錄下的 CMakeList.txt Makefile 和 子目錄下的文件。然后回到 llvm_xcode 目錄下息楔,再執(zhí)行一遍 cmake 指令。
Xcode IDE 可以對(duì)工程代碼進(jìn)行編輯扒披,編譯完成后值依,可以對(duì)目標(biāo) Target 進(jìn)行編譯。會(huì)生成以動(dòng)態(tài)鏈接庫(kù)碟案,放在工程下驗(yàn)證愿险, 倉(cāng)庫(kù) Passes 下提供了編譯好的庫(kù),可以直接使用价说。

常見錯(cuò)誤:

Error opening 'LLVMCountOp.dylib': dlopen(LLVMCountOp.dylib, 9): Symbol not found: __ZN4llvm12FunctionPass17assignPassManagerERNS_7PMStackENS_15PassManagerTypeE
  Referenced from: LLVMCountOp.dylib
  Expected in: flat namespace

加載的 Pass 和 opt 版本不對(duì)辆亏,或者 Release Debug 不一致

參考

Makefile 調(diào)用 llvm-config

llvm-config 官文

Makefile 官文

課件官網(wǎng)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鳖目,隨后出現(xiàn)的幾起案子扮叨,更是在濱河造成了極大的恐慌,老刑警劉巖领迈,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彻磁,死亡現(xiàn)場(chǎng)離奇詭異碍沐,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)衷蜓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門累提,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人磁浇,你說(shuō)我怎么就攤上這事斋陪。” “怎么了置吓?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵无虚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我交洗,道長(zhǎng)骑科,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任构拳,我火速辦了婚禮咆爽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘置森。我一直安慰自己斗埂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布凫海。 她就那樣靜靜地躺著呛凶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪行贪。 梳的紋絲不亂的頭發(fā)上漾稀,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音建瘫,去河邊找鬼崭捍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛啰脚,可吹牛的內(nèi)容都是我干的殷蛇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼橄浓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼粒梦!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起荸实,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤匀们,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后泪勒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昼蛀,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宴猾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叼旋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仇哆。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖夫植,靈堂內(nèi)的尸體忽然破棺而出讹剔,到底是詐尸還是另有隱情,我是刑警寧澤详民,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布延欠,位于F島的核電站,受9級(jí)特大地震影響沈跨,放射性物質(zhì)發(fā)生泄漏由捎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一饿凛、第九天 我趴在偏房一處隱蔽的房頂上張望狞玛。 院中可真熱鬧,春花似錦涧窒、人聲如沸心肪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)硬鞍。三九已至,卻和暖如春戴已,著一層夾襖步出監(jiān)牢的瞬間固该,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工糖儡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蹬音,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓休玩,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親劫狠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拴疤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容