嵌入式 GCC 优化魔法

     2023-02-22     131

关键词:

【中文标题】嵌入式 GCC 优化魔法【英文标题】:Embedded GCC optimization magic 【发布时间】:2020-01-24 15:28:24 【问题描述】:

我有一个项目,我尝试为微控制器构建固件,并尝试更好地控制所使用的优化标志。我想,而不是使用 -O<number> 标志单独指定不同的优化标志。不幸的是,-O 标志似乎发生了一些优化魔法,我无法用单个优化标志重现,我不明白为什么。

这是我尝试过的,什么不起作用:

我知道我可以使用-O1 编译项目。所以我使用-Q--help 标志来输出在我激活-O1 标志时处于活动状态的标志。我使用此信息在构建过程中手动指定不同的标志,编译工作正常,但在链接阶段失败,因为 .bss 部分不再适合我的 RAM(我只有 384 kByte 可用)。

当我在链接器脚本中增加 RAM 大小时,链接工作正常,但 .bss 部分的末尾放置在 416 kByte,二进制图像比直接使用 -O1 时大 75%。

当我比较 gcc 报告的标志和参数时,两个构建之间没有区别,但没有-O1 的那个仍然大得多。

根据 GCC 文档 (GCC Manual),-O 标志是否只激活特定的优化标志,因此也应该可以手动执行此操作(或不这样做?)

这是我的 gcc 命令:

带有单个优化标志的 GCC 调用

gcc -std=c99 -msoft-float -fno-inline -fdata-sections -ffunction-sections -Wall -Wextra\
-faggressive-loop-optimizations -fauto-inc-dec -fbranch-count-reg -fcombine-stack-adjustments\
-fcompare-elim -fcprop-registers -fdce -fdefer-pop -fdelayed-branch -fdelete-null-pointer-checks\
-fdse -fearly-inlining -ffast-math -fforward-propagate -ffp-contract=fast -ffp-int-builtin-inexact\
-ffunction-cse -fgcse-lm -fguess-branch-probability -fhandle-exceptions -fif-conversion -fif-conversion2\
-finline-atomics -finline-functions-called-once -fipa-profile -fipa-pure-const -fipa-reference\
-fira-algorithm=CB -fira-hoist-pressure -fira-share-save-slots -fira-share-spill-slots -fivopts\
-fjump-tables -flifetime-dse -flifetime-dse=2 -fmath-errno -fmove-loop-invariants -fomit-frame-pointer\
-fpeephole -fplt -fprefetch-loop-arrays -fprintf-return-value -frename-registers -freorder-blocks
-frtti -fsched-critical-path-heuristic -fsched-dep-count-heuristic -fsched-group-heuristic\
-fsched-interblock -fsched-last-insn-heuristic -fsched-rank-heuristic -fsched-spec -fsched-spec-insn-heuristic\
-fsched-stalled-insns-dep -fschedule-fusion -fshort-enums -fshrink-wrap -fshrink-wrap-separate\
-fsigned-zeros -fsplit-ivs-in-unroller -fsplit-wide-types -fssa-backprop -fssa-phiopt -fstack-reuse=all\
-fstdarg-opt -fstrict-volatile-bitfields -fno-threadsafe-statics -ftrapping-math -ftree-bit-ccp\
-ftree-builtin-call-dce -ftree-ccp -ftree-ch -ftree-coalesce-vars -ftree-copy-prop -ftree-cselim\ 
-ftree-dce -ftree-dominator-opts -ftree-dse -ftree-forwprop -ftree-fre -ftree-loop-if-convert -ftree-loop-im\
-ftree-loop-ivcanon -ftree-loop-optimize -ftree-parallelize-loops=1 -ftree-phiprop -ftree-pta\
-ftree-reassoc -ftree-scev-cprop -ftree-sink -ftree-slsr -ftree-sra -ftree-ter -fvar-tracking -fvar-tracking-assignments\
-fweb -fmerge-constants -fno-associative-math -fno-cx-limited-range -fno-exceptions -fno-finite-math-only\
-fno-reciprocal-math -fno-unsafe-math-optimizations -fexcess-precision=standard -qbsp=leon2 -DCPU_FREQ=CPU_FREQ_125MHz\
-fno-builtin-strtok -c -o timer.o timer.c

