LLVM的中间表示

概括

选择编译器IR的决策很重要,它决定了优化过程将拥有多少信息来使代码运行得更快。

一方面非常高层级的IR允许优化器轻松地提取原始源代码的相关信息。

另一方面,低层的IR更加贴近目标机器,这样编译器更容易为特定的硬件生成相应的代码,并有可能利用目标机器的特性

但是IR的层级又不能太低

  • 当编译器将程序转换为更接近机器指令的表示时,将程序片段映射到源码会变得越来越困难
  • 如果编译器的IR设计采用与特定目标机器非常相似的表示,将不利于为其他不同结构的机器代码生成

LLVM项目从一系列围绕LLVM IR工具展开,这证明优化器是成熟的,用于本层的优化器数量是合理的。IR有三种等价的表达形式:

1.内存表示(Instruction类等)
2.被压缩的磁盘表示(位码文件)
3.人工可读文本的磁盘表示(LLVM汇编文件)

LLVM提供的工具和库使你能处理以上所有形式的IR,并且这些工具能够对IR进行不同表示形式的转换,同时应用优化

在这里插入图片描述

理解LLVMIR对编译目标的依赖

LLVM IR被设计成尽可能地与编译目标无关,但它仍然对编译目标有一定的依赖性。造成该依赖性的一个普遍承认的原因是C/C++语言固有的目标以来性质。要理解这一点,可以将在Linux系统中使用标准C头文件作为例子:程序会从Linux头文件专用文件夹bits中隐式导入一些文件。此文件加包含目标相关的头文件,这些文件中有一些宏定义会强迫某些具有特定的类型,以便与该内核的系统调用期望的类型相匹配。在导入头文件之后,当前端解析源代码时,还需要对int类型使用不同的大小,以匹配运行此代码的目标机器

因此,库头文件和C的类型都已经是依赖目标的,这使得要产生可以在之后被转换成其他目标的IR变得困难

如果仅考虑依赖目标的C标准库头文件,则给定编译单元的解析AST甚至在被转换为LLVM IR之前就已经是依赖目标的

此外前端生成IR代码时,需要使用与编译目标ABI相匹配的类型大小、调用惯例和特殊库调用等。

尽管如此,LLVM IR 还是非常灵活的,具有抽象应对不用的编译目标的能力

操作IR格式的基本工具示例

生成位码
clang sum.c -emit-llvm -c -o sum.bc
生成汇编
clang sum.c -emit-llvm -s -c -o sum.ll
汇编上述LLVM IR 汇编文本
llvm-as sum.ll -o sum.bc
从位码转换为IR汇编文本,反汇编程序:
llvm-dis sum.bc -o sum.ll
通过llvm提取工具llvm-extract ,可以提取IR函数、全局变量、删除IR模块中的全局变量
Ag:
llvm-extract -func=sum sum.bc -o sum-fn.bc
这条命令可以提取出sum函数
以上这些操作在这边博客中有写https://blog.csdn.net/m0_72827793/article/details/135894096

LLVM IR 语法介绍

在这里插入图片描述
整个LLVM文件的内容(无论是汇编码还是位码)被视为定义一个LLVM模块

模块是LLVM IR 顶层数据结构

每个模块包含一系列函数,每个函数由包含一系列指令的一系列基本块组成

模块还包含用于支持该模型的外围实体,如全局变量、目标数据布局、外部函数原型以及数据结构声明

LLVM局部变量与汇编语言中寄存器类似,可以用任何以%符号开头的名称命名

%7=add nsw i32 %5,%6
这一指令将执行两个局部变量%5和%6的加法,并将结果至于新的局部变量%7中

用户可以自由地给这些值命名,甚至可以只用数字就像上面一样

LLVM表达的基本属性:

  • 它使用的是静态单赋值(SSA)形式。请注意,该形式下每个变量都不会被重新赋值,每个变量只有唯一一条定义它的赋值语句。每次使用一个变量都可以立即回溯到负责其定义的唯一指令。使用SSA形式导致“使用定义链”(use-def链,即可以达到使用处的所有定义/赋值语句的集合)的生成变得非常简单,这个简单操作具有巨大的价值。使用定义链是经典优化(如传播和冗余表达式消除)的前提条件,如果LLVM没有使用SSA的形似,则需要运行单独的数据流分析来计算使用定义链
  • 代码被组成的三地址指令,数据处理指令有两个源操作数,并将结果放在不同的目标操作数中
  • 有无穷多的寄存器,注意LLVM局部变量可以使用以%符号开始的任意名称,例如%0、%1从零开始的数字,他对局部变量的最大数量没有限制

