mllvm
-mllvm 是 Clang 的一个特殊命令行选项,用于将选项传递给 LLVM 后端,而不是 Clang 前端。这允许用户控制 LLVM 的优化和代码生成行为。-mllvm 后面跟着的选项是直接传递给 LLVM 底层的工具(如优化器、代码生成器等),这些选项并不直接影响 Clang 的前端处理,而是用于调整 LLVM 内部的处理过程。
作用¶
-mllvm允许你向 Clang 后端传递参数,控制 LLVM 优化、生成代码等方面的行为。- 这些选项通常是 LLVM 优化工具(如
opt、llc等)理解的参数,而 Clang 本身并不处理它们。
基本语法¶
例子:¶
- 启用优化 Pass: 如果你想启用某个特定的 LLVM 优化 Pass,例如
loop-unroll,可以这样写:
这里,-mllvm -loop-unroll 是一个传递给 LLVM 后端的选项,它告诉 LLVM 启用循环展开优化。
- 打印每个 Pass 后的 LLVM IR: 如果你想查看每个 Pass 后的 LLVM IR,可以使用
-print-after-all选项:
这个选项会在每个优化 Pass 后打印出 IR,帮助你跟踪 IR 的变化。
- 控制 LLVM 的目标架构特性: 你还可以使用
-mllvm来传递与目标架构相关的参数,例如优化某个特定架构的代码:
这个例子中,-mcpu=haswell 是传递给 LLVM 后端的参数,用于生成适合 Haswell 架构的代码。
- 调试输出: 如果你想查看 LLVM 内部的调试信息,可以传递
-debug参数:
Bash
clang -S -emit-llvm -mllvm -debug source.c -o output.ll
clang -S -emit-llvm -mllvm -print-after-all source.c -o output.ll
clang -S -emit-llvm -mllvm -debug -mllvm -print-after-all source.c -o output.ll 输出更多的信息
clans -S -emit-llvm -mllvm -debug-pass=Structure main.c -o main.ll
为什么使用 -mllvm?¶
- 控制 LLVM 优化:很多时候,Clang 本身并不暴露所有的优化选项,
-mllvm可以让你直接对 LLVM 的优化行为进行控制。例如,可以通过-mllvm -inline-threshold=100来调整内联阈值,影响函数内联的决策。 - 传递低级别调试选项:一些 Clang 编译过程中的低级别调试选项(比如优化过程中的 Pass 调试)是由 LLVM 后端理解的,通过
-mllvm传递这些选项可以帮助开发者在优化过程中进行深入分析。 - 影响代码生成行为:
-mllvm还可以控制 LLVM 生成代码的方式,例如指定目标架构、启用特定的代码生成选项等。
常用的 -mllvm 选项示例¶
-mllvm -loop-unroll: 启用 LLVM 的循环展开优化。-mllvm -inline-threshold=100: 设置函数内联的阈值,控制何时内联函数。-mllvm -print-before-all: 打印每个 Pass 前的 IR。-mllvm -print-after-all: 打印每个 Pass 后的 IR。-mllvm -debug: 打开 LLVM 的调试输出,查看 LLVM 的内部信息。
总结¶
-mllvm 是一个用于向 LLVM 后端 传递特定选项的 Clang 命令行选项。通过 -mllvm,你可以精确控制 LLVM 优化、代码生成等行为,进行更为细致的调试和性能优化。-mllvm 选项后面传递的参数通常是 LLVM 优化器或代码生成器理解的参数,Clang 本身并不处理它们。