LLVM代码空间优化(一) 编译器自带的优化选项

news2024/11/22 5:55:09

最近项目组遇到编译安全固件,超出了r52安全核SRAM自带空间问题。急需要找寻方法优化代码体积(代码段大小+数据段大小+stack+bss段)方法,目前初步分析只有代码段&数据段有优化的可能,bss和stack优化空间并不大。有方法的小伙伴们可在下方留言,十分感谢

本文尝试从Clang 自带优化选项,解读不同选项带来的优化效果。

LLVM项目

LLVM是一个开源的项目,是一个编译器框架,是一系列模块化、可重用的编译器以及工具链技术的集合。
LLVM的核心是LLVM库。同时LLVM还实现了一些周边工具。
LLVM的一个设计思想是优化可以渗透在整个编译流程中各个阶段,比如编译时、链接时、运行时等。
你可以基于LLVM提供的功能开发自己的模块,并集成在LLVM系统上,增加它的功能;或者利用LLVM来支撑底层实现,开发自己的工具。它可以很容易和IDE集成(因为IDE软件可以直接调用库来实现一些如静态检查这些功能),也很容易构建生成各种功能的工具(因为新的工具只需要调用需要的库就行)。

可见
https://github.com/llvm/llvm-project
https://llvm.org/docs/GettingStarted.html

LLVM最初代表Low Level Virtual Machine, 但是随着LLVM家族越庞大,这个最初的意思已经不适用。llvm.org 上的介绍很明确, LLVM就是这个项目的全称。

LLVM项目最初由UIUC的Vikram 和 Chris Lattner于2000年开始开发。他们的最初的目的是为了静态和动态编程语言开发一个动态编译技术。2005年,Chris进入苹果公司,继续进行LLVM的开发。2013年,索尼公司也开始使用Clang开发PS4。

在这之前,Apple公司一直使用gcc作为编译器,后来GCC对Objective-C的语言特性支持一直不够,Apple自己开发的GCC模块又很难得到GCC委员会的合并。等到Chris Lattner毕业时,Apple就把他招入靡下,去开发自己的编译器,所以LLVM最初受到了Apple的大力支持。

广义的LLVM是指整个LLVM架构,狭义的LLVM指的是LLVM后端(包含代码优化和目标代码生成)。
在这里插入图片描述

Clang

LLVM只是一个编译器框架,所以还需要一个前端来支撑整个系统,所以Apple研发了Clang,作为整个编译器的前端,Clang用来编译C、C++和Objective-C。可以用Clang/LLVM来和gcc做对比

Clang与LLVM的关系如图
在这里插入图片描述

相比于GCC,Clang具有如下优点

  • 编译速度快:在某些平台上,Clang的编译速度显著的快过GCC(Debug模式下编译OC速度比GGC快3倍)
  • 占用内存小:Clang生成的AST所占用的内存是GCC的五分之一左右
  • 模块化设计:Clang采用基于库的模块化设计,易于 IDE 集成及其他用途的重用
  • 诊断信息可读性强:在编译过程中,Clang 创建并保留了大量详细的元数据 (metadata),有利于调试和错误报告
  • 设计清晰简单,容易理解,易于扩展增强

官方文档:

http://www.aosabook.org/en/llvm.html

https://llvm.org/docs/index.html

https://llvm.org/docs/GettingStarted.html

https://llvm.org/pubs/2008-10-04-ACAT-LLVM-Intro.pdf

https://llvm.org/docs/LangRef.html

https://github.com/llvm/llvm-project

编译优化

对于编译器来说, 优化是必须要经历的一个阶段, 经过优化的代码可以拥有更小的体积和更高效的执行。对于clang这个编译器前端而言。

现代编译器通常提供了许多优化选项,可以用来提高生成的代码的性能。这些优化包括函数内联、循环展开、死代码消除、常量折叠、指令重排等。

以下是一些常见的GCC和Clang的优化选项,代码的优化程度有一下的几个等级:

Code Generation Options¶
-O0, -O1, -O2, -O3, -Ofast, -Os, -Oz, -Og, -O, -O4¶
Specify which optimization level to use:

