LLVM資料整理

  • LLVM是模塊化但金、可重用的編譯器以及工具鏈技術(shù)的
  • GCC铃在、LLVM、clang
  • 傳統(tǒng)的編譯器架構(gòu):前端-優(yōu)化器(中間代碼)-后端->機器代碼
  • 不同的前端后端使用統(tǒng)一的中間代碼LLVM Intermediate Representation(LLVM IR)
  • 如果需要支持一種新的編程語言,只要實現(xiàn)一個新的前端
  • 如果需要支持一種新的硬件設(shè)備翘单,只要實現(xiàn)一個新的后端
  • 優(yōu)化階段使用統(tǒng)一的LLVM IR,不需要做修改
  • GCC 前端后端耦合在一起蹦渣,需要每個都實現(xiàn)
  • LLVM現(xiàn)在被作為實現(xiàn)各種靜態(tài)和運行時編譯語言的通用基礎(chǔ)架構(gòu)(GCC家族哄芜、Java、.Net柬唯、Python认臊、Ruby、Scheme锄奢、Haskell失晴、D等)

Clang

  • LLVM項目的一個子項目
  • 基于LLVM架構(gòu)的C/C++/Objective-C編譯
  • 相比GCC剧腻,Clang編譯速度快(Debug模式下編譯OC速度比GCC快三倍)、占用內(nèi)存效(Clang生成的AST占用內(nèi)存是GCC的1/5)涂屁、模塊化設(shè)計(Clang基于庫的模塊化設(shè)計书在,易于IDE集成和其他用途的重用)、診斷信息可讀性強(在編譯過程種胯陋,Clang創(chuàng)建并保留了大量詳細(xì)的元數(shù)據(jù)(metaData)蕊温,有利于調(diào)試)
  • clang代碼需要放在./llvm/tools下

Clang+LLVM

  • 前端使用Clang進行詞法分析、語法分析遏乔、語義分析义矛、生成中間代碼
  • 優(yōu)化器和后端使用LLVM

OC源文件的編譯過程

  • 通過命令行查看編譯過程:$ clang -ccc-print-phases main.m
  • 詞法分析,生成token:$ clang -fmodules -E -Xclang -dump-tokens main.m
  • 生成語法樹-AST:$ clang -fmodules -fsyntax-only -Xclang -ast-dump main.m

LLVM IR

LLVM IR有3種表現(xiàn)形式:

  • text:文本格式盟萨,$ clang -S -emit-llvm main.m
  • memory: 內(nèi)存格式
  • bitcode:二進制格式凉翻,$ clang -C -emit-llvm main.m

LLVM IR語法:

  • 注釋以分號;開頭
  • 全局標(biāo)識符以@開頭,局部標(biāo)識符以%開頭
  • alloca捻激,在當(dāng)前函數(shù)棧幀種分配內(nèi)存
  • i32制轰,32bit
  • align,內(nèi)存對齊
  • load胞谭,讀取數(shù)據(jù)
  • store垃杖,寫入數(shù)據(jù)

LLVM源碼編譯

  • 安裝cmake和ninja,ninja可以直接從github下載解壓到bin目錄
brew install cmake
brew install ninja
  • 編譯ninja模板:
cmake -G Ninja ../llvm -DCMAKE_INSTALL_PREFIX=LLVM的安裝路徑
  • $ ninja
  • $ ninja install
  • 也可以生成xcode模板進行編譯

應(yīng)用與實踐

libclang丈屹、libTooling

clang插件開發(fā)

Pass開發(fā)

開發(fā)新的編程語言

clang插件開發(fā)

  • 在llvm源碼目錄下clang/tools目錄下開發(fā)彩库,新建目錄XXPlugin,在CMakeList.txt添加該目錄
  • XXPlugin下新建一個cpp文件先蒋,新建一個txt骇钦,txt中添加這個cpp
add_llvm_loadable_module(XXPlugin XXPlugin.cpp) 
//如果又多個Plugin,都放在括號中竞漾,逗號分割
  • 在cpp中寫一個class XXAction繼承自PluginASTAction
  • 注冊插件
static FrontendPluginRegistry::Add<XXPlugin::XXAction>
X("XXPlugin", "description");
  • 重寫CreateASTConsumer和ParseArgs(直接返回true)兩個方法
  • 定義一個Consumer類繼承自ASTConsumer
  • 重寫HandleTranslationUnit方法眯搭,該方法當(dāng)Clang編譯完語法樹時調(diào)用
  • 編譯完成后的dylb動態(tài)庫放在Xcode中,Build Settings中Other C Flags添加該動態(tài)庫路徑以及插件名稱业岁,同時Compiler需要改成自己編譯好的llvm編譯器(Default自帶編譯器不允許加載插件)鳞仙。如果重新編譯插件代碼生成dylb,使用這個插件的工程需要Clean重新加載插件叨襟。
  • 需要對Xcode進行Hack,才能修改默認(rèn)編譯器幔荒。下載XcodeHacking.zip糊闽,修改HackedClang文件中的ExecPath的路徑為llvm本地路徑梳玫。然后在XcodeHacking目錄下執(zhí)行命令
$ sudo mv HackedClang.xcplugin `xcode-select -print-path`/../PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library/Xcode/Plug-ins
$ sudo mv HackedBuildSystem.xcspec `xcode-select -print-path`/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications
  • 構(gòu)造一個Consumer,用來拋出警告或錯誤信息
  • MatchFinder可以用來查找語法樹上下文

注:資料整理自MJ公開課右犹。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末提澎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子念链,更是在濱河造成了極大的恐慌盼忌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掂墓,死亡現(xiàn)場離奇詭異谦纱,居然都是意外死亡,警方通過查閱死者的電腦和手機君编,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進店門跨嘉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吃嘿,你說我怎么就攤上這事祠乃。” “怎么了兑燥?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵亮瓷,是天一觀的道長。 經(jīng)常有香客問我降瞳,道長嘱支,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任力崇,我火速辦了婚禮斗塘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘亮靴。我一直安慰自己馍盟,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布茧吊。 她就那樣靜靜地躺著贞岭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搓侄。 梳的紋絲不亂的頭發(fā)上瞄桨,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天,我揣著相機與錄音讶踪,去河邊找鬼芯侥。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的柱查。 我是一名探鬼主播廓俭,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼唉工!你這毒婦竟也來了研乒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤淋硝,失蹤者是張志新(化名)和其女友劉穎雹熬,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谣膳,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡竿报,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了参歹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仰楚。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖犬庇,靈堂內(nèi)的尸體忽然破棺而出僧界,到底是詐尸還是另有隱情,我是刑警寧澤臭挽,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布捂襟,位于F島的核電站,受9級特大地震影響欢峰,放射性物質(zhì)發(fā)生泄漏葬荷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一纽帖、第九天 我趴在偏房一處隱蔽的房頂上張望宠漩。 院中可真熱鬧,春花似錦懊直、人聲如沸扒吁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雕崩。三九已至,卻和暖如春融撞,著一層夾襖步出監(jiān)牢的瞬間盼铁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工尝偎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留饶火,地道東北人。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像肤寝,于是被迫代替她去往敵國和親牧挣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,566評論 2 349

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