導航:首頁 > 源碼編譯 > llvm最快編譯

llvm最快編譯

發布時間:2022-11-19 07:53:06

A. 如何利用LLVM寫一個編譯

LLVM有自己的教程,如果你只想做個玩具,那可以首先試著實現LLVM Tutorial: Table of Contents的Kaleidoscope。深入的,請看他的文檔http://llvm.org/docs/

Kaleidoscope是一個範式簡單的腳本語言,教程里的詞法,語法分析都是手寫的,基本流程就是詞法語法解析,利用LLVM的API生成中間代碼並執行。

我用visual studio編譯的LLVM(version 3.6)實現過Kaleidoscope,我遇到的坑不少,如果你想以visual studio編譯的LLVM實現Kaleidoscope,你可能同樣會遇到

1. LLVM的生成目標對象為ELF格式,在windows下使用JIT的API時會出現incompatible object format的錯誤警告,需要在通過重新設定Mole的triple,我的PC的getTargetTriple的結果是「i686-pc-windows-msvc」,直接在後面再加上「-elf」即可

TheMole->setTargetTriple("i686-pc-windows-msvc-elf");

2. LLVM不支持windows下通過動態鏈接導出函數,如果需要使用C/C++的函數,需要通過addSymbol進行注冊

llvm::sys::DynamicLibrary::AddSymbol(/*std::string("_") +*/ "printd", &printd);

3. Kaleidoscope里使用的JIT的查找函數的API,getPointerToFunction已經被棄用了,需要替換為getFunctionAddress

B. Clang 比 GCC 好在哪裡

從代碼上說,clang結構更簡單。因為clang只需要完成詞法和語法分析,代碼優化和機器代碼的生成工作由llvm完成。所以和全部由自己包下的gcc比起來,clang可以更專注地做好一件事。

這種結構也使clang可以被單獨拿出來用在其他的程序里。比如vim的clang_complete插件就是利用clang進行語法分析後給出精確的自動補全和語法錯誤提示的。而gcc就沒法很方便地做到這一點。

在實用性方面,除了有更快的編譯速度更快和更友好的出錯提示外,clang還內置有靜態分析工具,可以對代碼進行靜態分析(clang --analyze)。這也是gcc做不到的。

總結如下:

Clang是LLVM的前端,可以用來編譯C,C++,ObjectiveC等語言。傳統的編譯器通常分為三個部分,前端(frontEnd),優化器(Optimizer)和後端(backEnd)。

在編譯過程中,前端主要負責詞法和語法分析,將源代碼轉化為抽象語法樹;優化器則是在前端的基礎上,對得到的中間代碼進行優化,使代碼更加高效;後端則是將已經優化的中間代碼轉化為針對各自平台的機器代碼。Clang則是以LLVM為後端的一款高效易用,並且與IDE結合很好的編譯前端。

C. 如何利用LLVM寫一個編譯器

書籍請參考編譯原理的龍書,以及flex,bison,llvm的manual。
如何寫我可以給你一個大致的流程,
編譯器由詞法分析器->語法分析器->中間代碼生成器->後端組成。
用C語言寫編譯器一般可以按照以下步驟:
1.使用flex生成詞法分析器。(flex可以通過自己編寫的描述文件來自動生成詞法分析器)
2.使用bison生成語法分析器。(bison可以通過自己編寫的描述文件來自動生成語法分析器)
3.通過語法分析器得到輸入代碼的語法樹表示。
4.編寫遍歷函數遍歷語法樹生成中間代碼。(這里推薦使用LLVM的中間代碼表示)
5.利用LLVM工具集來編譯執行所得到的中間代碼。

D. Impala中 LLVM 的交叉編譯、調用過程

[TOC]

Impala 使用的 LLVM JIT,首先通過 Clang 將源碼編譯成了 LLVM IR 文件,然後通過腳本將 IR 文件裝成可載入的二進制文件,BE 進程在運行過程中,通過 LLVM 的載入介面,把二進制文件載入進來使用。

待編譯的文件通過codegen/ impala-ir.cpp 指定

impala-ir.cpp 文件主要的作用就是把需要產生 LLVM IR 的文件包含進來。
確定了哪些文件需要產生 LLVM IR 之後,就開始生成 IR 的二進制文件了。大致流程如下:

這個階段生成最初始的bc文件,使用的是 CLang 的編譯工具。命令可見codegen/CMakeFiles.txt

生成的結果是 impala-sse-tmp.bc 文件。

使用LLVM 優化工具,對原始的 bc 文件進行優化。命令可見codegen/CMakeFiles.txt

生成的結果就是impala-sse.bc。

這一步使用的是Impala 自定義的一個腳本 file2array.sh ,將優化後的 bc 文件轉換為可載入的二進制c 文件。命令可見codegen/CMakeFiles.txt。