LLVM IR基本类型系统

类型系统具体的子类型
基本类型integer/floating point/label/void/metadata/x86mmx
派生类型array/function/pointer/structure/opaque structures/vector

LLVM IR指令集

指令类型具体的子类型
二元操作add/sub/mul/udiv/sdiv/urem/srem/fadd/fmul/fdiv/frem
按位二元操作shl/lshr/ashr/and/or/xor
终止指令ret/bt/switch/indirector/resume/unreachable/invoke
内存访问与地址操作alloc/load/store/atomic instructions/getelementptr
向量操作extractelement/insertelement/shufflevector
聚合操作extractvalue/insertvalue
转换操作trunc/zext/sext/fptrunc/fptoui/fptosi/uitofp/sitofp/ptrtoint/inttoptr/bicast
其他icmp/fcmp/select/phi/call/va_arg/landingpad

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

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

相关文章

RH850从0搭建Autosar开发环境【2X】- Davinci Configurator之XCP模块配置详解(上)

XCP模块配置详解 - 上 一、XCP模块配置项处理1.1 Tx Pdu配置项二、XCP模块其他配置项2.1 参数XcpMainFunctionPeriod2.2 参数XcpOnCanEnabled2.3 容器XcpOnCan总结从本节开始先专注与配置项错误处理以及构建Autosar Rh850的最小系统搭建。 XCP模块在汽车电子各控制器中处于十分…

100天精通风控建模(原理+Python实现)——第16天:风控建模中的准确率是什么?怎么实现?

风控模型已在各大银行和公司都实际运用于业务,用于营销和风险控制等。本文以视频的形式阐述风控建模中卡方检验是什么,怎么实现。并提供风控建模原理和Python实现文章清单。    之前已经阐述了100天精通风控建模(原理+Python实现)——第1天:什么是风控建模?    100天精…

【Java记】数据类型与变量

一、数据类型 在Java中数据类型主要分为两类:基本数据类型和引用数据类型。基本数据类型有四类八种: 四类:整型、浮点型、字符型以及布尔型八种: 数据类型 关键字 内存占用 范围 字节型 byte 1 字节 -128~ 127 短整型 …

高程 | 数组、指针与字符串(c++)

文章目录 📚数组🐇数组的概念🐇数组的声明与使用🐇数组的存储与初始化🐇数组作为函数参数🐇对象数组 📚指针🐇内存空间的访问方式🐇指针变量的声明🐇指针运算…

蓝桥杯嵌入式第10届真题(完成) STM32G431

蓝桥杯嵌入式第10届真题(完成) STM32G431 题目 main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body********************************…

【C语言】指针练习篇(下),深入理解指针---指针练习题【图文讲解,详细解答】

欢迎来CILMY23的博客喔,本期系列为【C语言】指针练习篇(下),深入理解指针---指针练习题【图文讲解,详细解答】,图文讲解指针练习题,带大家更深刻理解指针的应用,感谢观看,支持的可以…

文件操作详解

文章目录 目录1. 为什么使用文件2. 什么是文件2.1 程序文件2.2 数据文件2.3 文件名 3. 文件的打开和关闭3.1 文件指针3.2 文件的打开和关闭 4. 文件的顺序读写5. 通讯录的改造6. 文件的随机读写6.1 fseek6.2 ftell6.3 rewind 7. 文本文件和二进制文件8. 文件读取结束的判定9. 文…

『运维备忘录』之 Lsof 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大…

Excel模板2:进度条甘特图

Excel模板2:进度条甘特图 ‍ 今天复刻B站up【名字叫麦兜的狗狗】的甘特图:还在买Excel模板吗?自己做漂亮简洁的甘特图吧!_哔哩哔哩_bilibili 阿里网盘永久分享:https://www.alipan.com/s/cXhq1PNJfdm 当前效果&…

CGAL::2D Arrangements-7

