LLVM 工具链分类整理

一览

1. 编译与编译器相关工具
功能工具
前端工具clang, clang++, clang-cl, flang, flang-new
后端工具llc, llvm-as, llvm-dis, llvm-objcopy, llvm-objdump, llvm-link, llvm-extract, llvm-isel-fuzzer
链接器ld.lld, lld-link, wasm-ld, nvptx-arch
二进制分析llvm-ar, llvm-ranlib, llvm-nm, llvm-size, llvm-strip
2. 测试与调试相关工具
功能工具
调试工具llvm-dwarfdump, llvm-symbolizer, llvm-debuginfo-analyzer, llvm-debuginfod-find
测试工具FileCheck, not, scan-build, scan-build-py, scan-view
性能测试clang-check, opt, llvm-profdata, llvm-cov, llvm-mca, llvm-exegesis
3. 专用工具
功能工具
机器学习与优化mlir-opt, mlir-tblgen, mlir-reduce, mlir-lsp-server
代码生成器tblgen-lsp-server, clang-tblgen, llvm-tblgen
Fortran 相关工具fir-opt, f18-parse-demo
4. 测试支持与开发辅助工具
功能工具
测试生成器bugpoint, clang-fuzzer-dictionary
依赖分析与构建辅助clang-scan-deps, intercept-build, analyze-build
5. 系统和库工具
功能工具
库工具llvm-lib, llvm-libtool-darwin, llvm-addr2line
资源工具llvm-config, llvm-cat, llvm-readelf, llvm-readobj
6. 辅助与实验性工具
功能工具
工具生成器clang-import-test, clang-installapi, llvm-reduce
分析器与格式化工具clang-format, clang-diff, diagtool

常用工具链

  • clang
  • clang++
  • clang-cl→模拟 Microsoft 的 Visual C++ 编译器,用于在 Windows 上兼容 MSVC 工具链
  • llc
  • lld
  • ld. lld
  • llvm-as
  • llvm-dis
  • llvm-link
  • opt

次常见工具链

  • llvm-ar
  • llvm-nm
  • llvm-size
  • llvm-objdump
  • llvm-strip

调试与分析测试工具

  • llvm-symbolizer→将堆栈跟踪中的地址转换为函数名、文件名和行号,用于调试
  • llvm-dwarfdump→检查 DWARF 调试信息
  • llvm-xray→用于代码分析和性能优化的工具,通过插桩生成跟踪数据
  • llvm-mca→模拟机器代码执行,分析性能瓶颈
  • llvm-profdata→用于分析和处理性能分析数据文件(Profile Data)
  • llvm-cov→用于生成代码覆盖率报告
  • llvm-exegesis→生成性能基准,用于分析 CPU 指令的延迟和吞吐量
  • llvm-lit→LLVM 的测试框架,执行单元测试和回归测试

其他

  • clang-tidy→用于静态分析和代码风格检查
  • scan-build→通过 Clang 对 C/C++ 项目进行静态分析,集成编译过程
  • clang-format→用于格式化 C/C++/Objective-C 源代码
  • llvm-config→提供关于 LLVM 安装的信息,例如版本号、库路径、编译标志
  • llvm-cat→用于简单地连接多个 LLVM IR 文件
  • clang-scan-deps→分析和跟踪文件依赖
个人觉得眼前一亮的工具链
  • obj2yaml 与yaml2obj:将 ELF/COFF/Mach-O 等对象文件转为 YAML 格式以便阅读或测试。反之可以方便快捷编写. o 文件
  • llvm-opt-fuzzer:Fuzz 测试 LLVM 优化器中的 Pass 管道,发现崩溃或非预期行为
  • llvm-isel-fuzzer:Fuzz 测试 LLVM 后端的指令选择器(Instruction Selection),用于发现代码生成崩溃或错误。
  • llvm-dwp:合并多个 DWARF .dwo 文件成一个 .dwp 文件,供调试用(DWARF 5)
  • llvm-extract:从 LLVM bitcode 中提取单个函数或全局变量,生成最小测试样例
  • llvm-opt-report:显示编译器优化信息(如矢量化、循环展开)的人类可读报告。
  • llvm-undname:将 MSVC 风格的 C++ 符号名称(mangled)还原成人类可读形式(demangle)。
  • llvm-pdbutil:分析和提取 Microsoft PDB(调试信息)文件中的内容。
  • llvm-ml:LLVM 版 MASM 汇编器,兼容 MSVC 的 .asm 文件语法。
  • llvm-mt:LLVM 版 mt.exe 工具,用于操作 Windows 清单(manifest)文件。
  • llvm-ifs:生成和处理 ELF 接口描述文件(Interface Stub),支持模块化构建与 ABI 检查。
  • llvm-bcanaylzer:分析 LLVM Bitcode 文件中的字节码结构和编码细节(低层调试专用)。

