LLVM学习(1)

2023-10-27

转自:https://github.com/XChainLab/documentation/blob/master/VM/EOS/EOSVMArch.md

 

LLVM项目是一系列分模块、可重用的编译工具链。它提供了一种代码良好的中间表示(IR),
LLVM实现上可以作为多种语言的后端,还可以提供与语言无关的优化和针对多种CPU的代码生成功能。

LLVM不同于传统的我们熟知的编译器。传统的静态编译器(如gcc)通常将编译分为三个阶段,分别
由三个组件来完成具体工作,分别为前端、优化器和后端,如下图所示。

CommonComplier

LLVM项目在整体上也分为三个部分,同传统编译器一致,如下图所示,不同的语言的前端,统一的
优化器,以及针对不同平台的机器码生成。从下图我们也可以得到启发,如果想实现一门自定义的
语言,目前主要的工作可以集中在如何实现一个LLVM的前端上来。
LLVMArchSimple

LLVM整体的流程,编译前端将源码编译成LLVM中间格式的文
件,然后使用LLVM Linker进行链接。Linker执行大量的链接时优化,特别是过程间优化。链接得
到的LLVM code最终会被翻译成特定平台的机器码,另外LLVM支持JIT。本地代码生成器会在代码
生成过程中插入一些轻量级的操作指令来收集运行时的一些信息,例如识别hot region。运行时收
集到的信息可以用于离线优化,执行一些更为激进的profile-driven的优化策略,调整native code
以适应特定的架构。
LLVMArchFull

LLVM的优势:

1:持续的程序信息,每个阶段都可以获得程序的信息内容

2:离线代码生成,产生较高的可执行程序

3:便捷的profiling及优化,方便优化的实施

4:透明的运行模式

5:统一,全程编译

LLVM IR

根据编译原理可知,编译器不是直接将源语言翻译为目标语言,而是翻译为一种“中间语言”,即
"IR"。之后再由中间语言,利用后端程序翻译为目标平台的汇编语言。由于中间语言相当于一款编
译器前端和后端的“桥梁”,不同编译器的中间语言IR是不一样的,IR语言的设计直接会影响到编
译器后端的优化工作。LLVM IR官方介绍见:http://llvm.org/docs/LangRef.html

目前LLVM IR提供三种格式,分别是内存里面的IR模型,存储在磁盘上的二进制
格式,存储在磁盘上的文本可读格式。三者本质上没有区别,其中二进制格式以bc为文件扩展名,
文本格式以ll为文件扩展名。除了以上两个格式文件外,和IR相关的文件格式还有s和out文件,这
两种一个是由IR生成汇编的格式文件,一个是生成的可执行文件格式(linux下如ELF格式),

  • bc结尾,LLVM IR文件,二进制格式,可以通过lli执行
  • ll结尾,LLVM IR文件,文本格式,可以通过lli执行
  • s结尾,本地汇编文件
  • out, 本地可执行文件

以上几种不同文件的转化图如下所示,整体上我们可以看一下这几种格式的转化关系,同时从中
我们也可以看出工具clang、llvm-dis、llvm-as等工具的作用和使用。
LLVMFormatFileTrans

中间语言IR的表示,一般是按照如下的结构进行组织的由外到内分别是:

  • 模块(Module)
  • 函数(Function)
  • 代码块(BasicBlock)
  • 指令(Instruction)

LLVM IR指令集

指令集的分类大致可以分为基于栈的,基于运算器的还有基于寄存器的,基于栈的和基于寄存器
的虚拟机目前是比较常见的,两种不同之处主要在运行效率,指令集大小和性能三个方面。LLVM IR采用的是基于寄存器的满足RISC(精简指令集)架构以及load/store模式,也就是说只能通过将load和store 指令来进行CPU和内存间的数据交换。LLVM IR指令集拥有普通CPU一些关键的操作,屏蔽掉了一些和机器相关的一些约束。LLVM提供了足够多的寄存器来存储基本类型值,寄存器是为SSA形式(静态单态赋值),这种形式的UD链(use-define chain, 赋值代表define, 使用变量代表use)便于优化。LLVM指令集仅包含31条操作码。LLVM中的内存地址没有使用SSA形式,因为内存地址有可能会存在别名或指针指向,这样就很难构造出来一个紧凑可靠的SSA表示。在LLVM中一个function就是一组基本块的组合,一个基本块就是一组连续执行的指令并以中止指令结束(包括branch, return, unwind, 或者invoke等),中止指令指明了欲跳转的目的地址。

LLVM IR类型系统

