c - __attribute__ 优化,指定多个标志,以及不同 -O 级别的失败代码

标签 c optimization gcc attributes eabi

我有一些代码正在用 GCC 为一个 micro 编译。我注意到在编译调试版本时,系统工作正常。但是当我编译发布版本时,系统没有启动。

在处理这个问题一段时间后,我将问题缩小到一个函数,如果我指定一个较低的优化级别(-O0 而不是 -Os),系统将在发布版本中正常启动。因此,大概有一个 -Os 设置的标志导致该特定函数中的代码无法工作。

我曾计划通过获取 -Os 设置的所有标志并找到导致系统无法启动的标志来追踪潜在问题。

我正在尝试执行以下操作:

__attribute__ ((optimize("-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-sra", "-ftree-pta", "-ftree-ter", "-funit-at-a-time")))

然后消除标志,直到系统启动。问题是,我一直在缩小它并缩小它,直到我发现我什至无法设置一个标志并让系统启动。

所以现在我认为我设置优化的方式有问题。如果我在这些标志中间的某个地方放置了一个多余的不存在的标志,比如 -fiam-fake-flag,编译器会检测到它并吐出一个错误(起初让我觉得我正确地设置了这些标志) .

我不想使用 pragma,因为:

“在这一点之后定义的每个函数都好像为该函数指定了属性((optimize(“STRING”)))。“

我只想优化这一个函数,这样我就可以缩小问题范围。

那么,我是否错误地设置了这些标志?是否有更好的方法来为一个特定函数指定一大堆编译器标志?

如果不是在 micro 上运行,我可以在 Makefile 中指定我想要的所有标志并将其应用于所有函数,但这样做会使程序太大而无法在 micro 上运行。

最佳答案

您的标志是否声明为 volatile?尝试发布有问题的功能。 – 古尔

这完全是事实。谢谢你,埃古尔。 ——迈克·吉布森

关于c - __attribute__ 优化,指定多个标志,以及不同 -O 级别的失败代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20615334/

相关文章:

c - 为什么gdb8.2在Centos7 aliyun上编译出错?

c - 带有 rand 的函数总是以相同的方式初始化矩阵

c - GCC 中 strlen() 的实现在哪里?

c# - 在不使用数组的情况下,我可以更快地查看特定索引吗?

gcc - 为什么库的链接顺序有时会导致 GCC 中出现错误?

Windows 下 Visual Studio 2012/英特尔编译器的 C++ double 失败

c - 在不使用数组的情况下在 C 中查找 100 阶乘中的数字总和

c - C语言扑克软件原型(prototype),找出顺子功能的问题

mysql - MySQL IN 子句的特点

c# - 为什么使用 .NET 框架的程序比非托管代码中的相同程序小?