工具链大全

  • llvm-addr2line:用于将程序中的地址转换为源代码位置。它接受一个地址(或多个地址)和一个可执行文件,然后返回与该地址对应的文件名和行号,非常适用于调试和堆栈跟踪分析。
  • llvm-ar:LLVM 提供的归档工具,功能类似于 GNU ar,用于创建、修改和提取 .a 静态库文件。它支持标准的 ar 命令选项,并能处理 LLVM bitcode 文件,是构建和链接过程中的重要工具。
  • llvm-as:用于将人类可读的 LLVM IR(中间表示)文本格式(.ll 文件)转换为 LLVM bitcode(二进制格式,.bc 文件)。它是 IR 开发与调试流程中的关键工具。
  • llvm-bcanalyzer:用于分析 LLVM bitcode 文件中 bitstream 格式的工具。它可以帮助开发者理解和调试 .bc 文件的结构,输出详细的块结构和记录信息,通常用于底层格式研究或工具开发。
  • llvm-bitcode-strip:一个实用工具,用于从 LLVM bitcode 文件中去除无用的元数据、符号等,以减小文件大小或隐藏调试信息。它适合用于发布优化后的版本。
  • llvm-cat:用于串联多个 LLVM bitcode 文件或中间表示文件(如 .ll, .bc)并输出,常用于脚本或工具链中数据的简单合并操作。
  • llvm-cfi-verify:用于验证 Control Flow Integrity(控制流完整性,CFI)保护措施的工具。它可以检查二进制文件中是否正确插入了 CFI 措施,是分析安全性和检测漏洞的重要工具之一。
  • llvm-config:提供有关 LLVM 安装的配置信息,例如包含路径、库路径、版本等。它常用于配置使用 LLVM 构建的外部项目,简化 Makefile 或 CMake 的设置过程。
  • llvm-cov:是一个代码覆盖率分析工具,通常与 Clang 编译器配合使用。它可以展示哪些源代码被执行了、哪些没有,是评估测试覆盖率的重要手段。
  • llvm-c-test:一个用于测试 LLVM C API 的工具。它包含一系列测试用例,验证 LLVM 提供的 C 接口是否按照预期工作,主要用于开发者在修改接口后进行回归测试。
  • llvm-cvtres:是一个将 Microsoft COFF 资源对象文件(.res)转换为标准 COFF 对象文件(.obj)的工具。这对于使用 LLVM 工具链在 Windows 平台上构建包含资源的应用程序尤为重要。
  • llvm-cxxdump:用于转储和分析 C++ 类信息(如 vtable)的工具,特别适用于 MSVC 编译生成的二进制文件。它有助于理解 C++ 对象布局和继承结构。
  • llvm-cxxfilt:LLVM 的 C++ 名字还原工具,与 GNU 的 c++filt 类似。它可以将编译器生成的符号(如_Z3fooi)还原成人类可读的函数签名(如 foo(int)),便于调试和分析。
  • llvm-cxxmap:是一个处理 Microsoft C++ Name Map 文件(.map 文件)的工具,用于查看链接器生成的符号地址映射。这对于理解符号分布和调试链接问题非常有帮助。
  • llvm-debuginfo-analyzer:用于分析可执行文件或对象文件中调试信息(如 DWARF)的工具。它可以帮助开发者深入查看调试符号的结构、内容和关联性,常用于调试工具链或调试信息优化。
  • llvm-debuginfod:LLVM 提供的调试信息服务器,兼容 GNU 的 debuginfod 协议。它可以托管调试信息文件(如 .dwarf, .debug, .sym),让客户端工具(如 gdb 或 llvm-symbolizer)通过 HTTP 下载需要的调试符号,实现远程调试支持。
  • llvm-debuginfod-find:与 llvm-debuginfod 配套使用的客户端工具,用于查找并获取远程服务器上的调试信息文件。它会根据 build-id 或其他标识请求所需资源,帮助调试器自动获取符号信息。
  • llvm-diff:比较两个 LLVM IR 文件(.ll 或 .bc)之间差异的工具。它比普通文本比较工具更智能,能理解 LLVM 结构,忽略符号名变化等不影响语义的差异,适用于变更分析和优化验证。
  • llvm-dis:LLVM 的反汇编器,用于将 LLVM bitcode 文件(.bc)反编译成人类可读的 LLVM IR 文本格式(.ll)。它是了解和调试 bitcode 内容的关键工具。
  • llvm-dlang-demangle-fuzzer:专为测试 D 语言符号还原器(demangler)而设计的模糊测试工具。它自动生成各种可能导致崩溃或错误的输入,以确保 D 语言相关的符号处理工具稳定性和安全性。
  • llvm-dlltool: 对 GNU dlltool 的实现,专用于创建 Windows DLL 所需的导入库(.lib 或 .a 文件)和导出定义文件(.def)。在使用 LLVM 工具链构建 Windows 程序时,它是连接 DLL 的重要辅助工具。
  • llvm-dwarfdump:一个用于查看 DWARF 格式调试信息的工具。它可以打印出 ELF 或 Mach-O 文件中包含的 DWARF 数据结构,帮助分析编译器生成的调试元数据,常用于底层调试和工具开发。
  • llvm-dwarfutil:一个操作 DWARF 调试信息的工具,可以对调试信息进行优化、合并或裁剪等处理。它有助于减少最终调试信息的大小,或清理无用条目,适用于发布前的符号处理。
  • llvm-dwp:用于将分离的 DWARF 信息(.dwo 文件)合并为一个 DWARF 包(.dwp 文件),以便支持 Fission 模式下的调试。这对于大型项目的模块化编译尤为重要,有助于统一管理调试信息。
  • llvm-exegesis:性能分析工具,用于测量特定目标平台上的指令吞吐量和延迟,支持自动生成指令调度模型。它对优化 LLVM 后端代码生成、了解微架构行为非常有用。
  • llvm-extract:从一个 LLVM 模块中提取指定的函数、全局变量等子集,生成一个只包含这些内容的独立 bitcode 文件。这对于分析单个函数或做增量优化测试非常有帮助。
  • llvm-gsymutil:一个生成或处理 GSYM(Generic Symbol Format)格式的工具,这是一种适用于高效符号查询的格式。它可从 DWARF 调试信息中提取函数信息,生成 GSYM 文件,优化调试器的符号加载效率。
  • llvm-ifs:用于处理和生成 ELF 接口桩文件(.ifs),这是表示共享库 API 的抽象格式。它可以用于 ABI 检查、接口验证或构建加速,常见于大型系统项目的构建流程中。
  • llvm-install-name-tool:macOS 平台下的一个工具,类似于 Apple 的 install_name_tool。它用于修改 Mach-O 文件中动态库的安装名(install name)和依赖路径,常用于调整动态链接库的查找路径,方便打包和部署。
  • llvm-isel-fuzzer:测试 LLVM 指令选择(Instruction Selection)阶段的模糊测试工具。它用于生成各种随机输入,检测代码生成器中的崩溃或错误,确保后端架构实现的健壮性。
  • llvm-itanium-demangle-fuzzer:用于模糊测试 Itanium C++ 名字还原器的工具,Itanium ABI 是很多平台(如 Linux)上常见的 C++ 名字修饰方式。这个工具用于测试 llvm-cxxfilt 的稳定性,防止恶意输入导致崩溃。
  • llvm-jitlink:LLVM 的 JIT(即时编译)链接器框架,用于动态地将对象文件链接成可执行代码并运行。它是 ORC JIT 的一部分,设计用于高性能、低延迟的动态代码生成和执行场景。
  • llvm-jitlink-executor:llvm-jitlink 的辅助工具,用于运行由 JIT 生成并链接好的代码。它提供一个独立的执行环境或服务器进程,适合与客户端进程分离执行代码,增强 JIT 运行的灵活性和安全性。
  • llvm-lib:一个 Windows 平台下的工具,用于创建静态库(.lib 文件),等价于 MSVC 提供的 lib.exe。它用于管理目标文件的归档,在使用 LLVM 工具链构建 Windows 项目时非常重要。
  • llvm-libtool-darwin:是 LLVM 实现的 macOS 专用 libtool 工具,用于创建静态库(.a 文件)。与标准 ar 相比,它能更好地处理 Mach-O 格式特有的需求,是 macOS 平台上构建工具链的关键部分。
  • llvm-link:用于将多个 LLVM bitcode 文件(.bc)合并为一个统一的模块。它在编译多个模块后做统一优化和代码生成之前特别有用,等价于传统编译中的“链接”步骤,但针对 LLVM IR。
  • llvm-lipo:LLVM 提供的 lipo 工具替代品,用于操作 macOS 下的 fat 二进制文件(包含多个架构的可执行代码)。它可以查看、提取或合并不同架构的 Mach-O 文件,用于构建通用二进制(universal binary)。
  • llvm-lit:是 LLVM 的测试运行器(LLVM Integrated Tester),基于 Python 编写,用于自动化运行和验证 .ll, .bc 和相关脚本的输出。它是 LLVM 项目测试基础设施的重要组成部分。
  • llvm-locstats:一个统计源代码行号覆盖情况的工具,主要分析调试信息中记录的源代码行数,适用于评估调试信息的完整性和优化覆盖范围。
  • llvm-lto:LLVM 的 Link Time Optimization(链接时优化)工具,用于合并 bitcode 文件并进行全程序优化。它能显著优化程序性能,适合构建 release 版本或大型项目。
  • llvm-lto2:较新的 LTO 实现,使用更现代的 LLVM ORC 架构支持细粒度并行编译和增量链接。它代表了 LLVM LTO 技术的发展方向,但仍处于较新阶段,适合探索高效构建流程。
  • llvm-mc:LLVM 的机器代码工具,它能将汇编代码转换为机器码,或将机器码反汇编成汇编。它还支持语法验证、指令格式生成等功能,是编写和测试汇编代码的核心工具。
  • llvm-mca:一个性能分析工具,用于模拟目标处理器上的指令执行流程,分析瓶颈、吞吐量、延迟等。它对编写高性能汇编或分析代码生成效果非常有帮助。
  • llvm-microsoft-demangle-fuzzer:一个模糊测试工具,用来测试 LLVM 实现的 Microsoft C++ 名字还原器(demangler),确保它能正确还原 MSVC 编译器生成的符号,并在面对异常输入时保持稳定。
  • llvm-min-tblgen:一个精简版的 TableGen 工具,用于解析 LLVM TableGen 语法并生成指定格式的代码,通常用于开发和调试 TableGen 描述文件而无需完整生成所有内容。
  • llvm-ml: LLVM 的 MASM(Microsoft 汇编器)兼容实现,用于在 Windows 上编译 MASM 风格的汇编语言。它帮助在 LLVM 工具链中替代 MS 的 ml.exe 工具。
  • llvm-modextract:从多模块的 bitcode 文件中提取出单独的模块,适合在 ThinLTO 场景下调试或分析单个模块的优化情况。
  • llvm-mt:mt.exe 的 LLVM 实现版本,用于处理 Windows Manifest 文件(应用程序元数据),如嵌入或合并清单信息。
  • llvm-nm:这个工具列出目标文件中的符号表,支持多种格式(ELF、Mach-O、COFF),是调试和分析链接过程中的常用工具。
  • llvm-objcopy:用于修改目标文件的工具,可以复制对象文件、删除段、重命名符号等。它是 GNU objcopy 的 LLVM 版本,支持更广泛的格式。
  • llvm-objdump:类似,但用于查看对象文件内容,如反汇编、段信息、符号表、调试信息等,是程序分析的核心工具。
  • llvm-opt-fuzzer:此模糊器针对 LLVM 中的优化器组件进行模糊测试,用于发现潜在崩溃或错误转换,确保各种 LLVM 优化传递(passes)在处理异常 IR 时仍能安全工作。
  • llvm-opt-report:提供 LLVM 优化报告的可读形式,展示优化器做了哪些变换(如向量化、内联),常与 clang 生成的 .opt.yaml 文件结合使用。
  • llvm-otool:macOS otool 的替代品,用于查看 Mach-O 文件的各种信息,比如架构、节、库依赖等,是 macOS 开发环境中不可缺的工具。
  • llvm-pdbutil:操作和检查 Windows 的 PDB(程序数据库)调试信息文件,可以提取符号、类型信息、源码位置等。是 Windows 上调试支持的关键工具。
  • llvm-PerfectShuffle:这个小工具展示某个 SIMD 派生指令的“完美混洗”(perfect shuffle)策略,用于理解 LLVM 是如何生成高效向量打乱(shuffle)操作的。
  • llvm-profdata:用于处理 LLVM 的性能分析数据(profiling data),比如合并 .profraw 文件、生成 .profdata 文件,供 PGO(Profile-Guided Optimization) 使用。
  • llvm-profgen:将原始采样数据(如 perf 记录)转换为 LLVM 的 profile 数据格式,是 Sample-based PGO 流程的一部分,适用于大规模性能调优。
  • llvm-ranlib:等价于 GNU ranlib,用于给 .a 静态库添加符号索引,加速链接器访问符号表,是生成静态库后的常规步骤。
  • llvm-rc:llvm-rc 是 LLVM 的资源编译器,实现了 Microsoft rc.exe 的功能,用于编译 .rc 文件(如图标、对话框)为 Windows 的资源对象文件(.res)。
  • llvm-readelf:模仿 GNU readelf,它用于读取 ELF 格式目标文件的信息,如头信息、节表、符号、重定位等。适合需要精确分析 ELF 内容的用户。
  • llvm-readobj:与 llvm-readelf 类似,但支持更多文件格式(ELF、COFF、Mach-O)。它提供统一、详细的低级对象文件查看功能,适合构建跨平台工具链。
  • llvm-readtapi:llvm-readtapi 用于查看 TAPI(Text-based API)文件,主要用于 Apple 平台上的 SDK 构建、链接优化,它描述了动态库的接口内容。
  • llvm-reduce:自动将复杂的 LLVM IR 文件最小化,仅保留复现某个问题(如崩溃)的部分,极大地简化调试和 bug 报告的工作量,类似于“IR delta debugging”工具。
  • llvm-remarkutil:处理 LLVM 优化 remark 的工具,可以筛选、合并、转化 .opt.yaml 或 .remarks 文件,为调优分析和构建可视化报告提供便利。
  • llvm-rtdyld:这个工具用来测试 RuntimeDyld(LLVM 的 JIT 链接器),它可以动态加载和执行对象文件,适用于探索 JIT 编译的底层机制。
  • llvm-rust-demangle-fuzzer:专用于模糊测试 Rust 符号还原器的工具,用于测试 rust-demangle 逻辑的稳定性,确保 Rust 编译器生成的符号名能正确处理。
  • llvm-sim:llvm-sim 是一个实验性工具,用于模拟程序在目标架构上的执行行为,支持简化的流水线模型,用于性能建模和教学用途。
  • llvm-size:报告可执行文件中各个段(text、data、bss 等)的大小,与 GNU size 类似,帮助评估二进制体积和内存占用。
  • llvm-special-case-list-fuzzer:模糊测试专用于处理 LLVM 中的 “special case list” 文件(通常用于控制分析器或优化器的例外规则),确保格式解析器稳定性。
  • llvm-split:将一个包含多个模块的 LLVM bitcode 文件拆分为单独的模块,便于并行处理或单独优化,是 ThinLTO 场景下的重要工具。
  • llvm-stress:这个工具随机生成大量合法的 LLVM IR 文件,作为 stress 测试使用,适用于检测优化器或后端在各种极端条件下的健壮性。
  • llvm-strings:类似 GNU strings,从二进制文件中提取可读 ASCII 字符串,适用于粗略检查目标文件中的可识别数据。
  • llvm-strip:从二进制文件中移除符号和调试信息,减小文件体积。等价于 GNU strip,适合用于发布构建版本时清理符号。
  • llvm-symbolizer:llvm-symbolizer 是调试利器,用于将内存地址转换为函数名、文件名和行号(symbolication),常与崩溃分析工具搭配使用。
  • llvm-tblgen:TableGen 是 LLVM 使用的一个元编程工具,用于根据表格描述文件生成目标描述代码(如指令集、寄存器等),广泛用于 LLVM 后端开发。
  • llvm-tli-checker:这个工具验证 LLVM 的 TargetLibraryInfo(TLI)中对标准库函数(如 memcpy, sin)的识别是否正确,有助于优化器利用已知函数行为。
  • llvm-undname:还原 Microsoft 编译器生成的 C++ 符号(与 llvm-cxxfilt 类似,但用于 MSVC 风格修饰名),便于调试 Windows 上的程序。
  • llvm-windres:llvm-windres 是 GNU windres 的 LLVM 实现,用于处理 Windows 资源脚本文件(.rc)和生成 .res 文件,通常与 llvm-rc 搭配使用。
  • llvm-xray:XRay 是 LLVM 的轻量级函数跟踪框架,llvm-xray 提供相关工具(如查看 trace、分析函数调用频率、延迟等),适合性能诊断。
  • llvm-yaml-numeric-parser-fuzzer:用于测试 LLVM YAML 数字解析器的模糊测试工具,验证其对各种数值格式的容错能力。
  • llvm-yaml-parser-fuzzer:用于测试通用 LLVM YAML 解析器是否能安全处理各种格式和边界情况,防止 YAML 文件导致程序崩溃或逻辑错误。