加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 尺寸优化选项

发布时间:2020-12-16 06:50:12 所属栏目:百科 来源:网络整理
导读:我试图找出一个嵌入式项目,其中开发人员可以选择将所有h和c文件包含到c文件中,然后他们可以使用-whole-program选项编译一个文件以获得良好的大小优化. 我讨厌这个,并决心将它变成一个传统的程序,只使用LTO来实现同样的目标. 开发工具包中包含的版本是; ?aps-
我试图找出一个嵌入式项目,其中开发人员可以选择将所有h和c文件包含到c文件中,然后他们可以使用-whole-program选项编译一个文件以获得良好的大小优化.

我讨厌这个,并决心将它变成一个传统的程序,只使用LTO来实现同样的目标.

开发工具包中包含的版本是;
?aps-gcc(GCC)4.7.3 20130524(Cortus)
?GNU ld(GNU Binutils)2.22

有一个.o文件.text是0x1c7ac,断裂成67个.o文件.text出现为0x2f73c,我添加了LTO的东西并将其减少到0x20a44,好,但远远不够.

我已经尝试过-gc-sections并使用链接器插件选项,但他们没有进一步改进.

任何建议,我看到LTO的正确改进?

解决方法

要使LTO完美地工作,您需要在链接阶段获得与编译阶段相同的信息和优化算法. GNU工具无法做到这一点,我相信这实际上是创建LLVM / Clang的激励因素之一.

如果你想检查细节上的差异,我建议你为每个选项生成一个Map文件(ld选项-Map< filename>),看看是否有没有内联的函数或者更大的函数.通过将函数的定义移动到头文件中并将其定义为extern inline(有效地将其转换为宏(这是GNU扩展)),可以通过强制这些函数内联来手动解决内联的缺失.

较大的功能可能不会受到不断传播的影响,我认为你无法做任何事情.您可以通过仔细声明函数属性(如const,leaf,noreturn,pure和returns_nonnull)来进行一些改进.这些有效地承诺,如果使用单个编译单元,该函数将以编译器可能以其他方式检测的特定方式运行,并允许其他优化.

相比之下,Clang可以将您的目标代码编译为一种特殊的字节码(LLVM代表低级虚拟机,就像JVM是Java虚拟机,并运行字节码),然后可以在链接时执行此字节码的优化(或者确实运行时,很酷).由于这个字节码是优化的,无论你是否进行LTO,并且优化算法在编译器和链接器之间是通用的,理论上Clang / LLVM应该给出完全相同的结果,无论你是否使用LTO.

不幸的是,现在已经从LLVM中删除了C后端,我不知道如何将LLVM LTO功能用于您所针对的自定义CPU.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读