LLVM 初步了解

LLVM標(biāo)志

什么是LLVM

  • 官網(wǎng):https://llvm.org/

  • LLVM項(xiàng)目是模塊化、可重用的編譯器以及工具鏈技術(shù)的集合。美國(guó)計(jì)算機(jī)協(xié)會(huì) (ACM) 將其2012 年軟件系統(tǒng)獎(jiǎng)項(xiàng)頒給了LLVM,之前曾經(jīng)獲得此獎(jiǎng)項(xiàng)的軟件和技術(shù)包括:Java研底、Apache轰传、 Mosaic、the World Wide Web跪楞、Smalltalk、UNIX侣灶、Eclipse等等

  • 創(chuàng)始人:Chris Lattner甸祭,亦是Swift之父

傳統(tǒng)的編譯器架構(gòu)

傳統(tǒng)的編譯器架構(gòu)

LLVM編譯器架構(gòu)

LLVM編譯器架構(gòu)
 從上面的2張圖就可以看出來(lái)LLVM編譯器的優(yōu)點(diǎn)
 1.不同的前端后端使用統(tǒng)一的中間代碼LLVM Intermediate Representation (LLVM IR)
 2.如果需要支持一種新的編程語(yǔ)言,那么只需要實(shí)現(xiàn)一個(gè)新的前端
 3.如果需要支持一種新的硬件設(shè)備褥影,那么只需要實(shí)現(xiàn)一個(gè)新的后端
 4.優(yōu)化階段是一個(gè)通用的階段池户,它針對(duì)的是統(tǒng)一的LLVM IR,不論是支持新的編程語(yǔ)言凡怎,還是支持新的硬件設(shè)備校焦,都不需要對(duì)優(yōu)化階段做修改
 5.相比之下,GCC的前端和后端沒(méi)分得太開统倒,前端后端耦合在了一起寨典。所以GCC為了支持一門新的語(yǔ)言,或者為了支持一個(gè)新的目標(biāo)平臺(tái)檐薯,就 變得特別困難
 6LLVM現(xiàn)在被作為實(shí)現(xiàn)各種靜態(tài)和運(yùn)行時(shí)編譯語(yǔ)言的通用基礎(chǔ)結(jié)構(gòu)(GCC家族凝赛、Java、.NET坛缕、Python墓猎、Ruby、Scheme赚楚、Haskell毙沾、D等)

下面主要介紹下Clang

  • Clang是LLVM項(xiàng)目的一個(gè)子項(xiàng)目

  • 基于LLVM架構(gòu)的C/C++/Objective-C編譯器前端

  • 官網(wǎng):http://clang.llvm.org/
    相比于GCC ,Clang具有的優(yōu)點(diǎn)

    1.編譯速度快:在某些平臺(tái)上宠页,Clang的編譯速度顯著的快過(guò)GCC(Debug模式下編譯OC速度比GGC快3倍)
    2.占用內(nèi)存小:Clang生成的AST所占用的內(nèi)存是GCC的五分之一左右
    3.模塊化設(shè)計(jì):Clang采用基于庫(kù)的模塊化設(shè)計(jì)左胞,易于 IDE 集成及其他用途的重用
    4.診斷信息可讀性強(qiáng):在編譯過(guò)程中,Clang 創(chuàng)建并保留了大量詳細(xì)的元數(shù)據(jù) (metadata)举户,有利于調(diào)試和錯(cuò)誤報(bào)告
    5.設(shè)計(jì)清晰簡(jiǎn)單烤宙,容易理解,易于擴(kuò)展增強(qiáng)
    

Clang 與LLVM 的關(guān)系

Clang 與 LLVM 的關(guān)系
  • 可以看的出Clang可以對(duì)語(yǔ)法進(jìn)行分析俭嘁,所以我們接下來(lái)做個(gè)類名規(guī)范的插件

具體操作開始

下載LLVM

下載Clang

編譯源碼

