llvm-ir之核心类设计

news2024/9/21 0:46:02

llvm-ir之核心类设计

  • 引言
  • 1 逻辑关系
  • 2 class Module
  • 3 class IRBuilder
  • 4 class Instruction
  • 5 class Constant

引言

llvm IR是llvm对代码的一种中间表示。它来源AST(抽象语法树),是llvm代码优化的主要对象。

1 逻辑关系

在这里插入图片描述
IR的很多组成元素都是以Value为基类。llvm并没有采用C++的RTTI,而是自实现了一套多态系统,其实现核心就在Class Value::Subclass*系列字段。

  • 每个Value(无论是基本块、参数还是常量),都可以被多个User引用;
  • 每个User引用的Value,通过Use对象记录其Value;同时,其Use对象占用的空间在User的new重载时,会分配到User对象的前部分;
  • 以C语言为例,每个Module对应C语言的一个编译单元,即.c文件;
  • 一般,每个Module和每个IRBuilder关联同一个LLVMContext。IRBuilder是构建Instruction的模板对象。

2 class Module

每个模块代表链接前的一个编译单元,模块一般包括:

  • GlobalVariable : 一个或多个全局变量。若getInitializer返回为NULL,则为只有声明的变量,其初始化可能在本模块、也可能在其他模块;
  • Function:一个或多个函数。若函数没有基本块且没有设置IsMaterializableBit,则只为一个声明函数,其定义可能在其他模块;

此外,还包括:

  • GlobalAlias:全局变量的别名(引用);
  • GlobalIFunction:全局间接函数,例如GNU IFUNC;
  • ValueSymbolTable:按名称建立全局符号的索引。

3 class IRBuilder

IRBuilder是指令和常量的构建器,它是一个模板类,它有两个模板参数:

  • 第一个模板参数表示构建时用于常量折叠的类实现,用于生成常量时提前自动折叠。默认类型为ConstantFolder;
  • 第二个模板参数表示一个带有InsertHelper方法的类型,用于插入指令到BasicBlock(可以做一些自定义操作)。默认类型为IRBuilderDefaultInserter

4 class Instruction

Instruction表示一个IR指令,llvm采用静态单赋值(Static Single Assignment, SSA)模式的指令。
指令相关field:

  • Type :指令输出结果的类型;
  • Opcode : 表示指令的操作类型(例如mov、add等);
  • Name : 指令输出结果的名称。在指令可视化文本展示中,一般表示指令目标寄存器;如果其Name没有定义,一般用指令在函数中的序号表示;
  • Op : 指令的操作数,通过class Use对象引用另一个指令或常量(SSA特性);

注:指令对象指令分配在堆中,其依赖的操作数(class Use)分配在其对象的前面。

5 class Constant

Constant表示常量,除了代码中的一些常量(常量字符、常量int等),函数和全局变量也是常量:

  • 函数之所以属于常量,是一个函数其实现在运行后具备不可变特性,所以它理应属于常量。所以给一个函数指针变量赋值时,直接可以将相同类型的函数赋值给该变量;
  • 全局变量属于常量,并不是其数据的不可变,而是其地址是固定的。所以它的常量特性是其地址不可更改性。

注:常量与指令类似,它也是一个User,例如它可以由其他常量通过表达式合成。

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

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

相关文章

【web3空投】SINSO 主网公测空投

Web3.0 基础设施简化去中心化的热数据缓存和数据治理 文章目录1. SINSO Token介绍2. SINSO 主网公测空投2.1 时间2.2 奖励2.3 参与方式2.3.1 第一步(必须完成)2.3.2 第二步(成为矿工)2.3.3 第三步(成为节点担保人)2.3.4 第四步:公开测试反馈表3. 注意事项4. 成为矿工…

这几个方法让你实现EXCEL文件翻译成中文

在日常的工作中,如果遇到需要将EXCEL翻译成其它语言的的时候,我们该怎么办呢?一行一行的复制查找,然后再粘贴回表格中吗?这样操作的话,不仅浪费时间和精力,而且效率还非常的低。那有什么方法可以…

Java项目:SSM图书馆图书管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 读者角色包含以下功能: 读者登录,图书查询,借阅图书,借阅管理,修改密码,借阅记录等功能。 管理员角色包含以下功能: 管理…

Android 系统启动到App 界面完整详解~

通过本篇文章,你将了解到: Android 系统启动流程概览ServiceManager 进程作用Zygote 进程创建与fork子进程system_server 进程作用App 与 system_server 交互Activity 与 View的展示全流程图 1. Android 系统启动流程概览 init 是用户空间的第一个进程&a…

ARM基础(1):Cortex-M3寄存器

Cortex-M3处理器的寄存器包括R0~R15和一些特殊的寄存器。其中R0到R12是通用寄存器,但是一些16位的Thumb指令只能访问R0到R7(低寄存器),而32位的Thumb-2指令则可以访问所有这些寄存器。特殊寄存器只能通过特殊访问指令访问。 所有的寄存器如下图所示&…

