LLVM(简介)

历史

LLVM(low level virtual machine)起源于伊利诺伊大学的一个编译器实验项目,目前已经发展成一个集编译器和工具链为一体的商业开源项目,因此其英文名称的含义被扩大,不再仅仅是字面意思。其创始人为 Chris Lattner。LLVM项目遵循的开源许可协议是 Apache 2.0License。LLVM 从2003 年10月24 日发布第一个开源版本 LLVM1.0 以来,截止2020 年第一个季度,已经发布到LLVM10.0.0 版本,十几年间开发者社区也在不断壮大,从 2007 年起至今,每年都会举办 1-2 次 LLVM 开发者大会,在大会上有很多优秀的开发者们分享他们对于LLVM项目的一些技术问题研究。2012年LLVM获得了2012ACM软件系统奖。

最开始LLVM在项目初期,定向研究终身程序优化,后来随着项目成熟,维护编译器IP在磁盘上表示的设计成决策仍然是为了实现连接时优化,而较少关注终身优程序优化的原始想法。

最后,LLVM核心库通过放弃低级虚拟机(Low Level Virutal Machine)这个名称,正式表明成为一个平台不感兴趣,而仅仅由于历史原因,所以用LLVM这个名字,而要成为强大和实用的C/C++编译器,而不是java的竞争对手

LLVM是个啥?

经典的编译器如gcc在设计上都是提供一条龙服务的: 你不需要知道它使用的IR是什么样的,它也不会暴露中间接口来给你操作它的IR。 换句话说,从前端到后端,这些编译器的大量代码都是强耦合的

编译原理主要过程分为两个:

  • 前端把源代码翻译成中间代码IR
  • 后端把IP翻译成机器码,或者给解释器执行

LLVM的核心设计是LLVM IR
它使用的静态单赋值形式(SSA)两个重要特征:

  • 代码被组织为三地址指令
  • 它有数目不受限制的寄存器

同时作为编译器IR,用于指导核心库开发的两个LLVM IR的基本原则:

  • SAA表示和允许快速优化的无限寄存器
  • 通过将整个程序存储在磁盘IR表示中以实现更便捷的链接时优化

LLVM采用了功能划分更为明确的模块化设计。LLVM将优化的部分单独提取出来,不再将编译器的优化功能与前端或者后端的功能代码耦合在一起!
LLVM进行代码混淆保护,实际上需要改造的是优化器部分,通过编写用于代码混淆的定制的Pass来完成混淆处理,不需要对后端的Pass进行改造
在这里插入图片描述

LLVM Pass

Pass就是“遍历一遍IR,可以同时对它做一些操作”的意思
LLVM Pass分为两种类型:

  • 分析Pass:用于获取LLVM IR中的信息,例如函数的调用关系、变量的使用情况等。
  • 转换Pass:用于对LLVM IR进行修改,例如优化代码、插入代码等。

LLVM Pass可以用于各种目的,例如:

  • 代码优化:LLVM Pass可以用于提高代码的性能、减少代码的大小等。
  • 代码分析:LLVM Pass可以用于获取代码的信息,例如代码的调用关系、变量的使用情况等。
  • 代码插桩:LLVM Pass可以用于在代码中插入新的代码,例如用于调试或分析。

LLVM Pass是LLVM编译器的核心组件,是LLVM编译器的灵活性和可扩展性的基础。

以下是一些常见的LLVM Pass:

  • 死代码删除(Dead Code Elimination):删除不执行的代码。
  • 常量折叠(Constant Folding):将常量表达式折叠为常量值。
  • 寄存器分配(Register Allocation):将变量分配到寄存器中。
  • 指令重排序(Instruction Scheduling):重新安排指令的顺序,以提高性能。

用户可以根据自己的需要来编写或使用LLVM Pass。LLVM提供了丰富的API和文档,可以帮助用户快速入门。

LLVM的核心是一个库,而不是一个具体的二进制程序。 不过,LLVM这个项目本身也基于这个库实现了周边的工具, 下面列出了几个重要的命令行工具,光看名字就可以知道它们大概在做什么

  • llvm-as:把LLVM IR从人类能看懂的文本格式汇编成二进制格式。注意:此处得到的不是目标平台的机器码。
  • llvm-dis:llvm-as的逆过程,即反汇编。 不过这里的反汇编的对象是LLVM IR的二进制格式,而不是机器码。
  • opt:优化LLVM IR。输出新的LLVM IR。
  • llc:把LLVM IR编译成汇编码。需要用as进一步得到机器码。
  • lli:解释执行LLVM IR。

