【发布时间】:2016-06-20 06:11:16
【问题描述】:
我有一个程序,它仅在使用特定版本的 gcc 编译并使用一些优化(-O1 或更高版本,但不是-O0)时才有效。
这个程序在 C 意义上是不正确的,但是我需要理解为什么它不能与 -O0 一起工作。它太大而无法通过比较生成的汇编代码来手动检查,所以我希望 GCC 告诉我与 -O1 的执行相对应的确切标志,但不使用 -O1 本身。这个想法是,通过一次删除每个优化,我将能够更好地理解问题。
我去了我的specific gcc's optimization options page 并尝试添加所有-f 选项,根据文档,这些选项由-O1 启用,但这还不够(程序的行为仍然像-O0)。
有没有办法获得某种基于“低级”选项-f* 的规范化命令行,这些选项对应于 GCC 内部所做的操作?
【问题讨论】:
-
注意这个问题听起来好像你的代码中有一些未定义的行为。可能想尝试 -fsanitize=undefined 看看是否会弹出任何内容。
-
不,没有办法获得 -O1 与 -f 标志列表的等价物。 gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html “并非所有优化都直接由标志控制。” “大多数优化只有在命令行上设置了 -O 级别时才会启用。否则,即使指定了单独的优化标志,它们也会被禁用。”您可以使用
-O1 -fno-*禁用很多优化,也许还有一些-fdisable-*,但我仍然认为这对您没有太大帮助。 -
@rubenvb 我完全同意,这是一个不正确的程序,但无论如何它处理各种讨厌的组装和硬件级交互,所以我不能指望修复它。尽管如此,这种
-O相关的行为还是需要以某种方式理解,所以我想我必须修补 gcc 本身以获得一些额外的信息。
标签: gcc compiler-optimization compiler-options