-O0 Means “no optimization”: this level compiles the fastest and generates the most debuggable code.

-O1 Somewhere between -O0 and -O2.

-O2 Moderate level of optimization which enables most optimizations.

-O3 Like -O2, except that it enables optimizations that take longer to perform or that may generate larger code (in an attempt to make the program run faster).

-Ofast Enables all the optimizations from -O3 along with other aggressive optimizations that may violate strict compliance with language standards.

-Os Like -O2 with extra optimizations to reduce code size.

-Oz Like -Os (and thus -O2), but reduces code size further.

-Og Like -O1. In future versions, this option might disable different optimizations in order to improve debuggability.

-O Equivalent to -O1.

-O4 and higher

Currently equivalent to -O3

https://clang.llvm.org/docs/CommandGuide/clang.html
https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

-O
-O1
优化。优化编译需要更多时间,并且对于大型函数需要更多的内存
使用 ,编译器会尝试减小代码大小和执行时间,而不执行任何需要大量编译时间的优化。-O
-O打开以下优化标志:
-fauto-inc-dec
-fbranch-count-reg
-fcombine-stack-adjustments
-fcompare-elim
-fcprop-registers
-fdce
-fdefer-pop
-fdelayed-branch
-fdse
-fforward-propagate
-fguess-branch-probability
-fif-conversion
-fif-conversion2
-finline-functions-called-once
-fipa-modref
-fipa-profile
-fipa-pure-const
-fipa-reference
-fipa-reference-addressable
-fmerge-constants
-fmove-loop-invariants
-fmove-loop-stores
-fomit-frame-pointer
-freorder-blocks
-fshrink-wrap
-fshrink-wrap-separate
-fsplit-wide-types
-fssa-backprop
-fssa-phiopt
-ftree-bit-ccp
-ftree-ccp
-ftree-ch
-ftree-coalesce-vars
-ftree-copy-prop
-ftree-dce
-ftree-dominator-opts
-ftree-dse
-ftree-forwprop
-ftree-fre
-ftree-phiprop
-ftree-pta
-ftree-scev-cprop
-ftree-sink
-ftree-slsr
-ftree-sra
-ftree-ter
-funit-at-a-time
-O2
进一步优化。GCC 执行几乎所有受支持的优化,这些优化不涉及空间速度权衡。
与之相比,此选项增加了编译时间和生成的代码的性能。-O

-O2打开 指定的所有优化标志。它还会打开以下优化标志:-O1
-falign-functions  -falign-jumps
-falign-labels  -falign-loops
-fcaller-saves
-fcode-hoisting
-fcrossjumping
-fcse-follow-jumps  -fcse-skip-blocks
-fdelete-null-pointer-checks
-fdevirtualize  -fdevirtualize-speculatively
-fexpensive-optimizations
-ffinite-loops
-fgcse  -fgcse-lm
-fhoist-adjacent-loads
-finline-functions
-finline-small-functions
-findirect-inlining
-fipa-bit-cp  -fipa-cp  -fipa-icf
-fipa-ra  -fipa-sra  -fipa-vrp
-fisolate-erroneous-paths-dereference
-flra-remat
-foptimize-sibling-calls
-foptimize-strlen
-fpartial-inlining
-fpeephole2
-freorder-blocks-algorithm=stc
-freorder-blocks-and-partition  -freorder-functions
-frerun-cse-after-loop
-fschedule-insns  -fschedule-insns2
-fsched-interblock  -fsched-spec
-fstore-merging
-fstrict-aliasing
-fthread-jumps
-ftree-builtin-call-dce
-ftree-loop-vectorize
-ftree-pre
-ftree-slp-vectorize
-ftree-switch-conversion  -ftree-tail-merge
-ftree-vrp
-fvect-cost-model=very-cheap
-O3
优化更多。 打开 指定的所有优化,并打开以下优化标志:-O3-O2
-fgcse-after-reload
-fipa-cp-clone
-floop-interchange
-floop-unroll-and-jam
-fpeel-loops
-fpredictive-commoning
-fsplit-loops
-fsplit-paths
-ftree-loop-distribution
-ftree-partial-pre
-funswitch-loops
-fvect-cost-model=dynamic
-fversion-loops-for-strides
-O0
减少编译时间,使调试产生预期的结果。这是默认值。
-Os
针对大小进行优化。 启用除经常增加代码大小的优化之外的所有优化:-Os-O2

