【问题标题】:Suboptions for gcc optimization level 1gcc 优化级别 1 的子选项
【发布时间】:2013-12-10 10:26:12
【问题描述】:

使用 gcc 的 -O 优化选项在我的项目模块之一中遇到“虚拟内存耗尽:无法分配内存”错误。如果我从命令行中删除 -O,错误就会消失。

我检查了gcc规范,发现-O启用了以下选项

      -fauto-inc-dec 
      -fcompare-elim 
      -fcprop-registers 
      -fdce 
      -fdefer-pop 
      -fdelayed-branch 
      -fdse 
      -fguess-branch-probability 
      -fif-conversion2 
      -fif-conversion 
      -fipa-pure-const 
      -fipa-profile 
      -fipa-reference 
      -fmerge-constants
      -fsplit-wide-types 
      -ftree-bit-ccp 
      -ftree-builtin-call-dce 
      -ftree-ccp 
      -ftree-ch 
      -ftree-copyrename 
      -ftree-dce 
      -ftree-dominator-opts 
      -ftree-dse 
      -ftree-forwprop 
      -ftree-fre 
      -ftree-phiprop 
      -ftree-slsr 
      -ftree-sra 
      -ftree-pta 
      -ftree-ter 
      -funit-at-a-time

我的新命令行现在添加了以下选项

-fauto-inc-dec -fdce -fdefer-pop -fdse -fguess-branch-probability -fif-conversion2 -fif-conversion -fipa-pure-const -fipa-reference -fmerge-constants -fsplit-wide-types -ftree-builtin-call-dce -ftree-ccp -ftree-ch -ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse -ftree-forwprop -ftree-fre -ftree-phiprop -ftree-sra -ftree-pta -ftree-ter -funit-at-a-time -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector -fno-var-tracking -fno-var-tracking-assignments 但我无法重现该问题。

我使用的 gcc 版本无法识别某些选项(我已将它们从命令行中删除)

gcc -v

Using built-in specs.
COLLECT_GCC=/usr/bin/gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/i686-redhat-linux/4.5.1/lto-wrapper
Target: i686-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,lto --enable-plugin --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch=i686 --build=i686-redhat-linux
Thread model: posix
gcc version 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC)

任何人都可以就可能出现的问题给出一个想法吗?

谢谢

P.S:我正在尝试编译的代码包含大量 STL 内容。

【问题讨论】:

  • 为什么不构建 64 位?另外,错误是来自 GCC 还是在运行时?
  • 链接时错误来自 gcc。
  • 使用-o3-o2 构建时会发生什么?您是单独编译每个文件(-c 标志)然后将它们链接起来,还是使用单个命令到 GCC(编译+链接)?看起来您的机器内存不足,而您正在构建大型项目。

标签: c++ gcc compilation options


【解决方案1】:

您可能希望获得您的特定编译器正在使用的确切优化选项的列表。它们可能因编译器而异,也因目标而异。

使用-Q--help=optimizers 可以帮助您。例如,假设您使用以下命令进行编译(它会创建损坏的代码):

gcc -march=armv7-a -mfloat-abi=softfp -mthumb -std=c++11 -FPIC -DNDEBUG -I. -g -c myfile.cpp

如果此命令创建工作代码:

gcc -march=armv7-a -mfloat-abi=softfp -mthumb -std=c++11 -FPIC -DNDEBUG -O -I. -g -c myfile.cpp

您可以通过在命令开头添加-Q 和末尾添加--help=optimizers 来获得不同的选项。对于损坏的命令:

gcc -Q -march=armv7-a -mfloat-abi=softfp -mthumb -std=c++11 -FPIC -DNDEBUG -I. -g -c myfile.cpp --help=optimizers > broken-opts

还有工作的:

gcc -Q -march=armv7-a -mfloat-abi=softfp -mthumb -std=c++11 -FPIC -DNDEBUG -O -I. -g -c myfile.cpp --help=optimizers > working-opts

broken-opts 文件中查找标记为“[enabled]”但在working-opts 文件中标记为“[disabled]”的选项:

diff broken-opts working-opts | grep '<'

然后,您可以 a) 使用 -O 编译并一次禁用一个选项(即 -fno-option-name 用于名为 -foption-name 的选项),直到找到要禁用的正确选项,或者您可以 b) 在没有任何优化标志的情况下进行编译,并一次添加一个选项,直到找到“损坏”选项。

我使用带引号的“破碎”选项 - 因为在我处理过的每一个案例中,这实际上是 MY 代码的问题,而不是编译器或优化器本身。然而,这个过程已经帮助我很多次找出问题在我的代码中的位置(即,如果“损坏”选项与堆栈有关,或者与虚拟函数有关,您可以缩小范围搜索违规代码)。

【讨论】:

    猜你喜欢
    • 2021-12-08
    • 2018-10-06
    • 2010-12-19
    • 1970-01-01
    • 2016-01-01
    • 2013-12-30
    • 2012-02-28
    • 2012-11-11
    相关资源
    最近更新 更多