开始使用LLVM系统

概述

欢迎来到LLVM项目!在开始之前,您首先需要了解一些基本信息。

首先,LLVM项目有多个组件。该项目的核心本身称为LLVM。它包含处理中间表示并将其转换为目标文件所需的所有工具,库和头文件。它包含汇编器,反汇编器,字节码分析器和字节码优化器。它还包含基本的回归测试。

其中一个重要组件是Clang前端,该组件将C,C++,Objective C和Objective C++代码编译为LLVM字节码(使用LLVM把他们编译成目标文件)。

还有其他的组件: libc++(C++标准库), LLD 连接器, 等等。

快速开始

LLVM入门文档可能已过期,Clang快速入门可能是一个很好的起点。

以下是使用LLVM快速启动和运行的简短故事:

  1. 阅读文档

  2. 阅读文档

  3. 请记住,您在阅读文档时被警告了两次

  4. 签出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
  5. 配置并构建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)

  6. 运行你选择的构建工具

    • ninja或make 默认将构建所有LLVM的所有项目
    • check-all目标将运行回归测试来确保一切正常。
    • CMake会为每个工具和库生成构建目标,并且大多数LLVM子项目会生成自己的check-目标
    • 如果使用串行化的构建将会非常慢,请确保使用并行构建,Ninja默认使用并行构建,make话,请使用make -j NNN(NNN一般使用CPU的个数)
    • 更多的信息参阅CMake

LLVM工具链的使用示例

本节给出了使用带有Clang前端的LLVM的示例。

Clang示例

  1. 首先,创建一个简单的C文件,”hello.c”:

    #include <stdio.h>

    int main() {
    printf("hello world\n");
    return 0;
    }
  2. 接着,我们将”hello.c”编译为可执行文件:

    $ clang hello.c -o hello

    注意

    Clang默认就像GCC一样工作。标准-S和-c参数相同(分别生成本机.s或.o文件)。

  3. 我们将”hello.c”编译为LLVM字节码文件

    $ clang -O3 -emit-llvm hello.c -c -o hello.bc

    -emit-llvm选项可与-S-c选项一起使用,以分别为代码发出LLVM .ll.bc文件。这允许您在bitcode文件上使用标准LLVM工具.

  4. 使用两种方式运行程序:

    $ ./hello

    $ lli hello.bc

    第二条命令演示了如何调用LLVM JIT,lli

  5. 使用llvm-dis命令查看LLVM的汇编代码:

    $ llvm-dis < hello.bc | less
  6. 使用llc将程序编译为本地汇编代码:

    $ llc hello.bc -o hello.s
  7. 将本地汇编语言文件编译为可执行程序:

    # On Solaris
    % /opt/SUNWspro/bin/cc -xarch=v9 hello.s -o hello.native
    # On others
    % gcc hello.s -o hello.native
  8. 执行本地代码程序:

    ./hello.native

请注意,使用clang直接编译为本机代码(即,当 -emit-llvm选项不存在时)会为您执行步骤6/7/8。