日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

架构编译器框架系统 LLVM 使用简介

發(fā)布時(shí)間:2025/7/14 windows 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 架构编译器框架系统 LLVM 使用简介 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

LLVM 是什么
LLVM 是 low level virtual machine(底層虛擬機(jī))的簡(jiǎn)稱(chēng),它是一個(gè)開(kāi)源的編譯器架構(gòu),已經(jīng)被成功應(yīng)用到多個(gè)應(yīng)用領(lǐng)域。LLVM 的主要作用是它可以作為多種語(yǔ)言的后端,它可以提供可編程語(yǔ)言無(wú)關(guān)的優(yōu)化和針對(duì)很多種CPU的代碼生成功能。LLVM 核心庫(kù)提供了與編譯器相關(guān)的支持,可以作為多種語(yǔ)言編譯器的后臺(tái)來(lái)使用。能夠進(jìn)行程序語(yǔ)言的編譯期優(yōu)化、鏈接優(yōu)化、在線(xiàn)編譯優(yōu)化、代碼生成。LLVM的項(xiàng)目是一個(gè)模塊化和可重復(fù)使用的編譯器和工具技術(shù)的集合。LLVM是伊利諾伊大學(xué)的一個(gè)研究項(xiàng)目,提供一個(gè)現(xiàn)代化的,基于SSA的編譯策略能夠同時(shí)支持靜態(tài)和動(dòng)態(tài)的任意編程語(yǔ)言的編譯目標(biāo)。自那時(shí)以來(lái),已經(jīng)成長(zhǎng)為L(zhǎng)LVM的主干項(xiàng)目,由不同的子項(xiàng)目組成,其中許多正在生產(chǎn)中使用的各種 商業(yè)和開(kāi)源的項(xiàng)目,以及被廣泛用于學(xué)術(shù)研究。

LLVM 常用命令工具
llvm-as 將可讀的 .ll 文件匯編成字節(jié)代碼
llvm-dis 將字節(jié)代碼文件反編成可讀的 .ll 文件
opt 在一個(gè)字節(jié)代碼文件上運(yùn)行一系列的 LLVM 到 LLVM 的優(yōu)化
llc 為一個(gè)字節(jié)代碼文件生成本機(jī)器代碼
lli 直接運(yùn)行使用 JIT 編譯器或者解釋器編譯成字節(jié)代碼的程序
llvm-link 將幾個(gè)字節(jié)代碼文件連接成一個(gè)
llvm-ar 打包字節(jié)代碼文件
llvm-ranlib 為 llvm-ar 打包的文件創(chuàng)建索引
llvm-nm 在 字節(jié)代碼文件中打印名字和符號(hào)類(lèi)型
llvm-prof 將 'llvmprof.out' raw 數(shù)據(jù)格式化成人類(lèi)可讀的報(bào)告
llvm-ld 帶有可裝載的運(yùn)行時(shí)優(yōu)化支持的通用目標(biāo)連接器
llvm-config 打印出配置時(shí) LLVM 編譯選項(xiàng)、庫(kù)、等等
llvmc 一個(gè)通用的可定制的編譯器驅(qū)動(dòng)
llvm-diff 比較兩個(gè)模塊的結(jié)構(gòu)
bugpoint 自動(dòng)案例測(cè)試減速器
llvm-extract 從 LLVM 字節(jié)代碼文件中解壓出一個(gè)函數(shù)
llvm-bcanalyzer 字節(jié)代碼分析器 (分析二進(jìn)制編碼本身,而不是它代表的程序)
FileCheck 靈活的文件驗(yàn)證器,廣泛的被測(cè)試工具利用
tblgen 目標(biāo)描述閱讀器和生成器
lit??? LLVM 集成測(cè)試器,用于運(yùn)行測(cè)試