安裝cmake和ninja

  • brew install cmake
  • brew install ninja
    (ninja如果安裝失敗,可以直接從github獲取release版放入【/usr/local/bin】中 下載地址 :https://github.com/ninja-build/ninja/releases
  • 在LLVM源碼同級(jí)目錄下新建一個(gè)【llvm_build】目錄(最終會(huì)在【llvm_build】目錄下生成【build.ninja】
  • cd llvm_build
  • cmake -G Ninja ../llvm -DCMAKE_INSTALL_PREFIX=../llvm_release
    (cmake -G Ninja ../llvm -DCMAKE_INSTALL_PREFIX=LLVM的安裝路徑)
  • 然后依次執(zhí)行命令
  • ninja (備注:編譯完畢后,編譯時(shí)間大概半個(gè)小時(shí) 【llvm_build】目錄大概 21.05 G(僅供參考) )
  • ninja install ( 備注: 安裝完畢后拐云,安裝時(shí)間大概20分鐘罢猪,安裝目錄大概 11.92 G(僅供參考))
  • 在llvm同級(jí)目錄下新建一個(gè)【llvm_xcode】目錄
  • cd llvm_xcode
  • cmake -G Xcode ../llvm
  • 完成之后 雙擊 LLVM.xcodeproj 打開項(xiàng)目


    點(diǎn)擊這個(gè)
  • 然后command+B 編譯一下

libclang、libTooling

Clang插件開發(fā)


clang插件開發(fā)

  • 在【clang/tools】源碼目錄下新建一個(gè)插件目錄,假設(shè)叫做【zw-plugin】
  • /llvm/tools/clang/tools 在這個(gè)目錄下創(chuàng)建一個(gè)zw-plugin 文件夾


    創(chuàng)建zw-plugin文件夾
  • 在/llvm/tools/clang/tools/CMakeLists.txt 最后加入內(nèi)容: add_clang_subdirectory(zw-plugin)薇缅,小括號(hào)里是插件目錄名


    添加
  • 然后在/llvm/tools/clang/tools/zw-plugin 的目錄下新建一個(gè)CMakeLists.txt 危彩。
  • 文件添加內(nèi)容是:add_llvm_loadable_module(ZWPlugin ZWPlugin.cpp)
  • 然后在/llvm/tools/clang/tools/zw-plugin 文件里 創(chuàng)建名字為ZWPlugin.cpp 的文件


    最終的效果圖
  • ZWPlugin.cpp 里面的源碼,我上傳到github

寫完插件代碼后需要重新來(lái)到我們創(chuàng)建llvm_xcode 文件下

  • cd llvm_xcode
  • cmake -G Xcode ../llvm
    (利用cmake生成的Xcode項(xiàng)目來(lái)編譯插件(第一次編寫完插件泳桦,需要利用cmake重新生成一下Xcode項(xiàng)目))
  • 選擇MJPlugin這個(gè)target進(jìn)行編譯恬砂,編譯完會(huì)生成一個(gè)動(dòng)態(tài)庫(kù)文件
運(yùn)行效果
  • ZWPlugin 就是最后做成插件的動(dòng)態(tài)庫(kù)

測(cè)試插件效果

  • 自己新創(chuàng)建一個(gè)xcode 工程 在創(chuàng)建一個(gè)zw_class 帶下劃線的類名
  • 在新建的工程中找到下圖


    BuildSettings > OTHER_CFLAGS
  • -Xclang -load -Xclang 動(dòng)態(tài)庫(kù)路徑 -Xclang -add-plugin -Xclang 插件名稱

clang插件開發(fā)6 – Hack Xcode

  • 首先要對(duì)Xcode進(jìn)行Hack,才能修改默認(rèn)的編譯器
  • 下載【XcodeHacking.zip】蓬痒,解壓,修改【HackedClang.xcplugin/Contents/Resources/HackedClang.xcspec】的內(nèi)容漆羔,設(shè)置一下自己編譯好的clang的路徑
  • 然后在XcodeHacking目錄下進(jìn)行命令行梧奢,將XcodeHacking的內(nèi)容剪切到Xcode內(nèi)部
  • 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/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications
  • 如果上面的命令報(bào)錯(cuò)的話,就根據(jù)上面的路徑找到對(duì)應(yīng)的文件演痒,然后把解壓的文件放在里面
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末亲轨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鸟顺,更是在濱河造成了極大的恐慌惦蚊,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讯嫂,死亡現(xiàn)場(chǎng)離奇詭異蹦锋,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)欧芽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門莉掂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人千扔,你說(shuō)我怎么就攤上這事憎妙。” “怎么了曲楚?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵厘唾,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我龙誊,道長(zhǎng)抚垃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮讯柔,結(jié)果婚禮上抡蛙,老公的妹妹穿的比我還像新娘。我一直安慰自己魂迄,他們只是感情好粗截,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捣炬,像睡著了一般熊昌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上湿酸,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天婿屹,我揣著相機(jī)與錄音,去河邊找鬼推溃。 笑死昂利,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的铁坎。 我是一名探鬼主播蜂奸,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼硬萍!你這毒婦竟也來(lái)了扩所?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤朴乖,失蹤者是張志新(化名)和其女友劉穎祖屏,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體买羞,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袁勺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哩都。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片魁兼。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖漠嵌,靈堂內(nèi)的尸體忽然破棺而出咐汞,到底是詐尸還是另有隱情,我是刑警寧澤儒鹿,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布化撕,位于F島的核電站,受9級(jí)特大地震影響约炎,放射性物質(zhì)發(fā)生泄漏锤窑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一抵卫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧憾朴,春花似錦、人聲如沸喷鸽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)做祝。三九已至砾省,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間混槐,已是汗流浹背编兄。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留声登,地道東北人狠鸳。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像悯嗓,于是被迫代替她去往敵國(guó)和親碰煌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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