一、安裝
LLVM 是一個開放源代碼編譯器基礎設施,包括一系列 modul,可以進行程序代碼的優化、代碼生成、代碼調試等功能。LLVM 是一個非常強大的編譯器,但對於初學者而言,安裝 LLVM 也是必不可少的。在這一部分,我們將介紹如何安裝 LLVM。
1、下載 LLVM:下載 LLVM 安裝文件。可以在 LLVM 官方網站上下載,網址為 「http://llvm.org/releases/download.html」。可以在這裡選擇需要的 LLVM 版本以及適合自己操作系統的版本。
2、安裝 LLVM:下載完成後,解壓文件並使用以下命令進行安裝:
tar xvf <package_name>.tar.gz
cd <package_name>
./configure
make
make install
其中 configure 命令會根據系統的環境配置編譯器生成指定版本的 LLVM。make 命令會執行編譯器的編譯過程,並生成 LLVM 和 Clang 工具鏈。最後執行 make install 命令會將編譯器安裝到系統目錄下。
二、配置
假設我們已經安裝了 LLVM,下面我們就來進行相關的配置。
1、環境變數:我們需要將安裝的 LLVM 的 bin 目錄添加到環境變數中,這樣我們就可以在命令行中使用 LLVM 工具。同時也需要添加 LLVM 的 lib 目錄到 LD_LIBRARY_PATH 環境變數中,這樣在執行編譯器時,可以正確的找到庫的位置。
2、配置 Makefile:在編譯 LLVM 代碼時,需要將 LLVM 相關的頭文件和庫文件鏈接到編譯器中。因此,我們需要對Makefile 進行相應的配置。Makefile 的配置可以將 -I<LLVM 安裝目錄>/include 添加到編譯命令的頭文件路徑中,將 -L<LLVM 安裝目錄>/lib 添加到鏈接命令的庫文件路徑中。
3、使用 CMake 配置文件:在使用 LLVM 進行開發時,經常需要進行一些特殊的配置,為此,LLVM 提供了一種 CMake 配置文件(如 CMakeLists.txt)。使用該文件,我們可以進行更加靈活的配置,在項目中引入我們需要的模塊以及配置我們需要的版本等。
三、使用
在使用 LLVM 進行編譯和優化代碼時,可以使用 clang 和 llc 工具。
1、Clang:Clang 是 LLVM 的 C/C++/Objective-C 編譯器,它可以將代碼轉化為 llvm 中間碼,並進行一系列的優化以及代碼生成工作。Clang 不僅可以編譯本地代碼,還可以將代碼編譯為 WebAssembly 等其他特定平台的代碼。
// C 代碼
#include <stdio.h>
int main()
{
printf("Hello world!\n");
return 0;
}
// 使用 Clang 編譯代碼並執行
clang test.c -o test && ./test
2、llc:llc 是 LLVM 的動態彙編器,用來將 LLVM 中間代碼轉化為彙編代碼,同時可以通過 llc 工具配置輸出彙編代碼的信息。
// LLVM 中間碼
; ModuleID = 'test.c'
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"
; Function Attrs: noinline nounwind optnone uwtable
define dso_local i32 @main() local_unnamed_addr #0 {
%1 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str, i64 0, i64 0))
ret i32 0
}
declare i32 @printf(i8*, ...) #1
@.str = private unnamed_addr constant [14 x i8] c"Hello world!\0A\00", align 1
attributes #0 = { noinline nounwind optnone uwtable "disable-tail-calls"="false" "frame-pointer"="none" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { "printf-like" }
// 使用 llc 將中間碼輸出彙編代碼
llc -filetype=asm test.ll -o test.asm
四、常見問題
1、LLVM 和 Clang 的區別:LLVM 是一種編譯器基礎設施,包括諸多模塊,提供了代碼優化、代碼生成和代碼調試等功能。而 Clang 是 LLVM 的 C/C++/Objetive-C 編譯器。
2、LLVM 是否支持其他編程語言:LLVM 支持的編程語言不僅僅局限於 C/C++/Objective-C 等主流語言。LLVM 提供了一套通用的 IR 中間表示,並且還支持將 IR 轉化為 JavaScript/Python 等腳本語言。
3、如何排查某個 LLVM 模塊無法工作的問題:使用 LLVM 自帶的 LLDB 工具即可進行排查,其可以支持 LLVM 內部的調試,並且還支持 Visual Studio、XCode 等常見的調試 IDE。
原創文章,作者:UWPHS,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/361752.html