llvm不僅僅是乙個編譯器,同時提供了模組化的功能和庫,用於編譯器的開發和功能擴充套件。常規的乙個編譯器分為前端、優化器和後端,llvm編譯器也不例外,clang就是屬於乙個編譯器的前端部分,llvm屬於優化器和後端,當然llvm也可以支援其他型別的前端,比如gcc前端編譯器。
本文介紹到的llvm-clang就是使用clang前端的llvm編譯器,一般情況下llvm都會說使用clang作為前端,clang是專為llvm而開發的,所以這是最佳的搭配。在ubuntu系統上安裝:
sudo apt-get install clang
sudo apt-get install llvm
要注意的是clang和llvm實際上是兩個東西,llvm類似於乙個容器,可以使用clang作為前端外掛程式,也可以使用其他型別的前端外掛程式,因此我們需要安裝兩個。
在llvm的官網 可以檢視已經編譯好的各個平台的release版本,clang也會作為llvm release的一部分一起發布:
llvm(low level virtual machine)顧名思義它是一種虛擬機器,它在對**進行處理的時候都需要使用ir中間檔案,所以源**要被先轉換為llvm ir中間檔案(llvm intermediate representation)。
llvm在對程式進行優化的時候全部都是以ir的形式來進行優化的,它類似於是一種被llvm所使用的一種語言,可以跨平台使用,因此所有平台上的llvm都可以解釋同乙份ir,然後llvm後端再利用ir生成不同平台上的機器碼,此種型別的程式才可以正常執行。
llvm ir檔案(文字形式)
生成文字格式的ir檔案:
clang -o3 -emit-llvm helloworld.c -s -o helloworld.ll
llvm ir檔案(二進位制形式)
直接編譯生成二進位制格式ir檔案:
clang -o3 -emit-llvm helloworld.c -c -o helloworld.bc
llvm ir檔案格式轉換
.bc和.ll檔案的轉換:
llvm-as helloworld.ll //llvm .ll -> .bc assembler
llvm-dis helloworld.bc //llvm .bc -> .ll disassembler
llvm ir生成平台對應的彙編檔案
通過ir檔案生成符合目標平台上的彙編檔案,llvm後端做的事情,通過llc進行操作:
llc helloworld.ll -o helloworld.s
llvm ir生成平台對應的可執行檔案
通過ir檔案生成符合目標平台上的可執行檔案,llvm後端做的事情,通過llc進行操作:
llc -filetype=obj helloworld.ll -o helloworld.o
gcc helloworld.o
或者
llc -filetype=obj helloworld.bc -o helloworld.o
gcc helloworld.o
llvm只能保證生成obj檔案,最後都需要使用gcc進行一次鏈結才能生成可執行檔案。
llvm ir檔案link操作
llvm-link func1.bc func2.bc -o linked.bc
交叉編譯arm64平台andoird native程式
clang -o3 -emit-llvm helloworld.c -c -target aarch64-none-linux-android -o helloworld.bc # 生成aarch64-none-linux-android目標的ir檔案
clang -o3 -emit-llvm helloworld.c -s -target aarch64-none-linux-android -o helloworld.ll # 生成aarch64-none-linux-android目標的ir檔案
llc -march=aarch64 helloworld.bc -o hello.s #生成aarch64平台上的彙編檔案
llc -march=aarch64 -filetype=obj helloworld.bc -o hello.o #生成aarch64平台上的obj檔案
注意到這裡生成的hello.o並不是乙個可執行檔案,最後一步需要呼叫本地鏈結器鏈結後才可以生成最終的可執行檔案。
aarch64-linux-android-gcc hello.o #生成最後的a.out可執行檔案
參考文件: Ubuntu編譯安裝llvm clang
llvm llvm tools clang llvm projects compiler rt wget mv llvm 3.6.0.src llvm cd llvm tools wget tar xf cfe 3.6.0.src.tar.xz mv cfe 3.6.0.src clang cd l...
ubuntu安裝交叉編譯器 安裝交叉編譯器
2 安裝方法二 1 安裝方法一 開啟ubuntu終端 使用sudo apt list gcc arm 可以檢視所有的交叉編譯器,假設安裝gcc arm linux gnueabihf,則使用sudo apt get install gcc arm linux gnueabihf就裝好了。參考 2 安...
Go語言編譯器安裝
臨近回家的日子,在公司比較清閒,所以找來google新出的go語言研究研究,也是看到最新出來的程式語言排名,竟然公升到了13,一下激起了我的興趣,閒話少出。參考文章 http golang.org doc install.html 關於go語言的介紹就不在這裡羅嗦,網上會有很多,我只記錄一下我的安裝...