LLVM的类型系统为语言无关。每一个SSA寄存器或者显示的内存对象都有其对应的类型。这些类
型和操作码一起表明这个操作的语义,这些类型信息让LLVM能够在低层次code的基础上进行一
些高层次的分析与转换,LLVM IR包含了一些语言共有的基本类型,并给他们一些预定义的大小,
从8bytes到64bytes不等,基本类型的定义保证了LLVM IR的移植性。同时LLVM又包含了四种复杂
类型,pointer,arrays, structures和functions。这四种类型足够表示现有的所有语言类型。为
了支持类型转换,LLVM提供了一个cast操作来实现类型的转换,同时为了支持地址运算,LLVM
提供了getelementptr的命令。LLVM中的许多优化都是基于地址做的(后续的总结再分析)。

LLVM IR内存模型

LLVM提供特定类型的内存分配,可以使用malloc指令在堆上分配一个或多个同一类型的内存对象,
free指令用来释放malloc分配的内存(和C语言中的内存分配类似)。另外提供了alloca指令用于
在栈上分配内存对象,该内存对象在通常在函数结尾会被释放。统一内存模型,所有能够取地址的
对象都必须显示分配。局部变量也要使用alloca来显示分配,没有隐式地手段来获取内存地址,这就
简化了关于内存的分析。

LLVM IR函数调用

LLVM中对普通函数调用,LLVM提供了call指令来调用附带类型信息的函数指针。这种抽象屏蔽了
机器相关的调用惯例。还有一个不能忽略的就是异常处理,在LLVM中,LLVM提供了invoke和
unwind指令。invoke指令指定在栈展开的过程中必须要执行的代码,例如栈展开的时候需要析构
局部对象等。而unwind指令用于抛出异常并执行栈展开的操作。栈展开的过程会被invoke指令停
下来,执行catch块中的行为或者执行在跳出当前活动记录之前需的操作。执行完成后继续代码执
行或者继续栈展开操作。注意像C++的RTTI(运行时类型识别)则由C++自己的库处理,LLVM并不负责。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LLVM学习(1) 的相关文章

  • vmware 10.03不能设定共享文件夹的解决办法

    问题 背景 win7 64下安装的VMware WorkStation 10 02 里面安装了虚拟机OpenSUSE 13 1 在设定共享目录前处于 挂起 状态 目标 为虚拟机OpenSUSE 13 1设定一个共享目录 让OpenSUSE可
  • 彻底删除VMware虚拟机

    您是否和我一样被VMware气到了呢 您是否再也不想理VMware了呢 您是否不想再在自己电脑上看到VMware这几个英文字母了呢 来吧 跟着我的步骤 一起和VMware说拜拜吧 一 在卸载VMware虚拟机之前 要先把与VMware相关的
  • vaware上安装Linux详细步骤(Slackware10.2)

    环境 HostOS Win2K SP4 GuestOS Slackware10 2 VMware Workstation 5 5 1 b19175 1 建立虚拟机 在VMware上新建一个2 4 x内核的Linux虚拟机 因为Slackwa
  • ESXi6.5中将虚拟机从厚置备转换为精简置备

    用ESXi做虚拟化 创建了一个原始虚拟机并安装好系统做好基本设置 使用ESXi的web界面复制虚拟机 结果后来发现复制出来的都是厚置备 导致占用大量空间 网上找到一篇教程 但不够清晰 遂有此文 首先要通过ssh连接虚拟机 0 删除需要转换磁
  • VM ware14在win10系统出现虚拟机繁忙/无法正常启动、关闭虚拟机

    VM版本 VM warestation14 windows版本 Windows10 Linux版本 CentOS 7 出现的一些问题 1 无法正常关闭虚拟机 关机界面最后的单词显示为 halting 并一直呈该状态 2 强制关闭虚拟机电源后
  • 为你的VMware 15.5 虚拟机MacOS系统手动安装VMware Tools

    本博客同步发布在 为你的VMware 15 5 虚拟机MacOS系统手动安装VMware Tools VMware Tools 是VMware软件提供的一个辅助工具 可以提升虚拟机的使用体验 默认伴随虚拟机自动安装 但有时候自动安装会出错
  • qemu-guest-agent windows下的监控开发

    windows下的qemu guest agent 简称qga 的名字叫做qemu guest agent win32 目前最新版的版本号是qemu guest agent win32 0 12 1 2 2 355 el6 4 9 x86
  • 《银河麒麟高级服务器操作系统V10》使用

    一言而论 讲了麒麟服务器V10的基本使用 包括终端 VNC 文章目录 前言 基本架构 环境 硬件环境 软件环境 麒麟安装步骤 1 在宿主机上安装好VM 并且激活 2 使用VM创建虚拟机 3 启动虚拟机 终端常用点 VNC的使用 麒麟上安装V
  • 一般游戏的反外挂保护方案

    所谓知己知彼方能百战不殆 要想减少或避免外挂对游戏的侵害 必须从根本上知晓外挂的原理 及其常用的技术手段 从而在技术手段上对其进行封堵 一 外挂的分类 外挂一般的分为2类 脱机式 和 内挂式 脱机式外挂的定义 完全脱离官方发布的客户端程序
  • 半虚拟化和全虚拟化的区别

    全虚拟化 Full virtualization 也称为原始虚拟化技术 是另一种虚拟化方法 该模型使用虚拟机协调客户 操作系统和原始硬件 见图2 这里 协调 是一个关键词 因为VMM在客户操作系统和裸硬件之间用于工作协调 一些受保护的指令必
  • VMware16安装虚拟机遇到的问题

    摘要 前面提到自己安装环境为CPU Intel Core i5 12600K VMware 版本 VMware Workstation 16 Pro 16 0 0 build 16894299 创建虚拟机的时候windwos 系列的win7
  • ubuntu9.10 虚拟机连接windows网络上网,以及NFS挂载网络设置。

    1 虚拟机设置 2 关掉网卡 sudo ifconfig ethxx down 3 打开网卡 sudo ifconfig ethxx up 4 打开浏览器就可以使用网络上网了 NFS 1 vmware软件设置网络连接方式 2 选择桥接方式
  • 虚拟机上的Ubuntu开机显示“无法应用原保存的显示器配置”

    如图 解决方法 删除monitors xml 文件 rm config monitors xml
  • 网站虚拟主机是什么?(什么是虚拟主机空间)

    刚入行的新手用户肯定会接触一个叫虚拟主机的空间 特别是建站行业和个人用户使用的很多 不过很多新手用户对虚拟主机空间还是理解的不太明白 下面我们就来聊聊什么是网站虚拟主机空间 什么是虚拟主机 虚拟主机又称虚拟空间 网站空间 它是由单台物理服务
  • 使用libvirt管理KVM虚拟机

    使用libvirt管理KVM虚拟机 一 安装虚拟化管理工具 1 yum install virt manager libvirt libvirt python python virtinst 1 kmod kvm kvm kernel mo
  • virtual box之前创建的虚拟机,打开黑屏的解决办法

    virtual box之前创建的虚拟机 打开后黑屏的解决办法 我第一次使用virtual box打开创建的虚拟机时显示黑屏 是因为分配的显存不够造成的 最后自己的解决方案如下 选中对应的虚拟机 然后在右侧详情页中点击 设置 按钮 在弹出的设
  • ovirt节点添加windows虚拟机

    1 新建windows7虚拟机 设置Windows7镜像引导 2 启动起来后换盘安装驱动 换的是驱动盘 3 驱动安装成功后分区 再把系统盘换回来 开始装系统 4 等待装系统即可
  • centos8安装postgresql步骤

    1 安装源 1 sudo yum y install epel release 2 postgresql官网发布的postgresql对应的安装源 sudo yum install y https download postgresql o
  • VirtualBox虚拟机网络连接设置的四种方式

    VirtualBox是一款SUN出品的非常优秀的虚拟机程序 版本也非常齐全 你可以在官网上找到适合各种操作系统平台的版本 这里我先给大家大致讲解下VBox的网络配置及应用 VirtualBox的提供了四种网络接入模式 它们分别是 1 NAT
  • LAB1实验

    Part 1 遇到问题1 我将JOS放在Windows的目录下 通过VMware设置共享该文件夹来编译JOS 但是Windows更改linux下设置的权限 导致GDB无法调试QEMU 解决方法 将JOS放在虚拟机下的linux的目录下 20

