【问题标题】:Which specific optimization flags are responsible for optimizing out variables哪些特定的优化标志负责优化变量
【发布时间】:2023-05-16 23:51:01
【问题描述】:

我想专门选择优化标志来防止 gdb 中的 <optimized out> 变量(参数),而不诉诸 -O0

我的背景是调试 glibc,它不能用 -O0 构建,因为它需要某种函数内联。但是我可以看到这通常很有用,例如在不完全影响性能的情况下启用有用的调试。

根据gcc -c -Q -O0 --help=optimizers,除了-O0(使用gcc 5.3.1)启用的优化标志外,-O1还启用了以下31个优化标志:

-fbranch-count-reg
-fcombine-stack-adjustments
-fcompare-elim
-fcprop-registers
-fdefer-pop
-fforward-propagate
-fguess-branch-probability
-fif-conversion
-fif-conversion2
-finline-functions-called-once
-fipa-profile
-fipa-pure-const
-fipa-reference
-fmove-loop-invariants
-fshrink-wrap
-fsplit-wide-types
-fssa-phiopt
-ftree-bit-ccp
-ftree-ccp
-ftree-ch
-ftree-copy-prop
-ftree-copyrename
-ftree-dce
-ftree-dominator-opts
-ftree-dse
-ftree-fre
-ftree-pta
-ftree-sink
-ftree-slsr
-ftree-sra
-ftree-ter

注意:我知道选择性优化/易失性作为手动修复,但我正在寻找更通用的解决方案。

【问题讨论】:

    标签: c debugging gcc gdb compiler-optimization


    【解决方案1】:

    没有直接回答你的问题,但你可能想要的是-Og

    来自GCC documentation

    -Og

    优化调试体验。 -Og 启用不干扰调试的优化。它应该是标准编辑-编译-调试周期的首选优化级别,提供合理的优化级别,同时保持快速编译和良好的调试体验。

    -Og 上使用--help=optimizers 并将其与--help=optimizers-O0 上得到的结果进行比较,然后就可以得到问题的答案。

    【讨论】:

    • 这听起来确实像解决方案。不幸的是,还有一些重要的<optimized out> 剩余(少于-O1)。我想知道为什么这个选项不受欢迎,而通用答案是-O0
    • @Zulan:如果我是你,我现在会发现 OgO1 标志的区别(使用 --help=optimizers),然后也许阅读这些标志(参见链接在我的回答中)并简单地一一尝试,直到我得到你需要的东西。最后,您可能还想提出这项工作的成果,作为您自己问题的答案。 :-)
    • -Og 这样的全局标志不仅仅是单个优化标志的总和,所以--help=optimizers 没有给出完整的答案。 -Og 选项是相当新的,报告有关它的错误(如那些重要的 <optimized out>)可能有助于改进它。