概述
欢迎来到LLVM项目!在开始之前,您首先需要了解一些基本信息。
首先,LLVM项目有多个组件。该项目的核心本身称为LLVM。它包含处理中间表示并将其转换为目标文件所需的所有工具,库和头文件。它包含汇编器,反汇编器,字节码分析器和字节码优化器。它还包含基本的回归测试。
其中一个重要组件是Clang前端,该组件将C,C++,Objective C和Objective C++代码编译为LLVM字节码(使用LLVM把他们编译成目标文件)。
还有其他的组件: libc++(C++标准库), LLD 连接器, 等等。
快速开始
LLVM入门文档可能已过期,Clang快速入门可能是一个很好的起点。
以下是使用LLVM快速启动和运行的简短故事:
阅读文档
阅读文档
请记住,您在阅读文档时被警告了两次
签出LLVM(包括像Clang这样的相关子项目):
$ git clone https://github.com/llvm/llvm-project.git
# on Windows
$ git clone --config core.autocrlf=false https://github.com/llvm/llvm-project.git配置并构建LLVM和Clang:
$ cd llvm-project
$ mkdir build
$ cd build
$ cmake -G <generator> [options] ../llvm一些常见的 generator:
- Ninja : 用于生产Ninja配置文件,大多数的LLVM开发之使用Ninja。
- Unix Makefiles : 用于生成兼容make的并行makefile
- Visual Studio : 用于生成Visual Studio项目和解决方案
- Xcode :用于生成Xcode项目
一些常见的选项:
-DLLVM_ENABLE_PROJECTS=’…’ :您要另外构建的LLVM子项目的以分号分隔的列表。可以包括以下任何一个:clang,clang-tools-extra,libcxx,libcxxabi,libunwind,lldb,compiler-rt,lld,polly或debuginfo-tests。
例如,要构建LLVM,Clang,libcxx和libcxxabi,请使用 -DLLVM_ENABLE_PROJECTS=”clang;libcxx;libcxxabi”。
-DCMAKE_INSTALL_PREFIX=directory :指定您希望安装LLVM工具和库的完整路径(默认值是
/usr/local
)-DCMAKE_BUILD_TYPE=type : type 的有效选项是Debug,Release,RelWithDebInfo和MinSizeRel。默认为Debug。
-DLLVM_ENABLE_ASSERTIONS=On : 启用断言检查进行编译(对于Debug构建,默认值为Yes,对于所有其他构建类型,默认值为No)
运行你选择的构建工具
- ninja或make 默认将构建所有LLVM的所有项目
check-all
目标将运行回归测试来确保一切正常。- CMake会为每个工具和库生成构建目标,并且大多数LLVM子项目会生成自己的check-
目标 - 如果使用串行化的构建将会非常慢,请确保使用并行构建,Ninja默认使用并行构建,make话,请使用
make -j NNN
(NNN一般使用CPU的个数) - 更多的信息参阅CMake
LLVM工具链的使用示例
本节给出了使用带有Clang前端的LLVM的示例。
Clang示例
首先,创建一个简单的C文件,”hello.c”:
#include <stdio.h>
int main() {
printf("hello world\n");
return 0;
}接着,我们将”hello.c”编译为可执行文件:
$ clang hello.c -o hello
注意
Clang默认就像GCC一样工作。标准-S和-c参数相同(分别生成本机.s或.o文件)。
我们将”hello.c”编译为LLVM字节码文件
$ clang -O3 -emit-llvm hello.c -c -o hello.bc
-emit-llvm
选项可与-S
或-c
选项一起使用,以分别为代码发出LLVM.ll
或.bc
文件。这允许您在bitcode文件上使用标准LLVM工具.使用两种方式运行程序:
$ ./hello
$ lli hello.bc第二条命令演示了如何调用LLVM JIT,lli
使用
llvm-dis
命令查看LLVM的汇编代码:$ llvm-dis < hello.bc | less
使用llc将程序编译为本地汇编代码:
$ llc hello.bc -o hello.s
将本地汇编语言文件编译为可执行程序:
# On Solaris
% /opt/SUNWspro/bin/cc -xarch=v9 hello.s -o hello.native
# On others
% gcc hello.s -o hello.native执行本地代码程序:
./hello.native
请注意,使用clang直接编译为本机代码(即,当 -emit-llvm选项不存在时)会为您执行步骤6/7/8。