生成的結果是impala-sse-ir.cc。這個文件內部就是用一個數組存放二進制的值。

be 進程就是通過讀取 impala_sse_llvm_ir 數組,把 LLVM IR載入到進程中。
file2array.sh 腳本其實就是使用 xxd -i < impala-sse-ir.cc 命令把bc 文件內容轉成 c 語言的二進制形式。

LlvmCodeGen 類通過 CreateImpalaCodegen 介面實例化 codegen 對象。 CreateImpalaCodegen 最終會調用 CreateFromMemory ,在 CreateFromMemory 中就是將上文中生成的 impala_sse_llvm_ir 數組通過 LLVM 介面載入進來。

完成載入後,就可以通過 GetFunction 獲取指定的 IR 函數了。

所有的函數名及描述,定義在 impala-ir-names.h 和 impala-ir-functions.h ,這兩個文件是有對應關系的,都是通過gen_ir_descriptions.py生成。

impala-ir-names.h 定義了數組 FN_MAPPINGS ,存儲函數名和枚舉值的映射關系,如下:

impala-ir-functions.h定義了所有函數的枚舉值,如下:

通過 GetFunction 獲取函數的時候,因為有了 FN_MAPPINGS 存儲的映射關系,可以通過傳入枚舉值或者字元串符號查找函數。

在 InitializeLlvm 方法中會使用 FN_MAPPINGS ,對載入的 llvm 函數進行校驗。

E. Gcc和llvm編譯器有什麼區別,我這配置哪個快

LLVM與GCC在三段式架構上並沒有本質區別。LLVM與其它編譯器最大的差別是,它不僅僅是Compiler Collection,也是Libraries Collection。舉個例子,假如說我要寫一個XYZ語言的優化器,我自己實現了PassXYZ演算法,用以處理XYZ語言與其它語言差別最大的地方。而LLVM優化器提供的PassA和PassB演算法則提供了XYZ語言與其它語言共性的優化演算法。那麼我可以選擇XYZ優化器在鏈接的時候把LLVM提供的演算法鏈接進來。LLVM不僅僅是編譯器,也是一個SDK。

F. llvm是什麼

LLVM是構架編譯器(compiler)的框架系統,以C++編寫而成,用於優化以任意程序語言編寫的程序的編譯時間(compile-time)、鏈接時間(link-time)、運行時間(run-time)以及空閑時間(idle-time),對開發者保持開放,並兼容已有腳本。

G. LLVM相比於GCC,有哪些技術上的優勢

首先簡要介紹一下LLVM。LLVM是一個針對LLVM Intermediate Representation(IR,中間語言)的跨平台優化編譯器,它的模塊化設計很好,使得這個編譯器中的很多功能可以被單獨實現或者改進,這與其C++實現無法分開。由此,LLVM可以被設計成很多語言編譯器實現的後端,負責處理程序優化和跨平台,而前端只需將程序轉換成LLVM IR即可。比如說,Clang就是基於LLVM實現的C/C++編譯器,它的主要功能就是將C/C++程序轉換成LLVM IR,然後由LLVM負責後續的工作。

LLVM技術上的(最大)優勢就在於它的模塊化設計。在LLVM中,IR的解析,優化,匯編碼的生成,寄存器分配,匯編碼優化以及機器碼生成,各種類型的二進制文件生成全部都是介面定義清晰的模塊完成的,很容易分別改進或者添加定製功能。而且由於LLVM的C++實現,很多模塊理解和使用比較容易。這些特性使得LLVM可以很容易地被用在科研和生產實踐當中。反觀GCC,模塊化做得不如LLVM好,這使得它定製或者改進比較不方便。

閱讀全文

與llvm最快編譯相關的資料

熱點內容
編譯原理如何運用到編程中 瀏覽:14
linux選擇資料庫 瀏覽:375
php兩個數組差集 瀏覽:978
迷你pdf閱讀器下載 瀏覽:432
做一個python小程序 瀏覽:654
pythonossystem和 瀏覽:644
win2008如何搭建ftp伺服器 瀏覽:53
安卓手機為什麼不翻牌 瀏覽:545
刪除pkpm及相關文件夾 瀏覽:480
房貸解壓銀行內部流程 瀏覽:734
安卓手機如何更改語音 瀏覽:599
android紅包實現 瀏覽:733
蘋果的nvme為什麼安卓不用 瀏覽:31
python輸入單詞統計個數 瀏覽:997
腳本軟體提取源碼 瀏覽:281
程序員能給自己的微信錢包刷錢么 瀏覽:72
怎麼讓小天才app查看寶貝的通訊錄 瀏覽:623
dxgpdf 瀏覽:257
哪個命令 瀏覽:49
文件不能打包壓縮 瀏覽:706