随机推荐

  • [网络安全提高篇] 一〇二.Metasploit技术之基础用法万字详解及防御机理

    当您阅读到该篇文章时 作者已经将 网络安全自学篇 设置成了收费专栏 首先说声抱歉 感谢这一年来大家的阅读和陪伴 这100篇安全文章记录了自己从菜鸡到菜鸟的成长史 该部分知识也花了很多精力去学习和总结 希望您能进步 一起加油喔 接下来我会接着
  • C++之sort()排序

    文章目录 一 头文件 二 使用sort 1 函数原型 2 简单地使用sort 1 默认排序 2 两种常用的排序方法 3 自定义使用sort 一 头文件 include
  • 关于电源管理和DCDC的使用的一个小坑

    这两天在使用电源管理IC 后面加一颗DCDC 在使用USB升级时 升级过程 在写FLASH时 出现升级失败的情况 是部分机器有 部分机器没有 于是让软件Debug一下 发现在写外部FLASH时出现死机情况 原因似乎是不清楚 后面我们尝试测量
  • JavaScript 经典「红宝书」,几代前端人的入门选择

    文末有活动 人的一生中总要读几本经典书 在这个 经典 泛滥的年代 什么才是权威的代表 我想大概是一本的书的口碑 能积累下上佳口碑的书 往往也是能经得住时间推敲的 比如这本 我相信所有前端开发者的案头都有这样一本书 这本书最早的版本第 2 版
  • 【数字调制】数字调制技术FSK与PSK分析与研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 上世纪 50 年代末 出现了 FSK 与二
  • 百度地图api获取位置信息,返回码为162,无法获取地址的问题【已解决】

    调用百度地图api返回码为162 无法获取地址的问题 已解决 下载百度地图提供的sdk代码包解压后将libs里面的文件全部复制到android 项目libs文件夹中 总之就是按照百度地图开发文档的介绍配置好环境 导包后要配置依赖 其实很简单
  • Qt - 高级网络操作 HTTP/FTP

    欢迎转载 请注明出处 https blog csdn net qq 39453936 spm 1010 2135 3001 5343 原文链接 https blog csdn net qq 39453936 article details
  • react 实现一个简单的excel表格(可以改变宽度、实时输入、select *ui自行优化,思路可以参考)

    首先看效果 1 首先就是主要代码 index tsx import FC useEffect useRef useState from react import columns columnsType from config import
  • 【实验必用】使用ResNet18作为主干网络进行深度学习的Pytorch实现

    使用ResNet18作为主干网络进行深度学习的Python实现 一 ResNet18的Python复现 二 获取ResNet18的预训练模型 三 加载ResNet18预训练模型参数并设计自己的模型 一 ResNet18的Python复现 下
  • 当AD(Altium Designer)画PCB时Ctrl+H快捷键无法选中连线时的解决办法

    1 ctrl A先框选全部已画好的PCB 呈白色选中状态 2 注意你要选的是TopLayer还是BottomLayer ctrl H 选中一根连线即可 解决 ctrl H键恢复正常
  • 【Jmeter】基础介绍-详细

    最近做压测时使用到Jmeter 为什么用它 之前也做过部分压测 不是很系统 使用的是Apache Bench 虽然效率高 但是功能比较简单 不太适合本次压测场景 另外Jmeter能更好的利用压测机的多核性能 ab使用单核 如果需要使用多核需
  • 微信小程序:wx:for循环输出的使用方法以及简单例子

    今天来讲解下循环输出元素 后台存储的数据给事 var local database date Sep 18 2016 post title 冬日校花 post image images 1 jpg text 美呀 美呀 view num 1
  • 字节序说明并用C语言实现转换

    反转字节序之大小端转换 什么是大端和小段 举个例子 比如int类型的数 0x12345678在内存中的表现形式 1 大端模式 Big Endian就是高位字节排放在内存的低地址端 低位字节排放在内存的高地址端 低地址 gt 高地址 0x12
  • MYSQL数据库(八)数据库备份和恢复

    成功不易 加倍努力 5 备份和恢复 5 1 备份恢复概述 5 1 1 为什么要备份 5 1 2 备份类型 5 1 3 备份什么 5 1 4 备份注意要点 5 1 5 还原要点 5 1 6 备份工具 5 1 6 基于 LVM 的快照备份 5
  • 如何解决Conda Python版本冲突错误

    如何解决Conda Python版本冲突错误 环境 错误描述 解决方案 环境 WIN10 64bit Miniconda3 4 12 0 Python in Conda 3 9 12 错误描述 安装完Conda后 从开始菜单打 Anacon
  • Mysql基础1-介绍、安装

    1 初识Mysql 1 1 路线体系 业务级别mysql 运维级别mysql JavaEE 企业级开发 Web 前端 展示数据 后台 连接点 连接数据库JDBC 链接前端 控制 控制视图跳转给前端传递数据 数据库 存数据 TXT execl
  • element-ui踩坑

    element ui踩坑 1 使用websocket给前端vuex中传值并将vuex中的值实时渲染到页面表格 在element ui中提供的表格样式中 默认以 data tableData 的形式传入表格数据 其中tableData在vue
  • 标记-压缩算法

    版权声明 本文为博主原创文章 未经博主允许不得转载 https blog csdn net njys1 article details 53725240 GC标记压缩算法由标记阶段和压缩阶段组成 标记阶段和标记 清除算法的完全一致 接下来
  • VTK入门000——新建VTK项目

    选择Qt Widgets Application 设置项目名称和项目位置 并勾选 将解决方案和项目放在同一目录中 点击创建 视图 gt 其他窗口 gt 属性管理器 右键Debug 点击属性 添加附加包含项 C VTK vtk v9 1 0
  • LLVM学习(1)

    转自 https github com XChainLab documentation blob master VM EOS EOSVMArch md LLVM项目是一系列分模块 可重用的编译工具链 它提供了一种代码良好的中间表示 IR L