2012-04-24 118 views
10

我正在编译一个我一直在用LLVM 2.6和llvm-gcc前端进行编译的项目。我试图用LLVM 3.1和clang来测试它的编译。当我这样做,我得到了以下错误消息有关-O5优化级别:LLVM和Clang中的优化级别

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

然而,LLVM 2.6和LLVM-GCC已经工作得很好与-O5标志。我看到了有关铛优化级别以下文件:

-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. 

所以我试图找出什么在我与摆在首位在做工作的Makefile中的-O5(我没有写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的系统上运行。

回答

12

gcc的对待任何-On对于n> = 4 as -O3

-O标志将接受任何数量从 0-9,但只有零到三个实现,我不认为 任何人都有计划在不久的将来实施四到九年。 事实上,人们使用这个-O9成语有点令人不安,因为 这意味着他们希望gcc可能会提供的每一个可能的优化,即使编译花了几周时间,也没有增加。

更大的水平不应该使用,你只是低质量的Makefile。

所以指定-O9是有点 - 型废话

因此,当使用gcc编译器,你有-O的有效变种“但这种人去到十一!”:-O0, -O1, -O2, -O3。但是驱动程序会默认将任何-On转换为-O3。

LLVM(包括铛和驾驶员的LLVM-GCC的变体)仅支持水平,直至-O4-O4只是一样-O3 -flto)。所以你不应该在没有测试的情况下使用-O4,因为lto比较慢,可能会破坏你的程序。

2

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