一、安装
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。