源代码

  1. 根目录下,最重要的就是include和lib这两个文件夹。include文件夹包含了其它项目在使用LLVM核心库时需要包含的头文件,而lib文件夹里放的就是LLVM核心库的实现。分别打开lib和include,可以看到很多文件与子文件夹。有经验的读者应该能从名字大概猜到其实现的东西。比如,lib/IR子文件夹肯定是存放了与IR相关的代码,lib/Target子文件夹肯定与生成目标平台机器码有关。又比如,include/llvm/Pass.h文件里面声明了Pass类用来给你继承去遍历、修改LLVM IR。 当然,我们现在不必知道每个模块是干什么的。 等有需要再去查看官方文档吧。
  2. 根目录下还有一个tools文件夹,这里面就存放了我上面所说的周边工具。 打开这个目录,就可以看到类似llvm-as这样的子目录。显然这就是llvm-as的实现。
    在这里插入图片描述
    在这里插入图片描述

Clang

Clang 是 LLVM 编译器工具集的前端,支持 C、C++、Objective-C 和 Objective-C++ 等编程语言。它采用了 LLVM 作为其后端,由 LLVM2.6 开始,一起发布新版本。

Clang 的目标是提供一个 GNU 编译器套装的替代品,支持了 GNU 编译器大多数的编译设置以及非官方语言的扩展。

Clang 的主要功能包括:

  • 语法分析:Clang 可以分析 C、C++、Objective-C 和 Objective-C++ 等编程语言的语法。
  • 代码生成:Clang 可以生成 LLVM 中间代码(IR)。
  • 代码优化:Clang 可以对 LLVM IR 进行优化,以提高代码的性能和可移植性。
  • 代码分析:Clang 可以对 LLVM IR 进行分析,以获取代码的信息,例如代码的调用关系、变量的使用情况等。

Clang 在许多操作系统和平台上都有可用版本,包括 macOS、Linux、Windows、iOS 和 Android。

Clang 是一个开源项目,由 LLVM 开发小组维护。

以下是 Clang 的一些优势:

  • 速度快:Clang 的编译速度比 GCC 快。
  • 体积小:Clang 的代码体积比 GCC 小。
  • 可扩展性强:Clang 支持插件式架构,可以通过编写插件来扩展 Clang 的功能。

Clang 是一个功能强大、高效的编译器,可以用于各种目的。

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

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

相关文章

Go语言命令行参数及cobra使用教程

Go语言命令行参数及cobra使用教程 1.原生命令行参数2.使用CIL框架Cobra创建 rootCmd创建你的 main.go创建其他命令子命令返回和处理错误 3.cobra使用标志4.Cobra位置参数和自定义参数5.Cobra PreRun和PostRun钩子 1.原生命令行参数 os 包以跨平台的方式,提供了一些…

Spring Boot 整合 MinIO自建对象存储服务

GitHub 地址:GitHub - minio/minio: The Object Store for AI Data Infrastructure 另外,MinIO 可以用来作为云原生应用的主要存储服务,因为云原生应用往往需要更高的吞吐量和更低的延迟,而这些都是 MinIO 的优势。安装过程跳过。…

Numpy基础

目录: 一、简介:二、array数组ndarray:1.array( )创建数组:2.数组赋值和引用的区别:3.arange( )创建区间数组:4.linspace( )创建等差数列:5.logspace( )创建等比数列:6.zeros( )创建全0数组&…

半导体设备系列:半导体制造产能扩张,设备零部件需求旺盛

近年来国内半导体制造产能不断扩张,半导体设备厂商加速成长。我们认为下游发展将拉动上游本地化配套需求,半导体设备零部件迎来高增长阶段。 摘要 半导体设备零部件包含密封圈、EFEM、射频电源、静电吸盘、硅电极、真空泵、气体流量计、喷淋头等产品&a…

JVM虚拟机:各种JVM报错总结

错误 java.lang.StackOverflowError java.lang.OutOfMemoryError:java heap space java.lang.OutOfMemoryError:GC overhead limit exceeded java.lang.OutOfMemoryError:Direct buffer memory java.lang.OutOfMemoryError:unable to create new native thread java.lang.OutOf…

线程的深入学习(二)

前言 上一篇讲了线程池的相关知识,这篇文章主要讲解一个 1.并发工具类如CountDownLatch、CyclicBarrier等。 2.线程安全和并发集合: 3.学习如何使用Java提供的线程安全的集合类,如ConcurrentHashMap、CopyOnWriteArrayList等。 并发工具类 …

Linux学习记录——삼십삼 http协议