-falign-functions  -falign-jumps
-falign-labels  -falign-loops
-fprefetch-loop-arrays  -freorder-blocks-algorithm=stc
它还使 能够使编译器针对代码大小而不是执行速度进行调整,并执行旨在减小代码大小的进一步优化。
-finline-functions
-Ofast
无视严格的标准合规性。 启用所有优化。它还支持并非对所有符合标准的程序都有效的优化
-Og
优化调试体验。 应该是标准编辑-编译-调试周期选择的优化级别,提供合理的优化级别,
同时保持快速编译和良好的调试体验。
这是比生成可调试代码更好的选择,
因为某些收集调试信息的编译器传递在 处被禁用。
-Og-O0-O0

与 一样,完全禁用许多优化传递,以便控制它们的单个选项不起作用。
否则启用所有优化标志,但可能干扰调试的标志除外:-O0-Og-Og-O1
-Oz
积极优化尺寸而不是速度。如果这些指令需要较少的字节进行编码,则可能会增加执行的指令数。 
行为类似于包括启用大多数优化。

实测结果:-Oz 优化尺寸效果最优

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/519310.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity Audio -- (5)声音的可用性考量

在某些情况下,用户可能会关闭声音或者让音量降低至很小的水平,用户本身的听力情况(用户可能有听力障碍,失聪等情况)也有差异。一个好的设计者应该要考虑到项目的可用性,音频也不例外。本节我们来看看如何能…

由于找不到msvcr100.dll,msvcr100.dll丢失怎样修复

在我们打开游戏或者软件的时候,电脑提示由于找不到msvcr100.dll文件,无法执行此代码是什么意思?msvcr100.dll为什么会丢失,又该如何修复呢?相信这些问题困扰着不少小伙伴,昨天是准备玩吃鸡游戏的时候&#…

被面试官故意刁难,太难了...

今年的金三银四,我和大多数的同行一样加入了升职涨薪的潮水,我早在2个月前就开始准备,我觉得自己在技术方面完全没有问题,于是这两个月我每天在公司摸鱼2小时,回家刷2小时,前前后后刷了几千到面试题&#x…

【LeetCode困难】1263. 推箱子

「推箱子」是一款风靡全球的益智小游戏,玩家需要将箱子推到仓库中的目标位置。 游戏地图用大小为 m x n 的网格 grid 表示,其中每个元素可以是墙、地板或者是箱子。 现在你将作为玩家参与游戏,按规则将箱子 ‘B’ 移动到目标位置 ‘T’ &am…

设计模式|代理模式

代理模式介绍 ​代理模式指为其他对象提供一种代理,以控制对这个对象的访问。在某些情况下,一个对象若不能直接引用另一个对象,而代理对象可以在客户端与目标对象之间起到中介的作用。 代理模式使用场景 普通代理 普通代理模式是指在代理模…

C++的string类使用介绍

string类 1.为什么要学习string类?1.1.C语言中的字符串1.2. 日常中 2. 标准库中的string类2.2 string类(对于单字节的字符)的常用接口说明①string常见的构造函数②string类对象的容量操作③string类对象的访问以及遍历操作④string类对象的修改操作⑤string类非成员…

OrCAD怎样把原理图输出为DXF格式

OrCAD怎样把原理图输出为DXF格式 又有段时间没分享文章了,想想主要还是自媒体写点内容确实不容易,要不断坚持下来更不容易,一直以来也就是凭着“乐于分享”的心在不定时更新。 今天分享的主题是:OrCAD怎样把原理图输出为DXF格式…

标准CSO