GCC 与 -O1

gcc -O1 -std=c99 -msoft-float -qbsp=leon2 -DCPU_FREQ=CPU_FREQ_125MHz -fno-builtin-strtok -c -o timer.o timer.c

如果需要,我还可以提供 gcc 的输出,以查看在这两种情况下哪些标志处于活动状态。我发现的唯一区别是,-fexcess-precision 使用-O1 设置为“默认”。我尝试了两种可能性(快速和标准),但这没有任何区别。

有谁知道我忽略的-O 选项还激活了什么魔法?

【问题讨论】:

-O 激活不能用标志指定的优化。您可以禁用或启用具有标志的优化。某些优化无法禁用。 它是什么微控制器?不同的供应商在他们的“gcc compliant”编译器中做了不同的奇怪的事情。 @S.S.Anne 感谢您提供此信息。您是否知道是否有任何方法可以找出编译器仅使用 -O 标志执行的操作?我也刚刚在上面链接的手册中找到了这一点“如果未在命令行上设置 -O 级别,大多数优化将完全禁用 [...],即使指定了单独的优化标志。”这可以解释这种行为。 @yhyrcanus 我使用具有 Sparc V8 架构的 Leon2 微控制器。我使用的是gaisler提供的编译器 嗯,是的,也是。如果我的脑袋想不出来,但你可以浏览 GCC 源代码(谷歌它)来找出答案。 【参考方案1】:

根据 GCC 手册

Most optimizations are only enabled if an -O level is set on the command line.
Otherwise they are disabled, even if individual optimization flags are specified.

因此仅指定优化标志是不够的。例如here,您可以看到只有在-O-fweb 都启用时才启用某些分析:

class pass_web : public rtl_opt_pass

  ...
  virtual bool gate (function *)  return (optimize > 0 && flag_web); 

即使指定 -O1 并选择性地从更高的优化级别启用优化也不会可靠地工作,因为某些传递明确依赖于 -O 值。例如。 here 你可以看到在-O1 处禁用了部分 CSE 优化:

else if (tem == 1 || optimize > 1)
  cse_cfg_altered |= cleanup_cfg (0);

【讨论】:

linux常用工具(代码片段)

...,为众多不同体系的硬件平台开发软件服务,尤其应用于嵌入式开发领域。目前Linux默认使用的C编译器是GCC,具有如下优点:方便进行编译控制  通过GCC能够完美地控制整个编译过程,用户可以根据需要,在任何阶段让编译终... 查看详情

ac自动机+矩阵优化---[bjoi2017]魔法咒语

bzoj4860 LOJ2180 洛谷P3175[BJOI2017]魔法咒语题目描述:Chandra是一个魔法天才。从一岁时接受火之教会洗礼之后,Chandra就显示出对火元素无与伦比的亲和力,轻而易举地学会种种晦涩难解的法术。这也多亏Chandra有着常人难以企... 查看详情

GCC 优化级别有多少?

】GCC优化级别有多少?【英文标题】:HowmanyGCCoptimizationlevelsarethere?【发布时间】:2010-12-1905:02:32【问题描述】:GCC有多少个优化级别?我试过gcc-O1、gcc-O2、gcc-O3和gcc-O4如果我使用一个非常大的数字,它将不起作用。不过,我试... 查看详情

嵌入式软件中gcc编译,汇编,链接,调试的作用

GCC:是一套由GNU工程开发的支持多种编程语言的编译器。将程序代码编译成机器语言。编译:1、利用编译程序从源语言编写的源程序产生目标程序的过程。2、用编译程序产生目标程序的动作。编译就是把高级语言变成计算机可... 查看详情

智能魔法棒(手势控制器)———嵌入式篇(代码片段)

前篇硬件和结构已经准备完成,接下来就要进行嵌入式部分的开发。1环境搭建1.1产品创建  在进行魔法棒的固件开发之前,我们需要先在涂鸦IoT平台上创建一个智能产品,还不熟悉产品创建的同学可以通过涂鸦开... 查看详情

gcc-o优化等级(代码片段)

-O优化等级荣涛2021年10月15日1.GCC优化等级优化参数查询$gcc-Q--help=optimizers-Oxgcc-Q--help=optimizers-O0gcc-Q--help=optimizers-O1gcc-Q--help=optimizers-O2gcc-Q--help=optimizers-O3gcc-Q--help=opti 查看详情

