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模块在汽车电子各控制器中处于十分…

【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 当前效果&…

《剑指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.…

【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…

几个经典金融理论

完整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…

数解 transformer 之 self attention transformer 公式整理

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

Spring 用法学习总结(三)之 AOP

Spring学习 7 bean的生命周期8 AOP面向切面编程8.1 AOP相关术语8.2 AOP使用 7 bean的生命周期 bean的生命周期主要为bean实例化、bean属性赋值、bean初始化、销毁bean&#xff0c;其中在实例化和初始化前后都使用后置处理器方法&#xff0c;而InstantiationAwareBeanPostProce…

控制论与科学方法论

《控制论与科学方法论》&#xff0c;真心不错。 书籍原文电子版PDF&#xff1a;https://pan.quark.cn/s/00aa929e4433&#xff08;分类在学习目录下&#xff09; 备用链接&#xff1a;https://pan.xunlei.com/s/VNgj2vjW-Hf_543R2K8kbaifA1?pwd2sap# 控制论是一种让系统按照我…

CTF-web 之 burp suite 使用

burp suite 使用 一般其是作为一个辅助工具&#xff0c;直接使用来解题的部分是少数&#xff0c;我们可以使用它来观察请 求和响应&#xff0c;并且可以反复的提交&#xff0c;关键的是他还带有很多其他的功能&#xff0c;在我们做题的过程中&#xff0c; 使用的关键点包括&…

MyBatis篇----第六篇

系列文章目录 文章目录 系列文章目录前言一、什么是 MyBatis 的接口绑定?有哪些实现方式?二、使用 MyBatis 的 mapper 接口调用时有哪些要求?三、Mapper 编写有哪几种方式?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳…

OpenGL-ES 学习(1)---- AlphaBlend

AlphaBlend OpenGL-ES 混合本质上是将 2 个片元的颜色进行调和(一般是求和操作)&#xff0c;产生一个新的颜色 OpenGL ES 混合发生在片元通过各项测试之后&#xff0c;准备进入帧缓冲区的片元和原有的片元按照特定比例加权计算出最终片元的颜色值&#xff0c;不再是新&#xf…

书生浦语大模型实战营-课程笔记(2)

介绍了一下InternLm的总体情况。 InternLm是训练框架&#xff0c;Lagent是智能体框架。 这个预训练需要这么多算力&#xff0c;大模型确实花钱。 Lagent是智能体框架&#xff0c;相当于LLM的应用。 pip设置 开发机的配置 pip install transformers4.33.1 timm0.4.12 sente…