c – 尺寸优化选项
我试图找出一个嵌入式项目,其中开发人员可以选择将所有h和c文件包含到c文件中,然后他们可以使用-whole-program选项编译一个文件以获得良好的大小优化.
我讨厌这个,并决心将它变成一个传统的程序,只使用LTO来实现同样的目标. 开发工具包中包含的版本是; 有一个.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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |