【发布时间】:2014-01-31 00:32:03
【问题描述】:
Clang 和 GCC 有两个开关,-mcpu 和 -march,用于启用特定于所选 CPU 的一些优化。即-march=i686 在内部启用-mmmx、-msse 等等。
我想知道是否有一些命令可以显示march 和mcpu 为每个 CPU 启用了哪些开关。我更喜欢一个命令,但我也接受带有信息的代码位置的答案。
【问题讨论】:
标签: gcc optimization clang
Clang 和 GCC 有两个开关,-mcpu 和 -march,用于启用特定于所选 CPU 的一些优化。即-march=i686 在内部启用-mmmx、-msse 等等。
我想知道是否有一些命令可以显示march 和mcpu 为每个 CPU 启用了哪些开关。我更喜欢一个命令,但我也接受带有信息的代码位置的答案。
【问题讨论】:
标签: gcc optimization clang
gcc,试试
gcc -mcpu=native -Q --help=target
它打印的第一行:
gcc:警告:'-mcpu=' 已弃用;使用“-mtune=”或“-march=” 而是
紧随其后
The following options are target specific:
-m128bit-long-double [disabled]
-m32 [disabled]
-m3dnow [disabled]
-m3dnowa [disabled]
-m64 [enabled]
-m80387 [enabled]
-m8bit-idiv [disabled]
[...]
这回答了 gcc 的部分。
不幸的是,我不熟悉clang。到目前为止,我能想到的最好的是:
clang --target=i386 -### myfile.c.
-### 在哪里显示选项。手臂显示了不同的东西。我不确定它是否足以满足您的需求。
设置选项的文件似乎是Targets.cpp,虽然它没有多大帮助,因为它是一个 5.8k 行长的文件。
查看 llvm 代码生成后,我的印象是 clang/LLVM 没有 gcc 那么多的目标特定选项。 参见例如 the target-specific feature matrix 或暴露(记录) options of llc。
还有一件事:clang 故意公开的编译器优化选项要少得多。比如有no -finline-limit analogue exposed in clang.
也许-###毕竟打印了所有暴露的东西。
【讨论】:
-mllvm -inline-threshold=...。 clang -mllvm -help-hidden 提供了很多选项。虽然,我不会说 clang 提供的选项和 GCC 一样多——我只是不知道。
如前所述,gcc -Q --help=target 以人类可读的形式打印有关优化的信息。
clang 似乎没有特定的选项。但是如果你把简单的程序编译成 LLVM IR,你可以检索到一些信息。
示例命令:
echo 'int main(){}' | clang -S -emit-llvm -x c - -o - | grep attributes.
示例输出:
attributes #0 = { noinline nounwind optnone uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
在 clang-10 上测试。
【讨论】: