在gcc 4.2.2中关闭特定function的优化

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

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

提前致谢

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

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

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

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

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

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

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

戴夫

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

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

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

对于仍在使用旧版gcc的人:较新版本的gcc解决了这个问题。 我已经在gcc-4.5.1中成功使用了它。 祝好运。