LLVM介绍

2023-10-31


LLVM介绍

在理解LLVM时,我们可以认为它包括了一个狭义的LLVM和一个广义的LLVM。广义的LLVM其实就是指整个LLVM编译器架构,包括了前端、后端、优化器、众多的库函数以及很多的模块;而狭义的LLVM其实就是聚焦于编译器后端功能(代码生成、代码优化、JIT等)的一系列模块和库。


一、LLVM三段式架构?

1.传统编译器的三段式:

前端(Frontend)-- 优化器(Optimizer)-- 后端(Backend)
在这里插入图片描述

2.LLVM的三段式:

前端可以使用不同的编译工具对代码文件做词法分析以形成抽象语法树AST,然后将分析好的代码转换成LLVM的中间表示IR(intermediate representation);中间部分的优化器只对中间表示IR操作,通过一系列的pass对IR做优化;后端负责将优化好的IR解释成对应平台的机器码。LLVM的优点在于,中间表示IR代码编写良好,而且不同的前端语言最终都转换成同一种的IR。
在这里插入图片描述

二、Clang与LLVM的关系

Clang是一个C++编写、基于LLVM、发布于LLVM BSD许可证下的C/C++/Objective-C/Objective-C++编译器。那么为什么已经有了GCC还要开发Clang呢?Clang相比于GCC有什么优势呢? 其实,这也是Clang当初在设计开发的时候所主要考虑的原因。Clang是一个高度模块化开发的轻量级编译器,它的编译速度快、占用内存小、非常方便进行二次开发。
在这里插入图片描述
LLVM与Clang是C/C++编译器套件。对于整个LLVM的框架来说,包含了Clang,因为Clang是LLVM的框架的一部分,是它的一个C/C++的前端。Clang使用了LLVM中的一些功能,目前知道的就是针对中间格式代码的优化,或许还有一部分生成代码的功能。从源代码角度来讲,clang是基于LLVM的一个工具。而功能的角度来说,LLVM可以认为是一个编译器的后端,而clang是一个编译器的前端。

三、LLVM 编译流程

LLVM编译一个源文件的过程:预处理 -> 词法分析 -> Token -> 语法分析 -> AST -> 代码生成 -> LLVM IR -> 优化 -> 生成汇编代码 -> Link -> 目标文件。
在这里插入图片描述

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

LLVM介绍 的相关文章

  • 使用 lambda 表达式注册类型

    我想知道如何在 UnityContainer 中实现这样的功能 container RegisterType
  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • GetType() 在 Type 实例上返回什么?

    我在一些调试过程中遇到了这段代码 private bool HasBaseType Type type out Type baseType Type originalType type GetType baseType GetBaseTyp
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • 从同一个类中的另一个构造函数调用构造函数

    我有一个带有两个构造函数的类 C 这是代码片段 public class FooBar public FooBar string s constructor 1 some functionality public FooBar int i
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回到 C#

    我有一个 c dll 它为我的主 c 应用程序提供一些功能 在这里 我尝试读取一个文件 将其加载到内存 然后返回一些信息 例如加载数据的指针和内存块的计数到 c Dll 成功将文件读取到内存 但在返回主应用程序时 程序由于堆损坏而崩溃 检测
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • Unity:通过拦截将两个接口注册为一个单例

    我有一个实现两个接口的类 我想对该类的方法应用拦截 我正在遵循中的建议Unity 将两个接口注册为一个单例 https stackoverflow com questions 1394650 unity register two inter
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • 使用 omp_set_num_threads() 将线程数设置为 2,但 omp_get_num_threads() 返回 1

    我有以下使用 OpenMP 的 C C 代码 int nProcessors omp get max threads if argv 4 NULL printf argv 4 s n argv 4 nProcessors atoi argv
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有