Java安全--篇四-Java原生反序列化

Java原生序列化和反序列化 看理论: 序列化和反序列化的详解_tree_ifconfig的博客-CSDN博客_序列化和反序列化 java序列化与反序列化全讲解_mocas_wang的博客-CSDN博客_java反序列化 java 序列化和反序列化 - xbwang520 - 博客园 序列化和反序列化的简单图解&am…

[附源码]Python计算机毕业设计Django微录播室预约管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

【计算机网络】超详细——VLAN、Trunk的配置

1、VLAN 1.1 什么是VLAN? VLAN:即Virtual Local Area Network(虚拟局域网),是物理设备上连接的不受物理位置限制的用户的一个逻辑组,将一个物理LAN划分成多个广播域的通信技术;每一个VLAN是一…

想要高效运行SolidWorks,云上设计了解一下

SolidWorks是达索系统(Dassault Systemes S.A.)旗下SolidWorks公司开发的,运行在微软Windows平台下的第一个三维机械设计软件,涵盖非常广泛的横截面制造业细分市场,目前广泛应用在航天、建筑、汽车生产企业、模具生产企…

[附源码]Python计算机毕业设计Django农产品销售网站

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,我…

C语言学习之路(基础篇)—— 文件操作(下)

说明&#xff1a;该篇博客是博主一字一码编写的&#xff0c;实属不易&#xff0c;请尊重原创&#xff0c;谢谢大家&#xff01; 文件的随机读写 1) fseek 表头文件&#xff1a;#include <stdio.h>定义函数&#xff1a;int fseek(FILE *stream, long offset, int whenc…

【网络层】BGP协议详解、三种路由协议总结

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录BGP协议------外部网关协议----BGP发言人交换网络可达性信息树形结构---防止兜圈子---交换完整路径信息---路径向量BGP格式---应用层协议-------TCP传送-----先建立TCP连接-----建立BGP session---利用会话交…

[附源码]JAVA毕业设计律师事务管理系统(系统+LW)

[附源码]JAVA毕业设计律师事务管理系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术…

MyBatisPlus_快速入门_笔记

MyBatisPlus_快速入门_笔记 文章目录MyBatisPlus_快速入门_笔记学习目标一、MyBatisPlus简介1. 入门案例问题导入1.1 SpringBoot整合MyBatisPlus入门程序①&#xff1a;创建新模块&#xff0c;选择Spring初始化&#xff0c;并配置模块相关基础信息③&#xff1a;手动添加MyBati…

规避跑道安全事故,如何进行飞机跑道入侵检测

机场跑道入侵因为危险源综合而复杂&#xff0c;涉及方面很多&#xff0c;管制员、飞行员、环境等众多因素的影响导致&#xff0c;一直难以彻底消除&#xff0c;是全球民航面临的重要核心问题。本文围绕北斗RTK技术&#xff0c;探讨如何防止车辆入侵跑道。 机场跑道面积辽阔&am…

# Navicat报错:1045-Access denied for user root@localhost(using password:YES)怎么解决

文章目录1.删除mysql服务2.新建my.ini配置文件3.重新生成data文件4.重新安装mysql服务&#xff0c;同时绑定my.ini配置文件5.重新设置密码6.修改root用户密码1.删除mysql服务 以管理员身份运行cmd&#xff0c;进入安装目录下的mysql的bin文件下&#xff0c;运行命令&#xff1…

Executor框架

文章目录前言Executor框架简介ScheduledThreadPoolExecutor和ThreadPoolExecutor对比总结前言 在一些场景&#xff0c;我们常常会用到多线程&#xff0c;但是线程的管理又比较麻烦。所以我们通常使用线程池来进行线程的管理&#xff0c;而今天我们将介绍一个java中常常 用来创…

如何通过编码器信号计算输送线/输送带线速度(飞剪、追剪算法基础)

不同品牌PLC如何采集编码器的频率(速度)信号,专栏有系列文章和详细讲解,这里不再赘述,链接地址如下: PLC通过编码器反馈值计算速度的推荐做法(算法解析+ST代码)_RXXW_Dor的博客-CSDN博客_plc运算速度PLC如何测量采集编码器的位置数据,不清楚的可以参看我的另一篇博文:…

【docker】配置深度学习环境

目录基本环境搭建问题与解决容器启动后添加端口映射安装完虚拟环境后 CUDA调用不了opencv的使用问题自定义软件包的使用基本环境搭建 容器基本操作&#xff1a; # 按照服务器配置拉取对应的镜像 docker pull pytorch/pytorch:1.9.0-cuda10.2-cudnn7-devel# 查看主机端口 没有信…

网站部署SSL证书是否会影响网站流量?

给网站部署SSL证书的重要性想必很多站长用户都已知悉&#xff0c;SSL证书是数字证书的一种&#xff0c;由受信任的数字证书颁发机构CA&#xff0c;在验证服务器身份后颁发&#xff0c;具有服务器身份验证和数据传输加密功能。由于SSL证书是部署在服务器上&#xff0c;那么SSL证…