LLVM IR
根據(jù)編譯原理可知,編譯器不是直接將源語(yǔ)言翻譯為目標(biāo)語(yǔ)言,而是翻譯為一種“中間語(yǔ)言”,即“IR”。之后再由中間語(yǔ)言,利用后端程序和設(shè)備翻譯為目標(biāo)平臺(tái)的匯編語(yǔ)言。由于中間語(yǔ)言相當(dāng)于一款編譯器前端和后端的“橋梁”,不同編譯器的中間語(yǔ)言IR是不一樣的,而IR可以說(shuō)是集中體現(xiàn)了這款編譯器的特征。

LLVM IR主要有三種格式:一種是在內(nèi)存中的編譯中間語(yǔ)言;一種是硬盤(pán)上存儲(chǔ)的二進(jìn)制中間語(yǔ)言(以.bc結(jié)尾),最后一種是可讀的中間格式(以.ll結(jié)尾)。這三種中間格式是完全相等的。

LLVM IR是LLVM優(yōu)化和進(jìn)行代碼生成的關(guān)鍵。根據(jù)可讀的IR,我們可以知道再最終生成目標(biāo)代碼之前,我們已經(jīng)生成了什么樣的代碼。而且根據(jù)IR,我們可以選擇使用不同的后端而生成不同的可執(zhí)行代碼。同時(shí),因?yàn)槭褂昧私y(tǒng)一的IR,所以我們可以重用LLVM的優(yōu)化功能,即使我們使用的是自己設(shè)計(jì)的編程語(yǔ)言。

結(jié)構(gòu)化編譯器前端 Clang 介紹
Clang ( 發(fā)音為 /kl??/) 是 LLVM 的一個(gè)編譯器前端,它目前支持 C, C++, Objective-C 以及 Objective-C++ 等編程語(yǔ)言。Clang 對(duì)源程序進(jìn)行詞法分析和語(yǔ)義分析,并將分析結(jié)果轉(zhuǎn)換為 Abstract Syntax Tree ( 抽象語(yǔ)法樹(shù) ) ,最后使用 LLVM 作為后端代碼的生成器。

Clang 的開(kāi)發(fā)目標(biāo)是提供一個(gè)可以替代 GCC 的前端編譯器。與 GCC 相比,Clang 是一個(gè)重新設(shè)計(jì)的編譯器前端,具有一系列優(yōu)點(diǎn),例如模塊化,代碼簡(jiǎn)單易懂,占用內(nèi)存小以及容易擴(kuò)展和重用等。由于 Clang 在設(shè)計(jì)上的優(yōu)異性,使得 Clang 非常適合用于設(shè)計(jì)源代碼級(jí)別的分析和轉(zhuǎn)化工具。Clang 也已經(jīng)被應(yīng)用到一些重要的開(kāi)發(fā)領(lǐng)域,如 Static Analysis 是一個(gè)基于 Clang 的靜態(tài)代碼分析工具。

由于 GNU 編譯器套裝 (GCC) 系統(tǒng)龐大,而且 Apple 大量使用的 Objective-C 在 GCC 中優(yōu)先級(jí)較低,同時(shí) GCC 作為一個(gè)純粹的編譯系統(tǒng),與 IDE 配合并不優(yōu)秀,Apple 決定從零開(kāi)始寫(xiě) C family 的前端,也就是基于 LLVM 的 Clang 了。Clang 由 Apple 公司開(kāi)發(fā),源代碼授權(quán)使用 BSD 的開(kāi)源授權(quán)。

Clang 的特性:
相比于 GCC,Clang 具有如下優(yōu)點(diǎn):
1. 編譯速度快:在某些平臺(tái)上,Clang 的編譯速度顯著的快過(guò) GCC。
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)。與代碼基礎(chǔ)古老的 GCC 相比,學(xué)習(xí)曲線(xiàn)平緩。

