__attribute__ optimize,指定多个标志,并在不同的-O级别失败代码

时间:2013-12-16 16:07:15

标签: 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“)))。”

我只希望对这一功能进行优化,以便缩小问题范围。

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

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

1 个答案:

答案 0 :(得分:1)

您的旗帜是否被宣布为volatile?尝试发布有问题的功能。 - egur

完全是这样的。谢谢你,egur。 - 迈克吉布森