Cheng R, Jin Y. A competitive swarm optimizer for large scale optimization[J]. IEEE transactions on cybernetics, 2014, 45(2): 191-204. 1.1 背景介绍 CSO(competitive swarm optimizer)算法是在PSO(particle swarm optimization&a…

医日健“数智药房”解锁购药新模式

“现在买药这么方便,半夜拉肚子过来自助付款、自助取药,还能连线医生,很快就买好了药。”上海市宝山区消费者王先生惊喜地说。近日,宝山区一国大药房医日健 “智慧药房”正式上线营业,该药房实现自助式、无接触就医购药…

如何添加团队成员到你的项目

本文介绍在YonBuilder移动开发中,如何把你的团队成员添加到你的应用中,让团队成员也具备应用的相关配置,代码拉取,打包编译等功能权限。 简单来说把「团队成员添加到你的项目」,一共需要三步大流程操作,具…

基于AT89C51单片机的篮球比赛计时计分器

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87778138?spm1001.2014.3001.5503 源码获取 主要内容: 比赛的计分和计时的工具大多是很简陋的比分牌,十分的不方便。而且大多由于缺少24秒…

Meta-learning综述

文章目录 几个概念1)监督、无监督、弱监督学习(Weakly Supervised Learning)以及 自监督学习(Self-supervised Learning)2)域偏移、域适应、域泛化3)N-way K-shot(Few-shot learning…

【Java虚拟机】JVM诊断神器Arthas入门实操

1.Arthas简介快速入门 阿里开源的Java诊断工具,它可以在运行时对Java应用程序进行动态诊断和调试 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?我改的代…

国考省考行测:数字推理题2

国考省考行测:数字推理题2 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考省考最重要的还是申论和行测,所以大家认真准备吧,我讲一起屡屡申论和行测的重要知识点 …

改进YOLOv8 | 特征融合篇 | YOLOv8 应用 BiFPN 结构 | 《 EfficientDet: 可扩展和高效的目标检测》

模型效率在计算机视觉中变得越来越重要。在本文中,我们系统地研究了目标检测中的神经网络架构设计选择,并提出了几种关键的优化方法来提高效率。首先,我们提出了一种加权双向特征金字塔网络(BiFPN),它可以实现简单快速的多尺度特征融合;其次,我们提出了一种复合缩放方法…

从期望最大化(EM)到变分自编码器(VAE)

本文主要记录了自己对变分自编码器论文的理解。 Kingma D P, Welling M. Auto-encoding variational bayes[J]. arXiv preprint arXiv:1312.6114, 2013. https://arxiv.org/abs/1312.6114 1 带有潜在变量的极大似然估计 假设我们有一个有限整数随机数发生器 z ∼ p θ ( z ) …

Linux | 学习笔记(适合小白)上

操作系统概述: 计算机是由硬件和软件这两个主要部分组成的操作系统是软件的一类,主要作用是协助用户调度硬件工作,充当用户和计算机硬件之间的桥梁常见的操作系统:PC端:Windows,Linux,MacOS&…

电子邮件市场中,如何使用您的Gmail?

Gmail凭借其直观的界面、慷慨的免费存储空间(与其他Google工具共享15 GB,如Google Drive和Photos)以及作为常规Gmail账户附加的各种免费生产力工具,在电子邮件市场占据主导地位。但是,人们对Google如何使用您的电子邮件…

决策引擎平台建设方案

文档修订历史 时间版本主要内容2023.05.12v1.0.0初始化 1. 概述 1.1 需求 1.1.1 需求背景 当同一个业务场景中,有非常多的业务分支后,需要有非常多的 if 判断,来承载这些简单的业务逻辑,但随着业务的发展,业务逐渐…

Java --- redis7之大数据统计之Bitmap

目录 一、大数据统计之Bitmap 1.1、面试题 1.2、京东签到领取京豆 一、大数据统计之Bitmap 1.1、面试题 1、日活统计 2、签到打卡 3、最近一周的活跃用户等 1.2、京东签到领取京豆 一个月的签到天数,连续签到数 方案1:使用MySQL来实现(小项目) …