在Rust编译器的源代码中,文件rust/compiler/rustc_mir_build/src/build/expr/as_place.rs的作用是用于处理表达式的转换为L-value的过程。L-value是指那些可接受赋值操作的表达式,如变量、数组元素或字段等。
LLVM是一套提供编译器基础设施的开源项目,是用 C++ 编写,包含一系列模块化的编译器组件和工具链,用来开发编译器前端和后端。它是为了任意一种编程语言而写成的程序,利用虚拟技术创造出编译时期、链接时期、执行时期以及“闲置时期”的优化。
llvm是当前编译器领域非常火热的项目,其设计优雅,官方文档也很全面,可惜目前缺乏官方中文翻译。笔者在学习过程中也尝试进行一些翻译记录,希望能对自己或者他人的学习有所帮助。(PS:初步翻译文档放在github上了,需要可自取,也欢迎提PR共同完善)
这篇文章对MLIR的Pattern Rewrite机制进行翻译和总结。这几篇文档分别是https://mlir.llvm.org/docs/PatternRewriter/ 和 https://mlir.llvm.org/docs/Rationale/RationaleGenericDAGRewriter/ 和 https://mlir.llvm.org/docs/Canonicalization/。下面的第一节是阅读并翻译了这三篇文档之后的要点总结,方便读者可以快速把握这三篇文档的核心内容。
在Rust的编译器源代码中,rust/compiler/rustc_codegen_cranelift/src/value_and_place.rs文件扮演着重要的角色。它包含了与值和位置(Place)相关的实现和结构体定义,这对于编译器的代码生成过程至关重要。
本文是对 https://arxiv.org/abs/2108.13191 这篇论文进行解读,学习一下如何基于MLIR编译器基础设施生成高效的GPU代码。本文的阅读的先后顺序分别为:
文件rust/compiler/rustc_passes/src/debugger_visualizer.rs是Rust编译器中的一个代码文件,它包含了与调试器可视化相关的功能。
文件rust/compiler/rustc_codegen_llvm/src/llvm/mod.rs是Rust编译器的LLVM代码生成模块的一个文件。该文件定义了一些用于与LLVM交互的结构体、枚举和常量。
最近发布的 Linux 内核带了一个针对内核的能力强大的 Linux 监控框架。它起源于历史上人们所说的的 BPF。
当你心血来潮想学习Rust这门语言时,一定会用到Rustup来安装Rust。同时你可以会疑问toolchain是啥,target又是啥,为啥学其它编程语言没有这些概念,下面我们就一一解答你的疑问。
rust/compiler/rustc_codegen_gcc/src/back/mod.rs 文件是 Rust 编译器的源代码中的一个模块,主要负责与 GCC(GNU 编译器集合)相关的后端代码生成。
llvm是当前编译器领域非常火热的项目,其设计优雅,官方文档也很全面,可惜目前官方中文翻译。笔者在学习过程中也尝试进行一些翻译记录,希望能对自己或者他人的学习有所帮助。
DOTS是Unity一个阶段性的转变,也是Unity蓝图上一个非常重要的里程碑节点。Unity的官网为它建立了主题链接,甚至打出了阶段性的口号: 重建Unity的核心!,可见Unity对DOTS的重视程度。
本章将会继续讲解ipv6地址的深入讲解,IPv6 地址的表示,压缩表示法,前缀表示法,ipv6地址类型等。
各位好。我一直在专注于开发一个称为“Pinecone”的语言,已经持续6个月的时间。
int类型通常为数字,创建int类型的方式有两种,在创建的时候两边不需要加单引号或上引号。
https://github.com/hunterzju/llvm-tutorial
早期 iOS 选用的是当时一家独大的 GCC 编译器作为 OC 语言的前端,但是随着时间的推移,Apple 为 OC 增加了很多特性,想要 GCC 给与实现,但是 GCC 却并没有支持,并且 GCC 本身代码耦合度较高,模块独立性比较差,并且《GCC运行环境豁免条款》限制了LLVM-GCC。这种背景下,Apple 就想找到一个高效、模块化的且开源的替换品,LLVM 进入了苹果的视线。
LLVM本来是伊利诺伊大学的一个研究项目,其目的是创建基于静态单一任务(SSA)的现代的、类型安全的编译方法。它拥有底层操作,具有灵活性,并且具有可以清晰地表示所有高级语言的能力。它实际上是模块化、可重用编译器和工具链技术的集合。LLVM不用对传统虚拟机做太多修改,下面列举LLVM的一些特性。
LLVM : 全称是这个Low Level Virtual Machine,底层虚拟机,名字是带有虚拟机,但是现在早已和虚拟机没有任何关系了. 是整个LLVM项目,我目前了解的有5部分.
岁月真是个养猪场,这几年,人胖了,微信代码也翻了。记得 14 年转岗来微信时,用自己笔记本编译微信工程才十来分钟。如今用公司配的 17 年款 27-inch iMac 编译要接近半小时;偶然间更新完代码,又莫名其妙需要全新编译。在这么低的编译效率下,开发心情受到严重影响。于是年初我向上头请示,优化微信编译效率,上头也同意了。
前言 岁月真是个养猪场,这几年,人胖了,微信代码也翻了。记得 14 年转岗来微信时,用自己笔记本编译微信工程才十来分钟。如今用公司配的 17 年款 27-inch iMac 编译要接近半小时;偶然间更新完代码,又莫名其妙需要全新编译。在这么低的编译效率下,开发心情受到严重影响。于是年初我向上头请示,优化微信编译效率,上头也同意了。 现有方案 在动手之前,先搜索目前已有方案,大概有这几个优化点: 一、优化工程配置 1、将 Debug Information Format 改为 DWARF Debug 时是不
上周初步完成了LLVM入门教程的翻译,这几天了解了下LLVM项目中的MLIR架构,整体感觉MLIR目的是在高层语言转换到机器码的过程中能够重用更多的优化,核心思想是采用了多层IR,并定义了IR间相互转换的框架。本系列文章将对LLVM项目中的MLIR教程进行翻译。
(可以跳过的废话) Dialect可以算是MLIR设计的灵魂所在,但是在学习MLIR过程中,众多Dialect也会带来很多困惑:某个Dialect具体作用和含义是什么?为什么要lowering到某个Dialect?虽然官方文档中有Dialect相关的文档,但是一方面文档给出的信息有限,有的文档并没有对Dialect做整体介绍(比如SCF Dialect,甚至都没介绍其全称);另一方面缺少对各个Dialect之间关系的介绍。这给深入理解Dialect带来一些困难。在翻阅MLIR讨论区的时候意外发现了一篇对Dialect的介绍:codegen-dialect-overview,觉得受益匪浅,整理分享给大家。
信息的本体是一连串的0101010101的bits,但是bits可以被解析为不同的含义,如何被解析就取决于上下文。
该论文是康奈尔大学和亚马逊工程师合作编写的,本文主要介绍开源的 Kani Rust verifier[2] 验证工具如何使用 MIR 表示的语义trait信息进行验证。该团队在调研 500 个下载次数最多的 Rust 库中发现,有 37% 使用表示动态调用的 dyn 关键字,而动态调度隐式调用达到70%(rustc编译时至少有70%包含一个vtable)。Kani 是第一个用于 Rust 的符号建模检查工具,提供了用于动态 trait 对象的开源验证方法。
我们先来看两个数据结构objc_super和objc_super2。 它们的区别在于第二个成员: objc_super:super_class // receiverClass 的父类 objc_super2:current_class // receiverClass(消息接收者的class对象)
时值618年中大促,各种活动和广告伴随着补贴和优惠铺天盖地而来。在各个平台热火朝天在补贴和价格上大做文章的时候,直播作为近些年来兴起的新渠道,同样也在大促期间动作不断,帮助各个平台打好这一次的618大战。
去年,和公司的大佬讨论了一系列关于代码的代码化,还记录了一些笔记。在那之后,我开始了各种尝试:如何将代码转变化代码。原先有一些思路,而后过了一年之后,慢慢地练习,又有了一些新的收获。
即时编译(Just-in-Time Compilation,JIT)是将某种形式的解释程序评估转换为本机程序的过程,并在运行时进行。
本文讲述如何将基于BCC的BPF应用转换为libbpf + BPF CO-RE。BPF CO-RE可以参见上一篇博文。
本文来自微信开发团队WeMobileDev公众号的原创技术分享,原题“iOS 微信编译速度优化分享”,即时通讯网收录时排版及部分文字有修订和优化。
例如上面的%6 = call noundef i32 @_Z9factoriali(i32 noundef 2)函数调用语法,如何找到call的全部使用方法?
本系列文章会展示一些系列源码到 LLVM IR 语言的转换。目标是让我们更好的理解编译器是怎么运作的。
我们程序员编写的源代码是人类语言,我们可以很轻松得理解;但是对于计算机硬件(CPU)而言,这些源代码就好比是天书,它根本无法理解,更无法直接执行。计算机只能够识别某些特定的二进制指令,所以在程序真正运行之前,必须要把源代码转换成计算机可以识别的二进制指令。
在这篇《21天精通IPv4 to IPv6》系列的第二篇博客中,作为猫头虎博主,我将带领大家深入了解IPv6的世界。我们将探讨IPv6的基本概念、地址结构和地址格式。本文内容涉及广泛的词条,如IPv6概念、IPv6结构、网络技术,旨在使从小白到大佬都能轻松掌握IPv6的基础知识。
在Liteos-a中,使用LLVM来编译程序。LLVM的本意是“Low Level Virtual Machine”,一个底层的虚拟机。但是它现在已经发展成了一种编译器(compiler)的框架系统。简单地说,LLVM可以取代GCC,LLVM容易扩展,可以提供更好的性能。
iOS 编译采用 Clang 作为编译器前端,LLVM 作为编译器后端,编译器前端负责语法分析,语义分析,生成生成中间码 (LLVM IR),在这个过程中,会进行类型检查,如果发现错误或者警告会标注出来在哪一行;编译器后端会进行机器无关的代码优化,生成机器语言,并且进行机器相关的代码优化。
以太坊是一种内置图灵完备编程语言的区块链。任何人都可以利用以太坊的智能合约创造去中心化应用。
由于平时业余兴趣和工作需要,研究过并使用过时下流行的各种开源的x86/64汇编和反汇编引擎。如果要对汇编指令进行分析和操作,要么自己研究Intel指令集写一个,要么就用现成的开源引擎。自己写太浪费时间,又是苦力活,还容易出错,所以还是使用现成的好一点。 这里对我曾使用过的比较流行的反汇编引擎做个比较,我使用过的反汇编引擎有: 1. Ollydbg的ODDisassm Ollydbg的ODDisassm,这是我最早使用的一个开源的反汇编引擎,07年在《加密解密》(三) 中我写的一个很简单的虚拟机就是使用的这个库,因为那个时候还没有那么多可选择。不过多亏有这样一个基础库,整个虚拟机从设计到开发完成只用了两个星期便开发完成(当时对反汇编库的要求不高,只要求能用字符串文本做中间表示进行编码/解码)。 这个反汇编库的优点是含有汇编接口(即文本解析,将文本字符串解析并编码成二进制),就拿这个特性来说在当时也算是独树一帜的了,到目前为止开源界在做这个工作的人也很少, 不过近年出现的调试器新秀x64dbg,也附带开发了开源的汇编库XEDParse,功能与OD的文本解析功能相似,并且支持的指令集更加完整,BUG更少,同时还支持X64,维护一直很强劲。 但是ODDisassm的缺点也很多,比如: 1. 指令集支持不全,由于Ollydbg年久失修,现在甚至连对MMX指令集都不全,而现在的INTEL/AMD的扩展指令集标准又更新了多个版本,什么SSE5/AVX/AES/XOP就更别提了,完全无法解析。 2. 解码出来的结构不详细,比如指令前缀支持不够友好,这点从Ollydbg的反汇编窗口可以看出,除了movs/cmps等指令以外,repcc与其他指令组合时都是单独分开的; 再比如寄存器无法表示ah\bh\ch\dh这种高8位寄存器。 3. 作者一次性开源后便不再维护开源版本,对于反汇编上的BUG很难即时修复。 不过这些也可以理解,因为在当时作者的开发目的是进行文本汇编\反汇编,所以没有为解码出的信息建立结构体以及接口。总的来说,如今再使用这个反汇编引擎,已经落后于时代了。 2. BeaEngine BeaEngine是我用的第二个库,当时使用OD库已经不能满足我的需求了。在做反编译器的时候,需要一个能够解码信息越多越好的库,于是我找到了BeaEngine,这个库我记得以前的版本不支持高8位寄存器识别,现在的版本也支持了。 在使用过程中基本上没有发现什么明显的缺点,不常用的新的扩展指令集也实现了不少。 目前实现的扩展指令集有:
可执行与可链接格式 (英语:Executable and Linkable Format,缩写 ELF,此前的写法是 Extensible Linking Format),常被称为 ELF格式,在计算中,是一种用于可执行文件、目标代码、共享库和核心转储(core dump)的标准文件格式。
OpenGLES 3D 模型本质上是由一系列三角形在 3D 空间(OpenGL 坐标系)中构建而成,另外还包含了用于描述三角形表面的纹理、光照、材质等信息。
大概4个月前开始接触TVM,虽然是0经验开始看,但目前对TVM的IR以及Pass,Codegen,Scheduler等也有了一些基础的认识。所以这篇文章的目的是梳理一下TVM的整体架构,复盘一下自己学到了什么,以及为想学习TVM的小伙伴们提供一个整体思路。「从零开始学深度学习编译器」这个专题的文章和实验代码都被我汇总放到了https://github.com/BBuf/tvm_learn这个仓库中,当然是希望「大力点一下Star了」,感激不尽。仓库目录如下:
注意: 这篇文章的 Jupyter Notebook 代码在我的 Github 上:SpeedUpYourAlgorithms-Numba
【GiantPandaCV导语】本文是对MLIR的论文解读以及实践,这里的实践指的是把MLIR的要点在OneFlow Dialect中进行了对应,并解释了每个要点的实现方法以及这些要点的相关性,算是对MLIR学习过程的一个阶段总结。本文分为2大部分,第一部分为1-6节,主要是阅读MLIR论文,第7节是根据OneFlow Dialect解释论文中提到的MLIR基础架构中的要点如Type,Attribute,Operation,Trait,Interfaces,Region,Block等等。本文只是想起到抛砖引玉的效果让更多小伙伴了解MLIR这个编译架构
创建紧密代表输入语言语义的方言可以实现MLIR中的分析、转换和优化,这些分析、转换和优化需要高级语言信息,并且通常在语言AST上执行。例如,clang在C++中执行模板实例化时有一个相当复杂的mechanism。
在Rust源代码中,rust/compiler/rustc_mir_dataflow/src/impls/mod.rs文件的作用是提供各种数据流分析的实现。
在本系列的第 1 部分和第 2 部分中,我们对 eBPF 虚拟机进行了简洁的深入研究。阅读上述部分并不是理解第 3 部分的必修课,尽管很好地掌握了低级别的基础知识确实有助于更好地理解高级别的工具。为了理解这些工具是如何工作的,我们先定义一下 eBPF 程序的高层次组件:
前言 在上一篇直播APP常用动画效果中介绍了各种常用的动画效果,但是在直播APP中还有一种特别常用的礼物——手绘礼物。 这篇就是介绍如何实现这一个好玩的礼物。 正文 手绘礼物:简单来说,就是观众可以
领取专属 10元无门槛券
手把手带您无忧上云