跳转至

mllvm

-mllvm 是 Clang 的一个特殊命令行选项,用于将选项传递给 LLVM 后端,而不是 Clang 前端。这允许用户控制 LLVM 的优化和代码生成行为。-mllvm 后面跟着的选项是直接传递给 LLVM 底层的工具(如优化器、代码生成器等),这些选项并不直接影响 Clang 的前端处理,而是用于调整 LLVM 内部的处理过程。

作用

  • -mllvm 允许你向 Clang 后端传递参数,控制 LLVM 优化、生成代码等方面的行为。
  • 这些选项通常是 LLVM 优化工具(如 optllc 等)理解的参数,而 Clang 本身并不处理它们。

基本语法

Bash
clang -mllvm <llvm_option>

例子:

  1. 启用优化 Pass: 如果你想启用某个特定的 LLVM 优化 Pass,例如 loop-unroll,可以这样写:
Bash
clang -S -emit-llvm -mllvm -loop-unroll source.c -o output.ll

这里,-mllvm -loop-unroll 是一个传递给 LLVM 后端的选项,它告诉 LLVM 启用循环展开优化。

  1. 打印每个 Pass 后的 LLVM IR: 如果你想查看每个 Pass 后的 LLVM IR,可以使用 -print-after-all 选项:
Bash
clang -S -emit-llvm -mllvm -print-after-all source.c -o output.ll

这个选项会在每个优化 Pass 后打印出 IR,帮助你跟踪 IR 的变化。

  1. 控制 LLVM 的目标架构特性: 你还可以使用 -mllvm 来传递与目标架构相关的参数,例如优化某个特定架构的代码:
Bash
clang -S -emit-llvm -mllvm -mcpu=haswell source.c -o output.ll

这个例子中,-mcpu=haswell 是传递给 LLVM 后端的参数,用于生成适合 Haswell 架构的代码。

  1. 调试输出: 如果你想查看 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

  1. 控制 LLVM 优化:很多时候,Clang 本身并不暴露所有的优化选项,-mllvm 可以让你直接对 LLVM 的优化行为进行控制。例如,可以通过 -mllvm -inline-threshold=100 来调整内联阈值,影响函数内联的决策。
  2. 传递低级别调试选项:一些 Clang 编译过程中的低级别调试选项(比如优化过程中的 Pass 调试)是由 LLVM 后端理解的,通过 -mllvm 传递这些选项可以帮助开发者在优化过程中进行深入分析。
  3. 影响代码生成行为-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 本身并不处理它们。