LLVM笔记2 Intermediate Representation (IR)

news2024/12/29 11:01:55

参考链接:https://llvm.org/devmtg/2019-04/slides/Tutorial-Bridgers-LLVM_IR_tutorial.pdf
https://zhuanlan.zhihu.com/p/163063995
https://zhuanlan.zhihu.com/p/163328574

文章目录

  • IR的布局
  • 1. IR语法
  • 2.IR递归函数
  • 3.使用迭代的方式
  • 4.全局变量
  • 5.LLVM’s type system

  • IR是一种低级编程语言——类似 RISC 的指令集……
  • 同时能够代表高级思想。即高级语言可以清晰地映射到 IR。
  • 实现高效的代码优化

在这里插入图片描述

在这里插入图片描述

IR的布局

ABI Application Binary Interface 应用程序二进制接口
API Application Program Interface 应用程序接口
右上方的图片里显示了一个Module的组成。
在这里插入图片描述

1. IR语法

  • 局部变量未命名:%<number>
  • 局部变量命名:%<name>
  • declare申明一个函数,返回值和传入参数是i32大小
  • 函数名@开头
  • define定义一个函数
  • icmp比较指令返回一个i1类型的值
  • eqne,分别代表相等或不相等
  • 无符号的比较ugt, uge, ult, ule,分别代表大于、大于等于、小于、小于等于;这里每个方案的u就代表以无符号的形式进行比较
  • 有符号的比较sgt, sge, slt, sle

LangRef Language Reference Manual是LLVM的语言参考手册,有很多指令详解,在其中可以查到:
call指令用于使控制流转移到指定的函数,其传入参数绑定到指定的值。根据被调用函数中的“ret”指令,控制流继续执行函数调用后的指令,并且函数的返回值绑定到结果参数。
在这里插入图片描述
IR代码中每一句都会强调变量的类型

  • i3232位4字节
  • i832位1字节
  • i1相当于bool类型,用bit位存数据
    每当在不接受该类型但接受某种其他类型的上下文中使用某种类型的表达式时,就会执行隐式转换。但是LLVM IR没有隐式转换,需要显式转换,否则会报错。
    LLVM IR中提供三种转换指令
  • trunc … to指令,将长的整型转换成短的整型。
  • zext … to指令,将短的整型变成长的整型,零扩展,直接在高位补0。
  • sext … to指令,将短的整型变成长的整型,符号扩展则是用原数的符号位来填充。
    在这里插入图片描述

2.IR递归函数