7 几何Traits 几何Traits封装了几何实体的定义以及处理这些几何实体的几何predicates和构造的实现,由Arrangement_on_surface_2类模板和其他周边模块使用。应用于Arrangement的各种算法所确定的最小要求被组织在精细几何特征概念的层次中。每个概念列出的需求只包括…

python_numpy库_ndarray的聚合操作、矩阵操作等

一、ndarray的聚合操作 1、求和np.sum() import numpy as np ​ n np.arange(10) print(n) ​ s np.sum(n) print(s) ​ n np.random.randint(0,10,size(3,5)) print(n) s1 np.sum(n) print(s1) #全部数加起来 s2 np.sum(n,axis0) print(s2) #表示每一列的多行求和 …

《剑指offer》--字符串左旋【超详细建议收藏】

字符串左旋的三种方法 1. 一个一个字符挪2. 库函数---strcpy和strncat3. 三段逆置法 1. 一个一个字符挪 代码实现如下&#xff1a; #include <stdio.h> #include <string.h>void Left_Reverse(char* str,int k) {int len strlen(str);//6int time 0;time k % …

react【六】 React-Router 路由

文章目录 1、Router1.1 路由1.2 认识React-Router1.3 Link和NavLink1.4 Navigate1.5 Not Found页面配置1.6 路由的嵌套1.7 手动路由的跳转1.7.1 在函数式组件中使用hook1.7.2 在类组件中封装高阶组件 1.8 动态路由传递参数1.9 路由的配置文件以及懒加载 1、Router 1.1 路由 1.…

「Python」Selenium

基本使用 导入&#xff1a;from selenium import webdriver创建浏览器操作对象&#xff1a;browser webdriver.Chrome()访问网站 # 访问网站 url https://www.jd.com browser.get(url)""" selenium基本使用Author&#xff1a;binxin Date&#xff1a;2023/1…

【C语言】常见字符串函数的功能与模拟实现

目录 1.strlen() 模拟实现strlen() 2.strcpy() 模拟实现strcpy() 3.strcat() 模拟实现strcat() 4.strcmp() 模拟实现strcmp() 5.strncpy() 模拟实现strncpy() 6.strncat() 模拟实现strncat() 7.strncmp() 模拟实现strncmp() 8.strstr() 模拟实现strstr() 9.str…

Redis核心技术与实战【学习笔记】 - 29.Redis的未来猜想,基于 NVM内存

前言 这几年&#xff0c;新型非易失存储&#xff08;Non-Volatile Memory&#xff0c;NVM&#xff09;器件发展得非常快。NVM 器件具有容量大、性能快、能持久报错数据的特性&#xff0c;这些刚刚就是 Redis 追求的目标。同时 NVM 器件像 DRAM 一样&#xff0c;可以让软件以字…

几个经典金融理论

完整EA&#xff1a;Nerve Knife.ex4黄金交易策略_黄金趋势ea-CSDN博客 一、预期效用理论 预期效用理论是描述人们在做出决策时如何考虑风险和不确定性的一种理论。该理论最初由经济学家冯诺伊曼&#xff08;John von Neumann&#xff09;和奥斯卡摩根斯坦恩&#xff08;Oskar…

全栈笔记_工具篇(nvm免安装版配置)

免安装版配置 下载nvm包:选择免安装压缩包nvm-noinstall.zip 解压zip包:将压缩包解压到指定目录,如:C:\nvm 新增环境变量: NVM_HOME:nvm解压之后的文件路径,对应配置文件里的root值NVM_SYMLINK:nvm 文件夹里新建 nodejs文件夹,对应配置文件里的path值 修改环境变量Pat…

跨域问题浅析

什么是源(域) 在W3C的定义中,源是由协议、主机(IP 地址或者域名)和端口三者确定。如果两个 URL 的协议、主机(IP 地址或者域名)和端口都一样的话,那么这两个 URL 就是同源的。 同源策略 由于源与源之间是未知且默认的,所以非本源中的资源(即URL对应的资源)是不可控的…

数解 transformer 之 self attention transformer 公式整理

千万不要从任何角度轻看 transformer&#xff0c;重要的话说四遍&#xff1a; 千万不要从任何角度轻看 transformer 千万不要从任何角度轻看 transformer 千万不要从任何角度轻看 transformer Attention is all you need 整个项目是鬼斧神工之作&#xff0c;巧夺天工之作&a…