首页 > 其他分享 >LLVM基础知识

LLVM基础知识

时间:2022-09-22 01:11:24浏览次数:97  
标签:LLVM IR 编译器 基础知识 机器码 编译 JIT

LLVM简介 https://zhuanlan.zhihu.com/p/488188552

前端:前端讲计算机程序语言(如C、C++和OC)转换为LLVM IR的编译步骤。它包括词法分析器、语法分析器、语义分析器和LLVM IR代码生成器。Clang项目提供了一个插件接口和一个单独的静态分析工具用于进行深度分析。
IR:LLVM IR既有用户可读的表示形式,也有二进制编码的表示形式。相应的工具和库提供了IR构建、组装和拆卸的接口。LLVM优化器还可以处理IR,以应用大多数优化。
后端:这是负责生成代码的步骤。后端讲LLVM IR转换为特定目标的汇编代码或目标代码二进制文件。寄存器分配、循环转换、窥视孔优化器以及特定于目标的优化转换属于后端。

LLVM基本概念入门 https://zhuanlan.zhihu.com/p/140462815

gcc的编译器,输入是源代码,输出是汇编代码,相当于是LLVM中Clang一级加上IR linker再加上LLVM compiler中的生成汇编代码部分(Clang输出可执行文件的一条龙过程,不会生成汇编文件,内部全部走中间表示,生成汇编码和生成目标文件是并列的)。
gcc的汇编器,输入是汇编代码,输出是目标文件,相当于是LLVM中的llvm-mc(这是另一个工具,Clang一条龙默认不走这个工具,但会调用相同的库来做汇编指令的下降和发射)。
gcc的链接器,输入是目标文件,输出是最终可执行文件,相当于LLVM中的Linker,现在LLVM Linker还在开发中(已释出,叫lld,但仍然不成熟),所以Clang驱动程序调起来的链接器还是系统链接器,可以选择使用gcc的ld(这块会很快变,LLVM社区必然会在lld成熟后默认换上去,大家可以自行验证)。

clang,是现在LLVM项目中一个很重要的前端工具。clang能够调用起来整个编译器的流程,也就是上边其他工具调用的库,它很多都同样会调用。clang通过指定-emit-llvm参数,可以配合-S或-c生成.ll或.bc文件,这样我们就能把clang的部分和LLVM的后端分离开来独立运行,对于观察编译器流程来说,很实用。

clang -emit-llvm -c main.c -o main.bc
clang -emit-llvm -S main.c -o main.ll

LLVM IR简介 https://zhuanlan.zhihu.com/p/200613850

LLVM IR(Intermediate Representation,中间表示)连接着编译器前端和编译器后端。IR的设计很大程度体现着LLVM插件化、模块化的设计哲学,LLVM的各种pass其实都是作用在LLVM IR上的。同时IR也是一个编译器组件接口。通常情况下,设计一门新的编程语言只需要完成能够生成LLVM IR的编译器前端即可,然后就可以轻松使用LLVM的各种编译优化、JIT支持、目标代码生成等功能。

内存中的IR模型
内存中IR模型其实就是对应LLVM实现中的OO模型,更直白的就是一些cpp的class定义。
Module类,Module可以理解为一个完整的编译单元。一般来说,这个编译单元就是一个源码文件,如一个后缀为cpp的源文件。
Function类,这个类顾名思义就是对应于一个函数单元。Function可以描述两种情况,分别是函数定义和函数声明。
BasicBlock类,这个类表示一个基本代码块,“基本代码块”就是一段没有控制流逻辑的基本流程,相当于程序流程图中的基本过程(矩形表示)。
Instruction类,指令类就是LLVM中定义的基本操作,比如加减乘除这种算数指令、函数调用指令、跳转指令、返回指令等等。

LLVM IR入门指南 https://www.zhihu.com/column/c_1267851596689457152