Branch - “br”,分支结构,由声明的label表示。label将Moudle分为3个basic block。有的label是隐式的,比如{后可以加一句entry:
在这里插入图片描述

3.使用迭代的方式

在这里插入图片描述
SSA Static Single Assignment静态单一分配:

  • 每个变量都只分配一次。
  • 每个变量在使用之前都已定义。

需要使用Phi指令根据之前执行的BasicBlock选择一个值,使用格式是:

 <result> = phi <ty> [<val0>, <label0>], [<val1>, <label1>]

相当于用这个实现变量自己的更新
在这里插入图片描述
最后的写法:

在这里插入图片描述

或者使用写入内存的方式实现变量自我更新,摆脱SSA限制。主要是利用指针:
在这里插入图片描述
内存访问和寻址操作

  • alloca指令在当前执行函数的堆栈帧上分配内存,当该函数返回到其调用者时自动释放内存。如果没有显式指定地址空间,则对象将从 datalayout string.alloca 分配到 alloca 地址空间中。
  • load读取某个位置的值。
  • store写入内存。
%ptr = alloca i32                               ; yields ptr
store i32 3, ptr %ptr                           ; yields void
%val = load i32, ptr %ptr                       ; yields i32:val = i32 3

4.全局变量

它们始终是指针,就像 Allocas 返回的值一样。总是一个常量指针

const int *p=&a; // 指针的指向可以修改,但是指针指向的值不可以修改

全局变量必须需要@开头,申明大小比如i8,被初始化,加上关键词global

@gv = global i8 42

或者是一个常量,永远不能被改变其值

@gv = constant i8 42

5.LLVM’s type system

计算指针偏移
在这里插入图片描述

这个详见intel的pdf,图画的很清晰,就不搬运贴过来了。59/91页


Next:
Learn how to manipulate IR using the LLVM library
Look at the OPT code

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

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

相关文章

STM32U5系列芯片,不支持ST-LINK v2怎么办

方案一 淘宝 唐卡思 购买stlink V3 &#xff08;万能的淘宝&#xff09; 方案二 使用jlink KEIL版本V5.34以上 支持M33编译 工程的分扇加载SCT件需要修改

LDAP协议

目录 LDAP是什么&#xff1f;什么是目录服务&#xff1f;什么是LDAP认证&#xff1f; 为什么要用LDAP&#xff1f;LDAP能做什么&#xff1f;为什么用LDAP做身份验证&#xff1f;LDAP的产品&实现 LDAP基本模型目录树&名词解释分布式 LDAP的操作 LDAP是什么&#xff1f; …

Elasticsearch:升级 Elasticsearch 最安全的方法

关于升级自己的 Elasticsearch 集群有很多种办法。很多涉及到滚动升级或需要重启集群。这是一个比较复杂的过程。一般来说&#xff0c;有两种可能发生的情况&#xff1a; 滚动升级&#xff08;无停机时间&#xff09;整个集群重新启动&#xff08;一些停机时间&#xff09; 如…

【Sa-Token】9、Sa-Token实现在线用户管理功能

尽管框架将大部分操作提供了简易的封装&#xff0c;但在一些特殊场景下&#xff0c;我们仍需要绕过框架&#xff0c;直达数据底层进行一些操作。 1、官方文档 会话查询 https://sa-token.cc/doc.html#/up/search-sessionSa-Token提供以下API助你直接操作会话列表&#xff1a…

电脑选购:6000元左右买到性价比超高的笔记本电脑,准大学生的购机指南

目录 一、ThinkBook 14 二、华硕灵耀14 2023 四、宏碁掠夺者擎Neo 五、惠普&#xff08;HP&#xff09;暗影精灵9 六、联想拯救者R7000P 2023 每年高考毕业季&#xff0c;许多即将进入大学的毕业生都会面临新电脑的选择&#xff0c;而对于喜欢玩游戏的同学&#xff0c;一般…

1分钟快速将智能聊天机器人接入国产ChatGLM开源模型

“ 了解如何在短短1分钟内&#xff0c;让智能聊天机器人与国产ChatGLM开源模型无缝连接&#xff0c;为你的应用增添智能交流能力&#xff01;” 01 — 昨天发布ChatGPT微信助手体验群后&#xff0c;见《ChatGPT 微信助手上线&#xff01;问答更便捷&#xff0c;功能持续升级中。…

Java 代码重试实现方式

Java 代码重试实现方式 一.方法内直接自动重试二.静态代理方式1.启动类2.接口3.实现4.静态代理5.单元测试类 三.JDK 动态代理1.代理类2.单元测试 四.CGLIB 动态代理1.动态代理类2.单元测试 五.手动 AOP1.自定义注解2.重试注解切面3.测试类4.单元测试方法 六.Spring Retry1.测试…

固态硬盘接口对比

固态硬盘接口对比 M.2接口固态硬盘固态硬盘接口固态硬盘尺寸接口兼容性 M.2接口 M.2接口&#xff0c;也称为NGFF&#xff08;Next Generation Form Factor&#xff09;&#xff0c;是一种计算机拓展接口规范。常见的M.2接口有A key、B key、E key和M key&#xff0c;不同的key…

书单背景怎么制作?分享一个实用的工具

在今天的信息时代&#xff0c;越来越多的人通过阅读来丰富自己的知识和技能。为了方便大家查找阅读材料&#xff0c;书单背景的制作变得越来越重要。本文将介绍书单背景的制作方法以及需要注意的问题。 书单背景的制作方法 1. 使用在线制作工具 在线制作工具如Canva提供了许多…

比较研发项目管理系统:哪个更适合您的需求?

项目管理系统对于保持项目进度、提高效率和确保质量至关重要。然而&#xff0c;市场上众多的研发项目管理系统让许多团队陷入选择困难。本文将对几个主流的研发项目管理系统进行深入分析&#xff0c;以帮助您找到最适合您团队的解决方案。 “哪个研发项目管理系统好用好&#x…

【MySQL】检索数据使用数据处理函数

函数 与其他大多数计算机语言一样&#xff0c;SQL支持利用函数来处理数据。函数一般是在数据上执行的&#xff0c;它给数据的转换和处理提供了方便。 函数没有SQL的可移植性强&#xff1a;能运行在多个系统上的代码称为可移植的。多数SQL语句是可移植的&#xff0c;而函数的可…

【Archaius技术专题】「Netflix原生态」动态化配置服务之微服务配置组件变色龙

前提介绍 如果要设计开发一套微服务基础架构&#xff0c;参数化配置是一个非常重要的点&#xff0c;而Netflix也开源了一个叫变色龙Archaius的配置中心客户端&#xff0c;而且Archaius可以说是比其他客户端具备更多生产级特性&#xff0c;也更灵活。*在NetflixOSS微服务技术栈…

CSS 的选择器有哪些种类?分别如何使用?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 元素选择器&#xff08;Element Selector&#xff09;⭐ 类选择器&#xff08;Class Selector&#xff09;⭐ ID 选择器&#xff08;ID Selector&#xff09;⭐ 后代选择器&#xff08;Descendant Selector&#xff09;⭐ 子元素选择器&a…

本地开发 npm 好用的http server、好用的web server、静态服务器

好用的web server总结 有时需要快速启动一个web 服务器&#xff08;http服务器&#xff09;来伺服静态网页&#xff0c;安装nginx又太繁琐&#xff0c;那么可以考虑使用npm serve、http-server、webpack-dev-server。 npm serve npm 的serve可以提供给http server功能&#…

外贸行业三大客户管理软件的特点?

外贸企业在开拓国际市场的过程中&#xff0c;经常会遇到客户信息混乱、销售流程复杂、市场竞争激烈等痛点。因此&#xff0c;外贸企业急需一款CRM系统来帮助他们管理客户信息、跟进销售机会等。这里有一份外贸客户管理软件排名&#xff0c;希望对您有所帮助。 Zoho CRM Zoho …

Nacos基本应用

Nacos 基本应用 Nacos 提供了 SDK 和 OpenAPI 方式来完成服务注册与发现等操作&#xff0c;SDK 实际上是对于 http 请求的封装。 微服务架构的电子商务平台&#xff0c;其中包含订单服务、商品服务和用户服务。可以使用 Nacos 作为服务注册和发现的中心&#xff0c;以便各个微…

aijs 盒子出血

效果演示 盒子出血演示 1.左下点 2.左上点 3.上左点 var doc activeDocument; var pt 72 / 25.4; var cx 3 * pt;var marks []; for (var i 0; i < doc.selection.length; i) {var shape doc.selection[i];if (shape.typename GroupItem && shape.pageItems.…

2023年深度学习最新研究成果

LLMs领域 AGI领域 无剑芯片设计平台 三级标题 四级标题 五级标题 六级标题

使用fopen等标准C库来操作文件

fopen 需要的头文件&#xff1a; #include <stdio.h> 函数原型&#xff1a; FILE *fopen(const char *pathname, const char *mode); 参数&#xff1a; pathname: 文件路径mode: “r” &#xff1a;以只读方式打开文件&#xff0c;该文件必须存在。“w” &#xff…

省电模式稳定电压显示IC32×4 LCD显示驱动芯片

简述 VK1C21A是一个点阵式存储映射的LCD驱动器&#xff0c;可支持最大128点&#xff08;32SEGx4COM&#xff09; 的LCD屏&#xff0c;也支持2COM和3COM的LCD屏。单片机可通过3/4个通信脚配置显示参数和发 送显示数据&#xff0c;也可通过指令进入省电模式。具备高抗干扰&a…