禁用 GCC 中的所有优化选项

】禁用GCC中的所有优化选项【英文标题】:DisablealloptimizationoptionsinGCC【发布时间】:2016-01-2114:21:09【问题描述】:使用GCC编译C程序的默认优化级别是-O0。根据GCC文档关闭所有优化。例如:gcc-O0test.c但是,要检查-O0是否真的关闭... 查看详情

gcc 优化

】gcc优化【英文标题】:gccoptimizations【发布时间】:2012-06-2207:38:47【问题描述】:我想知道在启用任何类型的gcc/g++优化的情况下,以下代码在编译时是否会引发错误或警告。inta;a=func();if(a==2)assert(false);我认为以下代码可以在发... 查看详情

gcc中earlyinliner和ipainliner有什么区别?(代码片段)

...-早期内联器和IPA内联器。例如,在gcc/ipa-fnsummary.c中/*在优化和分析IPA内联器时,初始化循环优化器,以便我们可以生成适当的内联提示。在优化和分析早期内联时,初始化节点参数,以便我们可以生成正确的BB谓词。*/这两种内... 查看详情

GCC:冲突的优化

】GCC:冲突的优化【英文标题】:GCC:conflictingoptimizations【发布时间】:2014-08-3007:19:11【问题描述】:由于构建时间较长,我无法充分缩小导致internalcompilererror:Segmentationfault的罪魁祸首(不过,我已经设法排除了LTO)。存在于GCC... 查看详情

GCC 优化标志

】GCC优化标志【英文标题】:GCCOptimizationFlags【发布时间】:2013-12-0823:05:49【问题描述】:我正在尝试将一堆具有不同优化的可执行文件放在一起。我唯一的问题是,带有-c的gcc命令也应该能够使用-O标志吗?我问这个,因为我意... 查看详情

memset 在 32 位嵌入式平台上运行缓慢

】memset在32位嵌入式平台上运行缓慢【英文标题】:memsetslowon32-bitembeddedplatform【发布时间】:2019-07-2614:58:58【问题描述】:我正在嵌入式设备(STM32、ARM-CortexM4)上进行开发,预计memset和类似功能会针对速度进行优化。但是,我... 查看详情

如何在 gcc 中启用单个优化标志?

】如何在gcc中启用单个优化标志?【英文标题】:Howtoenablesingleoptimisationflagsingcc?【发布时间】:2012-03-3012:38:42【问题描述】:使用gcc时,是否可以在不指定-O级别的情况下启用单个优化标志?gcc-ffasst-mathfoo.c或gcc-O1-ffast-mathfoo.c哪... 查看详情

嵌入式开发之gcc编译器使用

                             嵌入式开发之GCC编译器使用   查看详情

奇怪的 GCC 优化错误 [关闭]

】奇怪的GCC优化错误[关闭]【英文标题】:StrangeGCCoptimisationbug[closed]【发布时间】:2014-01-2514:40:59【问题描述】:我正在编写一个包含许多不同模块的相当大的应用程序。出于明显的调试原因,我一直在打开GCC调试信息并关闭所... 查看详情

展开 gcc 编译器优化

】展开gcc编译器优化【英文标题】:Unrollinggcccompileroptimization【发布时间】:2010-10-2811:05:46【问题描述】:我有兴趣查看gcc实际优化代码的代码。有什么办法吗?我经历过一些其他类似的问题,我尝试过以下几件事,-Wa,ahl=filename... 查看详情

GCC 优化选项

】GCC优化选项【英文标题】:GCCOptimizationOption【发布时间】:2013-08-0603:09:07【问题描述】:最近用GCC编译一个程序,但是当我使用-O1优化选项时,出错了;使用-O0时没有问题。所以我用官方文档说的那些选项替换了-O1,例如-fauto... 查看详情

如何在 GCC 中通过优化构建发布模式?

】如何在GCC中通过优化构建发布模式?【英文标题】:HowtobuildinreleasemodewithoptimizationsinGCC?【发布时间】:2009-10-0800:08:51【问题描述】:我需要在“发布模式”中构建并在GCC中进行全面优化的具体选项是什么?如果有多个选项,... 查看详情