在gcc 4.2.2中关闭特定功能的优化

时间:2008-12-27 16:45:22

标签: c gcc

是否可以关闭特定功能的优化? 我的一个朋友有一个问题,gcc优化使一些(我不知道)μ控制器代码不起作用。 我们知道它是哪些函数,但是我们不知道代码本身,所以最简单和最安全的方法可能是为整个函数关闭它。

可悲的是http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html显示有一个优化函数属性/ pragma,但它需要gcc 4.4,我们没有。

提前致谢

7 个答案:

答案 0 :(得分:12)

如果编译指示不适合您,请尝试将该函数拆分为自己的文件,然后在未设置优化标志的情况下编译该文件。

答案 1 :(得分:7)

您可以将该函数放在一个单独的文件中并在没有优化的情况下编译该文件,但更好的解决方案是找出代码的错误并修复它。

使用gcc启用优化时出现的最常见错误之一是严格别名。确保所有警告都已启用,并查看是否有任何警告可能有助于您找出问题所在。如果您无法弄清楚,请尝试将问题简化为一个小型的完整程序并将其发布到此处。

答案 2 :(得分:5)

如果没有将函数放在自己的文件中,我认为没有办法使用早期版本的GCC按函数级别关闭函数优化。但是,您可以尝试在整个程序中选择关闭某些类型的优化,而不是关闭此功能的优化。虽然您已经确定了此特定功能中的错误,但这可能表明存在其他未发现的错误。

正如其他人所指出的,罪魁祸首可能是'strict aliasing'的优化。从长远来看,您可能应该修复有问题的代码,在短期内您可以将“-fno-strict-aliasing”添加到命令行。在-O2及以上,编译器对指针之间的交互作出某些假设。添加此选项会告诉它不要做出这些假设。

如果此操作失败,并且由于某些原因无法修复代码,则可以尝试禁用其他optimization options

答案 3 :(得分:5)

到目前为止,答案忽略了原始问题中的关键词,即“微控制器代码”。编写此类代码以禁用时非常常见 优化 - 积极的优化器将“优化”整个语句 副作用是驱动控制器。这与申请不同 编码。对于在通常的编程空间中的应用程序,我来到这里寻找 对于相同的信息,以避免有Kahan求和的例程(见维基百科) 优化为虚无。所以我们不要假设优化级别发生了变化 生成不同的程序行为自动成为错误代码的标志。 可以通过巧妙地使用volatile关键字来克服某些事情,在某些情况下也是如此 一个人应该生成实际的汇编语言并进行检查。 (我相信这一点 仍然可以使用-S切换到gcc)。让我们记住C是有意的 一种便携式汇编程序,而不是一种COBOL。

戴夫

答案 4 :(得分:3)

我不能肯定地说,但据我所知,没有这种可能性。但是,优化永远不应该改变定义良好的代码的语义。这里唯一可能发生的事情是变量内联或读/写顺序发生变化。

第一个,也可能是两个问题都可以通过将所涉及的变量声明为volatile来解决,从而向编译器显示不应仅根据程序流程对其内容进行任何假设。 / p>

答案 5 :(得分:3)

我知道这是一个老帖子。 OP给出的GCC页面实际上说: 为了防止这些调用被优化掉,请输入asm(“”);在功能中。 我想这是一个简单的解决方法。好了,希望它可以帮助 其他人喜欢我。

答案 6 :(得分:2)

对于仍在使用旧版gcc的用户: 较新版本的gcc解决了这个问题。我已经在gcc-4.5.1中成功使用了它。 古德勒克。