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,一经查实,立即删除!

相关文章

计算机软件考试试题——附答案

计算机软件考试试题 选择题 在面向对象编程中,继承的主要作用是: A. 提高代码的可读性B. 隐藏对象的实现细节C. 实现多重继承D. 复用已有代码 数据库中,以下哪个操作用于删除表中的所有数据,但保留表的结构? A. DELET…

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 的优势。安装过程跳过。…

CSS Grid 和 Flexbox

1.使用示例 CSS Grid: CSS Grid 是一种二维网格布局系统,可以用于创建复杂的网格布局。它允许你将元素放置到网格的行和列上,并通过设置网格属性来控制元素的位置和大小。 创建一个简单的 CSS Grid 布局,可以按照以下步骤进行&a…

Numpy基础

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

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

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

python数据分析之交叉验证

python数据分析之交叉验证 1、常用的分类算法 有监督:SVM向量机、梯度提升、决策树(随机森林)、朴素贝叶斯、逻辑斯蒂回归、神经网络(cnn、rnn) 无监督:k-means、隐马尔可夫 2、数据分析过程 1、采集数据 2、数据预处理 3、特征选择 4、模型训练、评估、保存 5、模型…

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.1:Java 获取两个时间的时间差(时、分、秒):依赖:方法的说明方法测试 2.1 获取当天的开始时间2.2 获取当天的结束时间2.3 获取昨天的开始时间2.4 获取昨天的结束时间2.5 获取明天的开始时间2.6 获取明天的结束时间2.7 获取本周的开…

第3章 【课后习题】(完整版)

【3.18】写出下面程序的运行结果 //3.18写出下面程序的运行结果 #include <iostream> using namespace std; class test{public:test();~test() {};private:int i; }; test::test() {i25;for(int ctr0;ctr<10;ctr){cout<<"Counting at "<<ctr…

深入浅出:理解 JavaScript 中的 Promise.all()

在现代的 JavaScript 开发中&#xff0c;异步编程是一个无法避免的话题。无论是处理网络请求&#xff0c;用户输入&#xff0c;还是文件操作&#xff0c;异步编程都扮演着核心角色。ES6 引入的 Promise 极大地简化了异步操作&#xff0c;而 Promise.all() 则为处理多个并行的异…

线程的深入学习(二)

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

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

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

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

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

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

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

嵌入式(一)嵌入式系统介绍 | 嵌入式微处理器,嵌入式系统开发流程,嵌入式系统应用

文章目录 1 嵌入式系统基本介绍1.1 基本概念1.2 嵌入式微处理器分类1.2.1 微控制器MCU1.2.2 微处理器MPU1.2.3 数字信号处理器&#xff08;DSP&#xff09;1.2.4 混合处理器和片上系统&#xff08;SOC&#xff09;1.2.5 可编程片上系统&#xff08;SOPC&#xff09; 1.3 嵌入式…

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

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

7-34 通讯录的录入与显示 分数 10

文章目录 每日一言题目输入格式&#xff1a;输出格式&#xff1a;输入样例&#xff1a;输出样例&#xff1a; 结语 每日一言 批判的武器当然不能代替武器的批判。 --〈黑格尔法哲学批判〉导言 题目 通讯录中的一条记录包含下述基本信息&#xff1a;朋友的姓名、出生日期、性别…

C++ const 限定符的全面介绍

C const 限定符的全面介绍 1. const 修饰基本数据类型 定义 const 修饰的基本数据类型变量&#xff0c;值不可改变。 语法 const type variable value;特点 不可变性&#xff0c;增加代码可读性。 作用 定义不可修改的常量。 使用场景 全局常量、配置项。 注意事项…

常见函数的4种类型(js的问题)

• 匿名函数 • 回调函数 • 递归函数 • 构造函数 1、匿名函数 定义时候没有任何变量引用的函数 匿名函数自调&#xff1a;函数只执行一次 (function(a, b){console.log(a b);} )(1, 2);// 等价于 function foo (a, b){console.log(a b); }foo(1, …