LLVM IR入门指南(1)——LLVM架构简介
LLVM IR入门指南(2)——Hello world
LLVM IR入门指南(3)——数据表示
LLVM IR入门指南(4)——类型系统
LLVM IR入门指南(5)——控制语句
LLVM IR入门指南(6)——函数
LLVM IR入门指南(7)——异常处理

LLVM中的JIT https://zhuanlan.zhihu.com/p/60936932

JIT(just-in-time)即时编译技术是在运行时(runtime)将调用的函数或程序段编译成机器码载入内存,以加快程序的执行。所以,JIT是一种提高程序时间和空间有效性的方法。 程序运行时编译和执行的概念最早出自John McCarthy在1960年发表的论文《Recursive functions of symbolic expressions and their computation by machine》,James Gosling在1993年在关于Java的论文中使用了”JIT”这个术语。JIT可以分为两个阶段:在运行时生成机器码和在运行时执行机器码。其中,第一个阶段的生成机器码方式与静态编译并无本质不同,只不过生成的机器码被保存在内存中,而静态编译是在程序运行前将整个程序完全编译为机器码保存在二进制文件中。运行时 JIT 缓存编译后的机器码,当再次遇到该函数时,则直接从缓存中执行已编译好的机器。因此,从理论上来说,JIT编译技术的性能会越来越接近静态编译技术。

标签:LLVM,IR,编译器,基础知识,机器码,编译,JIT
From: https://www.cnblogs.com/gnivor/p/16717780.html

相关文章

  • 第二章:PyTorch基础知识
    1、张量(tensor)张量我们可以理解为三维及以上的数据。2、使用PyTorch创建张量通过torch.rand()的方法,构造一个随机初始化的矩阵:importtorchx=torch.rand(4,3......
  • 计算机基础知识
    一.计算机本质计算机的本质:就是模拟人脑思维的电路,又称为通电的大脑。计算机的存储本质:计算机是基于电工作,电信号分为高低电平两种状态(0和1),所以计算机其实只认识0和......
  • Java基础知识,JDK8下载安装环境配置
    Java基础知识Java的三种版本JavaSE:标准版,主要用于开发桌面程序,控制台开发等等JavaME:嵌入式开发,主要用于开发手机,小家电等等,目前使用的比较少JavaEE:企业级开发,主......
  • c#基础知识之自定义事件
    自定义事件为了让大家多了解一下关于c#的用法,我开始给大家讲解一下关于c#的一些重要用法,想学的大家也常来参与一下,只要技术够硬,赚钱多多,财富多多,幸福多多,只要想学都都可以......
  • 前端基础知识-css(一)个人学习记录
    待补充flex及其属性https://blog.csdn.net/weixin_44706267/article/details/121291934css3新特性sass和lesshttps://www.cnblogs.com/dasusu/p/10114097.html......
  • Docker基础知识 (12) - 使用 Docker-compose 部署 Nginx + Php/Laravel + MariaDB 项
    Laravel是一套简洁、优雅的PHPWeb开发框架(PHPWebFramework)。Laravel:https://laravel.com/LaravelGitHub:https://github.com/laravel1.部署环境   IP......
  • python-接口自动化测试-基础知识(一)
    Python接口自动化测试理论知识以及框架源码一、什么是接口测试、为什么要做接口测试1、什么是接口测试接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测......
  • IP地址基础知识
    一、IP地址相关概念在TCP/IP网络通信时,为了保证能正常通信,每个设备都需要配置正确的IP地址,否则无法实现正常的通信。IP地址(IPv4地址)由32位正整数来表示,IP地址在......
  • IP基础知识
    IP在TCP/IP参考模型中处于第三层,也就是网络层。网络层的主要作用是:实现主机与主机之间的通信,也叫点对点(endtoend)通信。IP(网络层)和MAC(数据链路层)之间的区别和关系:......
  • Linux基础知识
     虚拟网卡VM1-3网卡对应三种模式:1、仅主机虚拟机和物理机在一个封闭的内网网段中,不可以上网(常用vm1)物理机和虚拟机互通只需要同一网段2、桥接:虚拟机直接用的主机网卡......