11

我正在开发一个使用 LLVM 2.6 和 llvm-gcc 前端编译的项目。我正在尝试使用 LLVM 3.1 和 clang 测试编译它。当我这样做时,我收到以下关于 -O5 优化级别的错误消息:

error: invalid value '5' in '-O5'

但是,LLVM 2.6 和 llvm-gcc 可以正常使用该-O5标志。我看到了有关 Clang 优化级别的以下文档:

-O0 -O1 -O2 -Os -O3 -O4
       Specify which optimization level to use.  -O0 means "no optimization": this level compiles the
       fastest and generates the most debuggable code.  -O2 is a moderate level of optimization which
       enables most optimizations.  -Os is like -O2 with extra optimizations to reduce code size.  -O3
       is like -O2, except that it enables optimizations that take longer to perform or that may
       generate larger code (in an attempt to make the program run faster).  On supported platforms, -O4
       enables link-time optimization; object files are stored in the LLVM bitcode file format and whole
       program optimization is done at link time. -O1 is somewhere between -O0 and -O2.

所以我试图弄清楚-O5我正在使用的 Makefile 中首先在做什么(我没有编写 Makefile)。这是改变并曾经与 LLVM 一起使用的东西吗?或者它仍然是一个有用的功能,我只需要以其他方式激活它。

另外,如果它有用,我正在运行的给出错误的命令基本上是:

/bin/clang -g -c -mcmodel=medium -fstrict-aliasing -Wstrict-aliasing -O5 -emit-llvm -fkeep-inline-functions -fno-stack-protector -c -o foo.bc foo.cpp

另外,如果我在 Linux (Ubuntu 10.04) x86_64 系统上运行很重要。

4

2 回答 2

14

Gcc 将任何-Onn >= 4视为-O3

-O 标志将接受 0 到 9 之间的任何数字,但只实现了 0 到 3,而且我认为没有人计划在短期内实现 4 到 9。人们使用这个 -O9 习惯用法的事实有点令人不安,因为这意味着他们想要 gcc 可能提供的所有可能的优化,即使它使编译需要数周时间而没有任何收获。

不应该使用更大的级别,你只有低质量的 Makefile。

所以指定 -O9 有点“但是这个到 11 点!”类型的废话

因此,当使用 gcc 编译器时,您有 -O: 的有效变体-O0, -O1, -O2, -O3。但是驱动程序会默默地将任何 -On 转换为 -O3。

LLVM(clang 和 llvm-gcc 驱动程序变体)仅支持最高级别-O4-O4与 相同-O3 -flto)。所以你不应该在没有测试的情况下使用 -O4 ,因为 lto 速度较慢并且可能会破坏你的程序。

于 2012-04-24T21:23:46.590 回答
2

llvm-gcc 没有将其识别为错误但 clang 识别为错误可能是 Makefile 中的错误。

于 2012-04-24T21:14:52.680 回答