Clang和GCC有两个开关-mcpu
和-march
,以启用某些特定于所选CPU的优化。即-march=i686
在内部启用-mmmx
,-msse
等等。
我想知道是否有一些命令显示每个CPU的march
和mcpu
启用了哪些开关。我更喜欢一个命令,但我也接受带有信息的代码位置的答案。
答案 0 :(得分:4)
对于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.
可能-###
打印出所有曝光的内容。
答案 1 :(得分:1)
如上所述,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上测试。