教程LLVM(变量编译器您可以命令版本)「llvm 编译」

为了学习如何使用 LLVM,最好从源代码编译 LLVM 开始
LLVM 是一个总称项目,其 GitHub 仓库包含了所有属于 LLVM 项目的源代码
每个 LLVM 项目都位于仓库的顶级目录中
除了克隆仓库外,您的系统还必须安装构建系统所需的所有工具
在本章中,您将了解以下主题:准备先决条件,这将向您展示如何设置构建系统 从源代码克隆仓库并构建,这将涵盖如何获取 LLVM 源代码,以及如何使用 CMake 和 Ninja 编译和安装 LLVM 核心库和 clang 自定义构建过程,这将讨论影响构建过程的各种可能性 编译 LLVM 与安装二进制文件 您可以从各种来源安装 LLVM 二进制文件
如果您使用的是 Linux,则您的发行版包含 LLVM 库
为什么还要自己编译 LLVM?首先,并非所有安装包都包含开发 LLVM 所需的所有文件
自己编译和安装 LLVM 可以避免这个问题
另一个原因源于 LLVM 高度可定制的事实
通过构建 LLVM,您将了解如何自定义 LLVM,这将使您能够在将 LLVM 应用程序带到另一个平台时诊断可能出现的问题
最后,在本书的第三部分,您将扩展 LLVM 本身,为此,您需要自己构建 LLVM 的技能
然而,对于最初几步,完全避免编译 LLVM 是完全可以的
如果您想走这条路,那么您只需要按照下一节中描述的方式安装先决条件
注意许多 Linux 发行版将 LLVM 分为几个包
请确保您安装了开发包
例如,在 Ubuntu 上,您需要安装 llvm-dev 包
还请确保您安装了 LLVM 17
对于其他版本,本书中的示例可能需要更改
准备先决条件 要使用 LLVM,您的开发系统应该运行一个常见的操作系统,如 Linux、FreeBSD、macOS 或 Windows
您可以以不同的模式构建 LLVM 和 clang
启用调试符号的构建可能占用高达 30 GB 的空间
所需的磁盘空间严重依赖于所选的构建选项
例如,仅构建 LLVM 核心库,以发布模式为目标,仅针对一个平台,需要大约 2 GB 的空闲磁盘空间,这是所需的最低限度
为了减少编译时间,拥有一个快速的 CPU(例如具有 2.5 GHz 时钟速度的四核 CPU)和快速的 SSD 也是有帮助的
甚至可以在 Raspberry Pi 这样的小型设备上构建 LLVM —— 只是需要很长时间
本书中的示例是在一台搭载 2.7 GHz 时钟速度的 Intel 四核 CPU、40 GB RAM 和 2.5 TB SSD 磁盘空间的笔记本电脑上开发的
这个系统非常适合开发任务
您的开发系统必须安装一些先决条件软件
让我们回顾一下这些软件包的最小所需版本
要从 GitHub 检出源代码,您需要 Git (https://git-scm.com/)
没有特定版本的要求
GitHub 帮助页面建议至少使用 1.17.10 版本
由于过去发现的已知安全问题,建议使用最新可用版本,即撰写时的 2.39.1 版本
LLVM 项目使用 CMake (https://cmake.org/) 作为构建文件生成器
至少需要 3.20.0 版本
CMake 可以为各种构建系统生成构建文件
在本书中,使用 Ninja (https://ninja-build.org/) 是因为它快速且在所有平台上都可用
建议使用最新版本 1.11.1
显然,您还需要一个 C/C++ 编译器
LLVM 项目是用基于 C++17 标准的现代 C++ 编写的
需要一个符合标准的编译器和标准库
以下是已知与 LLVM 17 兼容的编译器:gcc 7.1.0 或更高版本 clang 5.0 或更高版本 Apple clang 10.0 或更高版本 Visual Studio 2019 16.7 或更高版本 提示请注意,随着 LLVM 项目的进一步开发,编译器的要求最有可能发生变化
一般来说,您应该使用系统上可用的最新编译器版本
Python (https://python.org/) 在生成构建文件和运行测试套件期间使用
它至少应该是 3.8 版本
尽管本书没有涵盖,但您可能需要使用 Make 而不是 Ninja
在这种情况下,您需要使用 GNU Make (https://www.gnu.org/software/make/) 版本 3.79 或更高版本
两种构建工具的使用非常相似
在下面描述的场景中,只需将每个命令中的 ninja 替换为 make 即可
LLVM 还依赖于 zlib 库 (https://www.zlib.net/)
您应该至少安装了 1.2.3.4 版本
像往常一样,我们建议使用最新版本,即 1.2.13
安装先决条件软件的最简单方法是使用操作系统的包管理器
在接下来的部分中,将显示为最流行的操作系统安装软件所需的命令
Ubuntu Ubuntu 22.04 使用 apt 包管理器
大多数基本实用程序已经安装;缺少的只是开发工具
要一次性安装所有包,您需要输入以下命令:$ sudo apt -y install gcc g++ git cmake ninja-build zlib1g-devFedora 和 RedHat Fedora 37 和 RedHat Enterprise Linux 9 的包管理器称为 dnf
像 Ubuntu 一样,大多数基本实用程序已经安装
要一次性安装所有包,您需要输入以下命令:$ sudo dnf –y install gcc gcc-c++ git cmake ninja-build \ zlib-develFreeBSD 在 FreeBSD 13 或更高版本上,您必须使用 pkg 包管理器
与基于 Linux 的系统不同,FreeBSD 已经安装了 clang 编译器
要一次性安装所有其他包,您需要输入以下命令:$ sudo pkg install –y git cmake ninja zlib-ngOS X 对于 OS X 的开发,最好从 Apple 商店安装 Xcode
虽然本书中没有使用 Xcode IDE,但它带有所需的 C/C++ 编译器和支持实用程序
对于其他工具的安装,可以使用包管理器 Homebrew (https://brew.sh/)
要一次性安装所有包,您需要输入以下命令:$ brew install git cmake ninja zlibWindows 像 OS X 一样,Windows 没有包管理器
对于 C/C++ 编译器,您需要下载 Visual Studio Community 2022 (https://visualstudio.microsoft.com/vs/community/),这对于个人使用是免费的
请确保您安装了名为 Desktop Development with C++ 的工作负载
您可以使用包管理器 Scoop (https://scoop.sh/) 安装其他包
按照网站上的说明安装 Scoop 后,您从 Windows 菜单中打开 x64 Native Tools Command Prompt for VS 2022
要安装所需的包,您需要输入以下命令:$ scoop install git cmake ninja python gzip bzip2 coreutils$ scoop bucket add extras$ scoop install zlib请仔细查看 Scoop 的输出
对于 Python 和 zlib 包,它建议添加一些注册表键
这些条目是必要的,以便其他软件可以找到这些包
要添加注册表键,您最好复制并粘贴 Scoop 的输出,如下所示:$ %HOMEPATH%\scoop\apps\python\current\install-pep-514.reg$ %HOMEPATH%\scoop\apps\zlib\current\register.reg在每个命令之后,注册表编辑器会弹出一个消息窗口,询问您是否真的想要导入这些注册表键
您需要点击“是”以完成导入
现在所有先决条件都已安装
对于本书中的所有示例,您必须使用 x64 Native Tools Command Prompt for VS 2022
使用此命令提示符,编译器会自动添加到搜索路径
提示LLVM 代码库非常大
为了舒适地导航源代码,我们建议使用允许您跳转到类定义并搜索源代码的 IDE
我们发现 Visual Studio Code (https://code.visualstudio.com/download),这是一个可扩展的跨平台 IDE,非常舒适易用
然而,这并不是遵循本书示例的要求
克隆仓库并从源代码构建 准备好构建工具后,您现在可以从 GitHub 检出所有 LLVM 项目并构建 LLVM
这个过程在所有平台上基本相同:配置 Git
克隆仓库
创建构建目录
生成构建系统文件
最后,构建并安装 LLVM
让我们从配置 Git 开始
配置 Git LLVM 项目使用 Git 进行版本控制
如果您之前没有使用过 Git,那么在继续之前,您应该先对 Git 进行一些基本配置:设置用户名和电子邮件地址
如果您提交更改,这两个信息都会被使用
您可以使用以下命令检查 Git 中是否已配置了电子邮件和用户名:$ git config user.email$ git config user.name上述命令将输出您在使用 Git 时已经设置的电子邮件和用户名
然而,如果您是第一次设置用户名和电子邮件,可以输入以下命令进行首次配置
在以下命令中,您可以简单地将 Jane 替换为您的名字,将 jane@email.org 替换为您的电子邮件:$ git config --global user.email "jane@email.org"$ git config --global user.name "Jane"这些命令更改了全局 Git 配置
在 Git 仓库中,您可以通过不指定 --global 选项来覆盖这些值
默认情况下,Git 使用 vi 编辑器来编写提交信息
如果您更喜欢其他编辑器,那么可以以类似的方式更改配置
要使用 nano 编辑器,您输入以下命令:$ git config --global core.editor nano有关 Git 的更多信息,请参见 Git 版本控制手册 (https://www.packtpub.com/product/git-version-control-cookbook-second-edition/9781789137545)
现在您已准备好从 GitHub 克隆 LLVM 仓库
克隆仓库 克隆仓库的命令在所有平台上基本相同
只有在 Windows 上,建议关闭自动转换行尾
在所有非 Windows 平台上,您输入以下命令来克隆仓库:$ git clone https://github.com/llvm/llvm-project.git只有在 Windows 上,添加选项以禁用自动转换行尾
在这里,您输入以下命令:$ git clone --config core.autocrlf=false \ https://github.com/llvm/llvm-project.git这个 Git 命令将 GitHub 上的最新源代码克隆到名为 llvm-project 的本地目录中
现在使用以下命令将当前目录更改为新的 llvm-project 目录:$ cd llvm-project目录中包含了所有 LLVM 项目,每个项目都有自己的目录
最值得注意的是,LLVM 核心库位于 llvm 子目录中
LLVM 项目使用分支进行后续的发布开发(“release/17.x”)和标签(“llvmorg-17.0.1”)来标记某个特定发布
使用前面的克隆命令,您将获得当前的开发状态
本书使用 LLVM 17
要检出 LLVM 17 的第一个发布版本到名为 llvm-17 的分支,您输入以下命令:$ git checkout -b llvm-17 llvmorg-17.0.1通过前面的步骤,您克隆了整个仓库并从标签创建了一个分支
这是最灵活的方法
Git 还允许您只克隆一个分支或一个标签(包括历史记录)
使用 git clone --branch release/17.x https://github.com/llvm/llvm-project,您只克隆 release/17.x 分支及其历史记录
然后您就有了 LLVM 17 发布分支的最新状态,所以如果您需要确切的发布版本,您只需要像之前一样从发布标签创建一个分支
使用附加的 --depth=1 选项,这在 Git 中被称为浅克隆,您可以防止克隆历史记录
这节省了时间和空间,但显然限制了您可以在本地执行的操作,包括基于发布标签检出分支
创建构建目录 与许多其他项目不同,LLVM 不支持内联构建,需要一个单独的构建目录
最容易的做法是在 llvm-project 目录内创建,这是您当前的目录
让我们将构建目录命名为 build,以简化操作
在这里,Unix 和 Windows 系统的命令不同
在类 Unix 系统上,您使用以下命令:$ mkdir build在 Windows 上,使用以下命令:$ md build现在您准备好在这个目录中使用 CMake 工具创建构建系统文件了
生成构建系统文件 为了生成编译 LLVM 和 clang 的构建系统文件,使用 Ninja,您运行以下命令:$ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release \ -DLLVM_ENABLE_PROJECTS=clang -B build -S llvm-G 选项告诉 CMake 为哪个系统生成构建文件
该选项的常用值如下:Ninja – 为 Ninja 构建系统 Unix Makefiles – 为 GNU Make Visual Studio 17 VS2022 – 为 Visual Studio 和 MS Build Xcode – 为 Xcode 项目使用 -B 选项,您告诉 CMake 构建目录的路径
同样,您使用 -S 选项指定源目录
生成过程可以通过设置各种变量来影响,这些变量使用 -D 选项设置
通常,它们以 CMAKE_(如果由 CMake 定义)或 LLVM_(如果由 LLVM 定义)为前缀
如前所述,我们还对同时编译 clang 和 LLVM 感兴趣
通过 LLVM_ENABLE_PROJECTS=clang 变量设置,这允许 CMake 生成 clang 的构建文件以及 LLVM
此外,CMAKE_BUILD_TYPE=Release 变量告诉 CMake 它应该为发布构建生成构建文件
-G 选项的默认值取决于您的平台,默认的构建类型取决于工具链
但是,您可以使用环境变量定义自己的偏好
CMAKE_GENERATOR 变量控制生成器,CMAKE_BUILD_TYPE 变量指定构建类型
如果您使用 bash 或类似的 shell,那么您可以使用以下命令设置变量:$ export CMAKE_GENERATOR=Ninja$ export CMAKE_BUILD_TYPE=Release如果您使用的是 Windows 命令提示符,那么您可以使用以下命令设置变量:$ set CMAKE_GENERATOR=Ninja$ set CMAKE_BUILD_TYPE=Release有了这些设置,创建构建系统文件的命令就变成了以下这样,更容易输入:$ cmake -DLLVM_ENABLE_PROJECTS=clang -B build -S llvm您将在“自定义构建过程”部分找到有关 CMake 变量的更多信息
编译和安装 LLVM 生成构建文件后,可以使用以下命令编译 LLVM 和 clang:$ cmake –-build build该命令在后台运行 Ninja,因为我们告诉 CMake 在配置步骤中生成 Ninja 文件
但是,如果您为支持多个构建配置的系统(如 Visual Studio)生成构建文件,则需要使用 --config 选项指定要用于构建的配置
根据硬件资源,此命令的运行时间从 15 分钟(拥有大量 CPU 核心、内存和快速存储的服务器)到几个小时(具有有限内存的双核心 Windows 笔记本电脑)不等
默认情况下,Ninja 利用所有可用的 CPU 核心
这对编译速度有好处,但可能会阻止其他任务的运行;例如,在 Windows 笔记本电脑上,当 Ninja 运行时几乎不可能上网
幸运的是,您可以使用 -j 选项限制资源使用
假设您有四个 CPU 核心可用,Ninja 只应该使用两个(因为您有并行任务要运行);然后您使用此命令进行编译:$ cmake --build build –j2编译完成后,最佳实践是运行测试套件以检查一切是否按预期工作:$ cmake --build build --target check-all再次,此命令的运行时间根据可用的硬件资源而有很大差异
check-all Ninja 目标运行所有测试用例
为包含测试用例的每个目录生成目标
使用 check-llvm 而不是 check-all 运行 LLVM 测试而不是 clang 测试;check-llvm-codegen 仅运行来自 LLVM 的 CodeGen 目录中的测试(即,llvm/test/CodeGen 目录)
您也可以进行快速的手动检查
LLVM 应用程序之一是 llc,LLVM 编译器
如果您使用 -version 选项运行它,它会显示 LLVM 版本、主机 CPU 和所有支持的架构:$ build/bin/llc --version如果您在编译 LLVM 时遇到麻烦,那么您应该参考“开始使用 LLVM 系统”文档中的“常见问题”部分 (https://releases.llvm.org/17.0.1/docs/GettingStarted.html#common-problems) 以解决典型问题
作为最后一步,您可以安装二进制文件:$ cmake --install build在类 Unix 系统上,安装目录是 /usr/local
在 Windows 上,使用 C:\Program Files\LLVM
这当然可以更改
下一节解释了如何进行更改
自定义构建过程 CMake 系统在 CMakeLists.txt 文件中使用项目描述
顶级文件位于 llvm 目录中,llvm/CMakeLists.txt
其他目录也有 CMakeLists.txt 文件,在生成过程中递归包含
基于项目描述中提供的信息,CMake 检查已安装的编译器,检测库和符号,并创建构建系统文件,例如 build.ninja 或 Makefile(取决于所选的生成器)
还可以定义可重用的模块,例如,一个函数来检测 LLVM 是否已安装
这些脚本放置在特殊的 cmake 目录(llvm/cmake)中,在生成过程中自动搜索
构建过程可以通过定义 CMake 变量来自定义
使用命令行选项 -D 将变量设置为值
这些变量在 CMake 脚本中使用
CMake 自身定义的变量几乎总是以 CMAKE_ 为前缀,这些变量可以在所有项目中使用
LLVM 定义的变量以 LLVM_ 为前缀,但只有在项目定义中包含 LLVM 的使用时才能使用
由 CMake 定义的变量 一些变量会根据环境变量的值进行初始化
最值得注意的是 CC 和 CXX,它们定义了用于构建的 C 和 C++ 编译器
CMake 会尝试自动定位 C 和 C++ 编译器,使用当前的 shell 搜索路径
它会选取找到的第一个编译器
如果您安装了多个编译器,例如 gcc 和 clang,或者 clang 的不同版本,那么这可能不是您想要用于构建 LLVM 的编译器
假设您想使用 clang17 作为 C 编译器,使用 clang++17 作为 C++ 编译器
那么,您可以在 Unix shell 中以以下方式调用 CMake:$ CC=clang17 CXX=clang++17 cmake –B build –S llvm这只为 cmake 的调用设置了环境变量的值
如果需要,您可以为编译器可执行文件指定绝对路径
CC 是 CMake 变量 CMAKE_C_COMPILER 的默认值,CXX 是 CMAKE_CXX_COMPILER 的默认值
而不是使用环境变量,您可以直接设置 CMake 变量
这等同于前面的调用:$ cmake –DCMAKE_C_COMPILER=clang17 \ -DCMAKE_CXX_COMPILER=clang++17 –B build –S llvmCMake 定义的其他有用变量如下:变量名称用途CMAKE_INSTALL_PREFIX这是安装期间预先添加到每个路径的前缀
默认值是 Unix 上的 /usr/local 和 Windows 上的 C:\Program Files<Project>
要将 LLVM 安装在 /opt/llvm 目录中,您指定 -DCMAKE_INSTALL_PREFIX=/opt/llvm
二进制文件被复制到 /opt/llvm/bin,库文件被复制到 /opt/llvm/lib 等
CMAKE_BUILD_TYPE不同类型的构建需要不同的设置
例如,调试构建需要指定生成调试符号的选项,并且通常链接到系统库的调试版本
相比之下,发布构建使用优化标志,并链接到库的生产版本
此变量仅用于只能处理一种构建类型的构建系统,例如 Ninja 或 Make
对于 IDE 构建系统,生成所有变体,并且您必须使用 IDE 的机制在构建类型之间切换
可能的值为:DEBUG(带有调试符号的构建)、RELEASE(优化速度的构建)、RELWITHDEBINFO(带有调试符号的发布构建)、MINSIZEREL(优化大小的构建)
默认构建类型从环境变量 CMAKE_BUILD_TYPE 中获取
如果未设置此变量,则默认值取决于所使用的工具链,通常为空
为了生成发布构建的构建文件,您指定 -DCMAKE_BUILD_TYPE=RELEASE
CMAKE_C_FLAGSCMAKE_CXX_FLAGSCMAKE_MODULE_PATH这指定了搜索 CMake 模块的附加目录
在搜索默认目录之前,会搜索指定的目录
该值是目录的分号分隔列表
PYTHON_EXECUTABLE如果未找到 Python 解释器,或者在安装了多个版本的情况下选择了错误的解释器,您可以将此变量设置为 Python 二进制文件的路径
只有在包含 CMake 的 Python 模块时(对于 LLVM 是这样),此变量才有效
CMake 提供了内置的帮助,用于变量
--help-variable var 选项打印了有关 var 变量的帮助
例如,您可以通过键入以下内容来获取 CMAKE_BUILD_TYPE 的帮助:$ cmake --help-variable CMAKE_BUILD_TYPE您也可以使用以下命令列出所有变量:$ cmake --help-variable-list这个列表非常长
您可能希望将输出管道传输到 more 或类似的程序
使用 LLVM 定义的构建配置变量 LLVM 定义的构建配置变量的工作原理与 CMake 定义的变量相同,只是没有内置帮助
最有用的变量如下表所示,它们被分为对首次安装 LLVM 的用户有用的变量和对更高级的 LLVM 用户有用的变量
对首次安装 LLVM 的用户有用的变量变量名称用途LLVM_TARGETS_TO_BUILDLLVM 支持为不同的 CPU 架构生成代码
默认情况下,所有这些目标都会构建
使用此变量可以指定要构建的目标列表,用分号分隔
当前目标有 AArch64、AMDGPU、ARM、AVR、BPF、Hexagon、Lanai、LoongArch、Mips、MSP430、NVPTX、PowerPC、RISCV、Sparc、SystemZ、VE、WebAssembly、X86 和 XCore
all 可以用作所有目标的简写
名称是区分大小写的
要仅启用 PowerPC 和 System Z 目标,您指定 -DLLVM_TARGETS_TO_BUILD="PowerPC;SystemZ"
LLVM_EXPERIMENTAL_TARGETS_TO_BUILD除了官方目标外,LLVM 源代码树还包含实验性目标
这些目标正在开发中,通常还不支持后端的完整功能
当前的实验性目标列表是 ARC、CSKY、DirectX、M68k、SPIRV 和 Xtensa
要构建 M68k 目标,您指定 -D LLVM_EXPERIMENTAL_TARGETS_TO_BUILD=M68k
LLVM_ENABLE_PROJECTS这是您想要构建的项目列表,用分号分隔
项目的源代码必须与 llvm 目录同级(并排布局)
当前列表是 bolt、clang、clang-tools-extra、compiler-rt、cross-project-tests、libc、libclc、lld、lldb、mlir、openmp、polly 和 pstl
all 可以用作此列表中所有项目的简写
此外,您还可以在此处指定 flang 项目
由于一些特殊的构建要求,它尚未成为 all 列表的一部分
要与 LLVM 一起构建 clang 和 bolt,您指定 -DLLVM_ENABLE_PROJECT="clang;bolt"
高级 LLVM 用户的变量变量名称用途LLVM_ENABLE_ASSERTIONS如果设置为 ON,则启用断言检查
这些检查有助于发现错误,在开发过程中非常有用
默认值为 DEBUG 构建为 ON,否则为 OFF
要启用断言检查(例如对于 RELEASE 构建),您指定 –DLLVM_ENABLE_ASSERTIONS=ON
LLVM_ENABLE_EXPENSIVE_CHECKS这会启用一些成本较高的检查,这些检查可能会显著降低编译速度或消耗大量内存
默认值为 OFF
要启用这些检查,您指定 -DLLVM_ENABLE_EXPENSIVE_CHECKS=ON
LLVM_APPEND_VC_REVLLVM 工具(如 llc)在给出 –version 命令行选项时,会显示它们所基于的 LLVM 版本以及其他信息
这个版本信息基于 LLVM_REVISION C 宏
默认情况下,不仅是 LLVM 版本,当前的 Git 哈希也是版本信息的一部分
如果您正在跟踪主分支的开发,这将非常有用,因为它清楚地表明工具基于哪个 Git 提交
如果不需要,那么可以用 –DLLVM_APPEND_VC_REV=OFF 关闭它
LLVM_ENABLE_THREADS如果检测到线程库(通常是 pthreads 库),LLVM 会自动包含线程支持
此外,在这种情况下,LLVM 假定编译器支持 TLS(线程本地存储)
如果您不希望线程支持或您的编译器不支持 TLS,那么您可以用 -DLLVM_ENABLE_THREADS=OFF 关闭它
LLVM_ENABLE_EHLLVM 项目不使用 C++ 异常处理,因此默认情况下关闭异常支持
此设置可能与您的项目链接的其他库不兼容
如果需要,您可以通过指定 –DLLVM_ENABLE_EH=ON 来启用异常支持
LLVM_ENABLE_RTTILLVM 使用轻量级、自建系统进行运行时类型信息(RTTI)
默认情况下关闭 C++ RTTI 的生成
像异常处理支持一样,这可能与其他库不兼容
要启用 C++ RTTI 的生成,您指定 –DLLVM_ENABLE_RTTI=ON
LLVM_ENABLE_WARNINGS编译 LLVM 应该尽可能不生成警告消息
因此,默认情况下启用打印警告消息的选项
要关闭它,您指定 –DLLVM_ENABLE_WARNINGS=OFF
LLVM_ENABLE_PEDANTICLLVM 源代码应该符合 C/C++ 语言标准;因此,默认情况下启用了源代码的严格检查
如果可能,还会禁用特定于编译器的扩展
要反转此设置,您指定 –DLLVM_ENABLE_PEDANTIC=OFF
LLVM_ENABLE_WERROR如果设置为 ON,则所有警告都被视为错误——一旦找到警告,编译就会中止
这有助于发现源代码中的所有剩余警告
默认情况下,它被关闭
要打开它,您指定 –DLLVM_ENABLE_WERROR=ON
LLVM_OPTIMIZED_TABLEGEN通常,tablegen 工具的构建选项与 LLVM 的其他部分相同
同时,tablegen 用于生成代码生成器的大部分代码
结果是,在调试构建中,tablegen 要慢得多,显著增加了编译时间
如果将此选项设置为 ON,则即使对于调试构建,tablegen 也会以开启优化的方式编译,可能减少编译时间
默认为 OFF
要打开它,您指定 –DLLVM_OPTIMIZED_TABLEGEN=ON
LLVM_USE_SPLIT_DWARF如果构建编译器是 gcc 或 clang,则打开此选项将指示编译器在单独的文件中生成 DWARF 调试信息
对象文件的减小大小显著减少了调试构建的链接时间
默认为 OFF
要打开它,您指定 -LLVM_USE_SPLIT_DWARF=ON
注意LLVM 定义了许多 CMake 变量
您可以在 LLVM 文档中找到完整列表,网址是 https://releases.llvm.org/17.0.1/docs/CMake.html#llvm-specific-variables
前面的列表只包含您最有可能需要的变量
总结 在本章中,您准备了开发机器以编译 LLVM
您克隆了 GitHub 仓库并编译了自己的 LLVM 和 clang 版本
构建过程可以通过 CMake 变量进行自定义
您了解了有用变量及其如何更改的知识,有了这些知识,您可以根据需要调整 LLVM
在下一节中,我们将更仔细地查看编译器的结构
我们将探索编译器内部的不同组件以及其中发生的不同类型的分析——具体来说,是词法、语法和语义分析
最后,我们也将简要触及与 LLVM 后端进行代码生成的接口
教程LLVM(变量编译器您可以命令版本)
(图片来源网络,侵删)

联系我们

在线咨询:点击这里给我发消息