當(dāng)前 Clang 還處在不斷完善過(guò)程中,相比于 GCC, Clang 在以下方面還需要加強(qiáng):
1. 支持更多語(yǔ)言:GCC 除了支持 C/C++/Objective-C, 還支持 Fortran/Pascal/Java/Ada/Go 和其他語(yǔ)言。Clang 目前支持的語(yǔ)言有 C/C++/Objective-C/Objective-C++。
2. 加強(qiáng)對(duì) C++ 的支持:Clang 對(duì) C++ 的支持依然落后于 GCC,Clang 還需要加強(qiáng)對(duì) C++ 提供全方位支持。
3. 支持更多平臺(tái):GCC 流行的時(shí)間比較長(zhǎng),已經(jīng)被廣泛使用,對(duì)各種平臺(tái)的支持也很完備。Clang 目前支持的平臺(tái)有 Linux/Windows/Mac OS。

本段內(nèi)容參考:http://www.ibm.com/developerworks/cn/opensource/os-cn-clang/

Clang 編譯選項(xiàng)
clang??? [-c|-S|-E] -std=standard -g
???????? [-O0|-O1|-O2|-O3|-Ofast|-Os|-Oz|-O|-O4]
???????? -Wwarnings... -pedantic
???????? -Idir... -Ldir...
???????? -Dmacro[=defn]
???????? -ffeature-option...
???????? -mmachine-option...
???????? -o output-file
???????? -stdlib=library
???????? input-filenames

大部分選項(xiàng)與 gcc 類(lèi)似:

-c 只是編譯不鏈接,生成目標(biāo)文件“.o”

-S 只是編譯不匯編,生成匯編代碼

-E 只進(jìn)行預(yù)編譯,不做其他處理

-g 在可執(zhí)行程序中包含標(biāo)準(zhǔn)調(diào)試信息

-o file 把輸出文件輸出到file里
-I dir 在頭文件的搜索路徑列表中添加dir目錄

-L dir 在庫(kù)文件的搜索路徑列表中添加dir目錄

中間碼的創(chuàng)建與轉(zhuǎn)化
編譯生成二進(jìn)制的 .bc 文件(bitcode file): clang -emit-llvm -c xx.c -o xx.bc

編譯生成 LLVM 的匯編代碼 .ll 文件( LLVM assembly code): clang -emit-llvm -S xx.c -o xx.ll

.bc 和 .ll 文件都可以直接用 lli 來(lái)執(zhí)行。

將 .ll 文件轉(zhuǎn)化為 .bc 文件: llvm-as test.ll

將 .bc 文件轉(zhuǎn)化為 .ll 文件: llvm-dis test.bc

將 .bc 或 .ll 文件轉(zhuǎn)化為本機(jī)平臺(tái)的匯編代碼: llc test.bc llc test.ll llc test.bc -o test.s

即時(shí)編譯器 JIT 簡(jiǎn)介
LLVM 中間碼的執(zhí)行需要用到 Jit。那么,JIT到底是個(gè)什么東西呢。其實(shí),JIT 是一個(gè)即時(shí)編譯器,即 Just-in-time Compiler。對(duì)于 JIT 的了解我也知之勝少,它的作用大概就是對(duì)中間碼進(jìn)行編譯作業(yè),像 JAVA 這種跨平臺(tái)的語(yǔ)言也是通過(guò) JIT 實(shí)現(xiàn)的。在執(zhí)行 LLVM 的 lli 工具時(shí),會(huì)去調(diào)用 JIT 將中間碼編譯成本機(jī)架構(gòu)的機(jī)器碼再執(zhí)行。

至于 jit 與 mcjit 的區(qū)別,大概是 jit 是 LLVM 舊版本的支持,而 mcjit 是對(duì) jit 新的支持。mc是機(jī)器碼的意思,即 Machine Code。在 Wikipedia 看到說(shuō),以前的 LLVM 會(huì)依賴(lài)與本機(jī)系統(tǒng)的匯編器或者提供一套工具鏈,然后再翻譯成機(jī)器碼。而通過(guò)整合過(guò)的 LLVM MC 能夠支持大多數(shù)的機(jī)器架構(gòu),包括 x86, x86-64, ARM, ARM64 以及 大部分的 MIPS 架構(gòu)等。

轉(zhuǎn)載于:https://my.oschina.net/kuanghy/blog/495084

總結(jié)

以上是生活随笔為你收集整理的架构编译器框架系统 LLVM 使用简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。