文章目录 1、URL2、http协议的宏观构成3、详细理解http协议1、http请求2、http响应1、有效载荷格式2、有效载荷长度3、客户端要访问的资源类型4、修改响应写法5、处理不同的请求6、跳转 3、请求方法(GET/POST)4、HTTP状态码(实现3和4开头的&a…

uniapp中用户登录数据的存储方法探究

Hello大家好!我是咕噜铁蛋!作为一个博主,我们经常需要在应用程序中实现用户登录功能,并且需要将用户的登录数据进行存储,以便在多次使用应用程序时能够方便地获取用户信息。铁蛋通过科技手段帮大家收集整理了些知识&am…

每天五分钟计算机视觉:揭秘迁移学习

本文重点 随着人工智能的迅速发展,深度学习已经成为了许多领域的关键技术。然而,深度学习模型的训练需要大量的标注数据,这在很多情况下是不现实的。迁移学习作为一种有效的方法,可以在已有的数据和模型上进行训练,然后将其应用于新的任务。这种方法大大降低了对新任务的…

书香之家 国学启智——学夫堂幼儿国学托管永嘉上塘实验店启航

在教育创新的道路上,学夫堂幼儿国学托管永嘉上塘实验店迎来了一个重要的时刻。经过三个多月的精心筹备和试运营,今天正式宣布学夫堂幼儿国学托管在永嘉县城北街道景和佳苑8幢105号开门迎客。 学夫堂深信,国学智慧不仅是中华文化的瑰宝&#x…

阿赵UE学习笔记——7、导入资源

阿赵UE学习笔记目录 大家好,我是阿赵。   继续学习虚幻引擎的使用。这次将会把一个带动作和贴图的钢铁侠模型,导入的UE的项目中。 1、准备的资源 这里有2个fbx文件,都是带着网格和动画的,模型网格和骨骼是一样的,只…

MySQL是如何做到可以恢复到半个月内任意一秒的状态的?

MySQL的逻辑架构图 MySQL中两个重要的日志模块:redo log(重做日志)和binlog(归档日志) 我们先来看redo log: 介绍一个MySQL里经常说到的WAL技术,即Write-Ahead-Logging,它的关键点…

Linux基础知识点(五-信号)

一、信号的基本概念 1.1 信号的概念 信号(signal),又称为软中断信号,用于通知进程发生了异步事件,它是Linux系统响应某些条件而产生的一个事件,它是在软件层次上对中断机制的一种模拟,是一种异…

burpsuite模块介绍之extender(扩展)

extender Burp提供了对第三方拓展插件的支持,使用户能够编写自定义插件或从插件商店中安装拓展插件。这些Burp扩展程序可以以多种方式定制Burp的行为,包括修改HTTP请求和响应、自定义UI、添加自定义扫描程序检查以及访问关键的运行时信息,如代理历史记录、目标站点地图和扫…

Spring高手之路-Spring中Bean的五大作用域

目录 Singleton(单例):默认的作用域 Prototype(原型) Request(请求) Session(会话) Global Session(全局会话) 五大作用域范围对比 作用域…

【算法每日一练]-dfs bfs(保姆级教程 篇8 )#01迷宫 #血色先锋队 #求先序排列 #取数游戏 #数的划分

目录 今日知识点: 使用并查集映射点,构造迷宫的连通块 vis计时数组要同步当回合的处理 递归求先序排列 基于不相邻的取数问题:dfs回溯 n个相同球放入k个相同盒子:dfs的优化分支暴力 01迷宫 血色先锋队 求先序排列 取数游…

Javaweb之Mybatis的基础操作的详细解析

1. Mybatis基础操作 学习完mybatis入门后,我们继续学习mybatis基础操作。 1.1 需求 需求说明 通过分析以上的页面原型和需求,我们确定了功能列表: 查询 根据主键ID查询 条件查询 新增 更新 删除 根据主键ID删除 根据主键ID批量删除 …

七:Day06_redis高级01

第一章 Redis入门 1.1 节 什么是NoSql型数据库 NoSQL ,泛指非关系型的数据库, NoSQL Not Only SQL,它可以作为关系型数据库的良好补充。NoSQL 不依赖业务逻辑方式存储,而以简单的key-value模式存储。因此大大的增加了数据库的扩展能力。 SQLNoSQL数据结构结构化非…

【K8S 资源管理】声明式资源管理

目录 一、常用的发布方式 1、蓝绿发布: 2、金丝雀发布(灰度发布): 3、滚动更新(deployment的默认更新方式): 二、声明式管理方法(yaml文件) 1、三种发布命令&#x…

数据结构第2章 栈和队列

名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 本篇笔记整理:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 0、思维导图栈和队列1、栈1)特点2&#xff0…