随机推荐

  • linux下查看文件大小:ls或du

    方法1 ls lh 参数解释 l 除文件名称外 亦将文件型态 权限 拥有者 文件大小等资讯详细列出 h human readable 与 l 一起 以易于阅读的格式输出文件大小 例如 1K 234M 2G t 文件显示以修改时间排序 最新修
  • Android 中的CreatePackageContext()

    http blog csdn net wangbole article details 22876179 java view plain copy print Return a new Context object for the give
  • Opencv4基于C++基础入门笔记:图像 颜色 事件响应 图形 视频 直方图

    效果图 opencv人脸识别效果图 请叫我真爱粉 先看一下效果图勾起你的兴趣 文章目录 一 环境配置搭建 二 图像 1 图像读取与显示 main cpp 运行结果 2 图像色彩空间转换 2 1 换色彩 test h test cpp mai
  • nginx location proxy_pass后面加不加/的区别

    以下是通过运行两个nginx测试的结果 通过查看访问日志得到 其中第一行为访问第一个nginx 172 16 78 5 时的地址 然后第一个nginx反向代理第二个nginx 172 16 30 59 分别在第一个nginx修改locati
  • Linux:shell脚本 正则表达式与AWK

    目录 一 正则表达式 1 2元字符 1 3表示次数 1 4位置锚定 1 5分组或其他 1 6扩展正则表达式 1 7grep 二 AWK awk F 编辑三 sed 1 sed简介 2 sed工作流程 3 sed命令格式 3 1打印全部内容
  • Redis学习笔记

    Redis第一天 一 NoSQL数据库介绍 NoSQL表示不仅仅是SQL 泛指非关系型数据库 NoSQL不依赖业务逻辑方式存储 而是以简单的key value模式存储 因此大大增加了数据库的扩展能力 不遵循SQL标准 不支持ACID 原子性
  • 一道创新工场面试题详解:共打了多少鱼?

    一道创新工场面试题详解 共打了多少鱼 题目 abcde五人打渔 打完睡觉 a先醒来 扔掉1条鱼 把剩下的均分成5分 拿一份走了 b再醒来 也扔掉1条 把剩下的均分成5份 拿一份走了 然后cde都按上面的方法取鱼 问他们一共打了多少条鱼 解法
  • vue中 布尔值改为字符串_父子组件间传递数据,props接收字符串,数字,数组,对象,布尔值...

    问题 vue父组件如何向子组件中传递数据 可以分为 静态传递 或者 使用 v bind动态传递 例如 给 prop 传入一个静态的值 也知道 prop 可以通过 v bind 动态赋值 例如 在上述两个示例中 我们传入的值都是字符串类型的
  • 参考

    讲道理 就很离谱 一开始我升级了 Win11 后 突然发现 移动热点 开不了了 就是那种 开了之后 手机 ipad 能检测到电脑移动热点的信号 但是会出现这两种情况 死活连不上 连上了 在移动端显示 无互联网连接 解决办法 打开 移动热点
  • C++基础入门(一)

    C 基础入门 一 0 写在前面 如果你是期末时间紧张冲刺型选手 请移步 C 期末复习超详细总结知识点 期末冲刺 如果你是时间充足型选手 请按顺序依次学习 本篇笔记视频讲解地址 https www bilibili com video BV1
  • c++桶排序(刚学也能看懂)

    目录 哈喽 穿梭门 效果 桶排序是什么 再简单点说 再再简单点说 思路 确定 分桶 个数 复杂度分析 c 代码实现 python版代码 嘿嘿 没想到吧 最后 哈喽 这次来发一下桶排序 它的时间复杂度低 代码也不难 穿梭门 二分算法 堆排序
  • 对于日访问量达到1W IP的处理方法

    转自 http www java123 net 56026 2 html 对于日访问量达到1W IP的处理方法 一 1万ip真是不高 1 常用数据用缓存 减轻数据库压力 2 详细页数据生成静态页面 二 10000算是相当小的了 不需要什么特
  • 同一台服务器上部署多个Tomcat

    同一台服务器上部署多个Tomcat 一 下载Tomcat安装包 进入Tomcat的官网 http tomcat apache org 选择要下载的Tomcat的版本 点击进入 特别说明一下要安装Tomcat9的话 JDK需要在1 8版本以上
  • 饥荒专用服务器全图显示代码,饥荒开全图代码

    用记事本打开游戏目录 data DLC0001 scripts prefabs player common lua文件 在inst AddComponent resurrectable 下一行插inst AddComponent resur
  • 一名计算机专业渣渣的2019春招求职经历—(成功收割华为、浦发、新华三、宝信软件offer)

    写在前面 不经一番彻骨寒 哪得梅花扑鼻香 不管你是谁 不管你是已经20届即将求职的雄鹰 还是19届未能成功入职的弃婴 也或是你是经历了考研失败后才意犹未尽地开始参加春招 都OK 一切都是从零开始 什么时候都不算晚 从刚开始得知自己考研失败
  • DOM 2 级事件的认识

    DOM中的事件是一个很中要的东西 它可以让用户和浏览器之间进行交互 以此来实现人机交互效果 DOM事件 DOM事件分为DOM0级事件和DOM2级事件 DOM0级其实不存在 我们把DOM最初的版本叫0级 在DOM2级的时候更新了一种新的事件绑
  • 亿级Web系统搭建——单机到分布式集群

    徐汉彬曾在阿里巴巴和腾讯从事4年多的技术研发工作 负责过日请求量过亿的Web系统升级与重构 目前在小满科技创业 从事SaaS服务技术建设 大规模流量的网站架构 从来都是慢慢 成长 而来 而这个过程中 会遇到很多问题 在不断解决问题的过程中
  • 外企程序员常用英语单词

    1 cognitive k n t v adj 认知的 认识的 2 risk r sk n 风险 危险 冒险 vt 冒 的危险 n Risk 人名 英 阿拉伯 里斯克 3 berries beriz 浆果类 4 vegetables ved
  • Mac使用经验分享 - 总览

    Mac本身支持的效率操作 各种快捷键的使用 Mac系统本身支持很多的快捷键 这些快捷键能够很大程度的提升使用效率 在此处简单列出一些我经常使用的快捷键 权作参考 W 关闭当前窗口 M 最小化当前窗口 W 关闭所有finder窗口 有一个fi
  • LLVM介绍

    文章目录 LLVM介绍 一 LLVM三段式架构 1 传统编译器的三段式 2 LLVM的三段式 二 Clang与LLVM的关系 三 LLVM 编译流程 LLVM介绍 在理解LLVM时 我们可以认为它包括了一个狭义的LLVM和一个广义的LLVM