首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏homura的博客

    LLVM异常实现一 LLVM IR

    这一期我们通过编译C++到LLVM代码来查看这部分的实现。 在此之前我们需要了解一些简单的基础知识,之后我们将从一个最小抛出异常的代码开始,逐渐复杂化这个例子,查看生成不同的LLVM IR来理解整个过程。 函数调用 首先一个编译一个函数调用的过程中,LLVM常用的指令有call和invoke两类。 call是简单的一个函数调用,不会包含任何异常等。 attrs] [operand bundles] to label <normal label> unwind label <exception label> https://llvm.org /docs/LangRef.html#invoke-instruction https://llvm.org/docs/LangRef.html#call-instruction 具体使用案例可以参考后面的

    50510编辑于 2024-10-03
  • 来自专栏sofu456

    llvm

    编译 下载 git clone --config core.autocrlf=false https://github.com/llvm/llvm-project.git 编译 cd llvm-project mkdir build cd build cmake -G [options] …/llvm ? 例如:cmake -G “Visual Studio 16 2019” …/llvm ?

    1.3K40发布于 2020-05-04
  • 来自专栏TechBox

    LLVM简介

    但“LLVM”这个名字本身不是一个缩略词,它就是这个项目的全称。所以,不要再把LLVM叫做low level virtual machine。 LLVM开始于伊利诺斯大学的一个研究项目。 由上图可知,LLVM架构下,不同的前端和后端使用统一的中间代码LLVM InterMediate Representation(LLVM IR) 如果需要支持一门新的编程语言,只需要实现一个新的前端 上图呈现了Clang和LLVM的关系。Clang作为LLVM的前端,负责词法分析、语法分析、语义分析,然后生成中间代码。 最终LLVM后端会把优化后的中间代码转化为机器码。流程如下: image.png 虽然Clang是LLVM的前端,但是LLVM的前端不只是Clang。 Clang、Swift、LLVM的关系如下: ? PS: 广义的LLVM是指整个LLVM项目,包括Clang前端。狭义的LLVM是指LLVM后端。

    10.3K11发布于 2019-11-04
  • 来自专栏面向人生编程

    认识 LLVM

    简介 LLVM是一套提供编译器基础设施的开源项目,是用 C++ 编写,包含一系列模块化的编译器组件和工具链,用来开发编译器前端和后端。 ,而是包括 LLVM 中介码(LLVM IR)、LLVM调试工具、LLVM C++ 标准库等一系列编译工具及低端工具技术的集合。 LLVM IR LLVM提供了一套适合编译器系统的中间语言(Intermediate Representation,IR),有大量变换和优化都围绕其实现,经过变换和优化后的中间语言,可以转换为目标平台相关的汇编语言代码 LLVM IR 支持标签,通常看起来像一种奇怪的汇编语言形式。 LLVM 类型系统包含基本类型(整数或是浮点数)及五个复合类型(指针、数组、向量、结构及函数),在LLVM具体语言的类型建制可以以结合基本类型来表示,举例来说,C++所使用的class可以被表示为结构、

    1.7K20编辑于 2022-02-26
  • 来自专栏Chasays

    LLVM 是什么?

    LLVM 可以用作编译器框架,其中提供“前端”(解析器和词法分析器)和“后端”(将 LLVM 的表示转换为实际机器代码的代码)。 LLVM-based compiler 这是一个部分或完全使用 LLVM 基础结构构建的编译器。例如,编译器可能在前端和后端使用 LLVM,但是使用 GCC 和 GNU 系统库执行最终链接。 LLVM libs https://releases.llvm.org/2.6/docs/UsingLibraries.html 这是 LLVM 基础结构的可重用代码部分. LLVM 是一个用于构建编译器、链接器、运行时执行器、虚拟机和其他程序执行相关工具的工具包。除了 LLVM 工具集之外,LLVM 的功能还可以通过一组库来实现。 LLVM IR https://llvm.org/docs/LangRef.html LLVM 编译器的中间表示.

    1.9K31编辑于 2022-05-11
  • 来自专栏Helloted

    LLVM编译过程

    2、LLVM LLVM 是一个开源的,模块化和可重用的编译器和工具链技术的集合,或者说是一个编译器套件。 Xcode3 以前: GCC; Xcode3:增加LLVM,GCC(前端) + LLVM(后端); Xcode4.2:出现Clang - LLVM 3.0成为默认编译器; Xcode4.6:LLVM 升级到 4.2版本; Xcode5:GCC被废弃,新的编译器是LLVM 5.0,从GCC过渡到Clang-LLVM的时代正式完成,Objective-C与swift都采用Clang作为编译器前端 4、Clang-LLVM 架构 Clang-LLVM架构中,Clang作为前端生成中间代码IR,LLVM优化器进行优化,LLVM机器码生成器生成不同的机器码 再具体一些的话: 5、Xcode中的编译过程 具体来说,在Xcode an LLVM Pass 。

    2.7K10编辑于 2022-06-08
  • 来自专栏编译器开发

    llvm初探——源码编译

    源码编译llvm时遇到编译中断问题,查了一下时内存不足,swap分区也不够用的问题,解决方法是手动创建swap分区文件,扩展swap分区。 卸载swap分区文件: 在完成llvm编译后可以将扩展的swap文件卸载,降低磁盘空间占用。命令:之后删除该文件即可。

    1.2K20编辑于 2021-12-09
  • 来自专栏zhimingcow

    GCC、Clang和LLVM

    LLVM: (low level virtual machine)优化代码,优化:编译时间,链接时间,运行时间,空闲优化。 它是构架编译器的框架系统,用于优化使用任何语言编写的程序。 LLVM是一个project ,包含许多组件。 包含许多把中间代码转为obj文件的工具、库、头文件。 包含汇编器、反汇编器、bitcode分析器和bitcode优化器。也包含基本的回归测试。 相关性: Clang编译C家族语言到LLVM bitcode , 然后再用LLVM转为obj文件。 非常酷的一点,支持任何平台!!!

    1.4K20发布于 2020-03-12
  • 来自专栏Postgresql源码分析

    LLVM(2)IR入门

    llvm.module.flags = !{!0, !1, !2, !3, !4} !llvm.ident = !{!5} !0 = !{i32 1, !"wchar_size", i32 4} ! clang version 16.0.6 (https://github.com/llvm/llvm-project.git 7cbf1a2591520c2491aa35339f227775f4d3adf6 5 IR结构 6 todo 用到的话继续把Tutorial-Bridgers-LLVM_IR_tutorial.pdf指针、类型部分看完。 .c -> .ll:clang -emit-llvm -S a.c -o a.ll .c -> .bc: clang -emit-llvm -c a.c -o a.bc .ll -> .bc: llvm-as a.ll -o a.bc .bc -> .ll: llvm-dis a.bc -o a.ll .bc -> .s: llc a.bc -o a.s

    60040编辑于 2023-10-13
  • 来自专栏iOS小生活

    LLVM(二)——Clang插件

    LLVM的下载 由于国内的网络限制,我们需要借助镜像来下载LLVM的源码: https://mirror.tuna.tsinghua.edu.cn/help/llvm/ 执行如下命令下载LLVM项目的源码 : git clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm/llvm.git 这一步真的很磨人,我下载了一上午才搞定? LLVM项目的源码下载完成之后,cd到其tools目录下,下载Clang子项目: cd llvm/tools git clone https://mirrors.tuna.tsinghua.edu.cn /git/llvm/clang.git 然后,在LLVM的projects目录下,下载compiler-rt,libcxx,libcxxabi: cd .. 接下来我通过Xcode来编译一下LLVM

    2.2K30发布于 2021-04-16
  • 来自专栏iOS小生活

    LLVM(一)——编译流程

    那么LLVM是什么?Clang跟LLVM又有什么关系呢? 首先来聊一聊传统编译器的设计。 1,传统编译器设计 ? 2,LLVM的设计 上面讲了传统的编译器设计,接下来我们就来聊聊LLVM。 Clang是LLVM项目中的一个子项目,属于LLVM的编译器前端,不过它仅仅是LLVM的众多编译器前端中的一个,它负责编译C/C++/OC语言。针对不同的语言和架构,LLVM的前端是不一样的。 这就是LLVM的优化! 接下来聊一聊LLVM优化过程中的节点——pass。pass是很重要的一个概念,他不属于Clang前端,而是属于LLVM后端。 pass是LLVM优化过程中的一个节点,LLVM在优化代码的时候是一个节点一个节点去优化的,每一个节点去做一些优化的事情,最后加起来构成优化的转化,所以说LLVM的优化是由多个pass节点组成的。

    3.1K32发布于 2021-04-16
  • 来自专栏王小二的Android站

    Auto-Vectorization in LLVM

    前言 最近遇到一个性能问题,与Auto-Vectorization in LLVM有关,翻译一下官方介绍 http://llvm.org/docs/Vectorizers.html 简单一句话概括: 一、Auto-Vectorization in LLVM LLVM有两个矢量器:The Loop Vectorizer 循环矢量器(在循环上运行)和The SLP Vectorizer SLP矢量器。 详见《Clang用户手册》 2.3 功能 LLVM循环矢量器有许多功能,允许它对复杂的循环进行矢量化。 这是不有益的,并且LLVM只会在强制使用“-mllvm-force vector width=#”时将这些代码矢量化。 2.4 持续发展方向 对LLVM循环向量器的流程进行建模和基础设施升级。 三、The SLP Vectorizer 3.1 详情 SLP向量化的目标是将相似的独立指令组合成向量指令。

    4K30发布于 2020-12-14
  • 来自专栏Chasays

    LLVM intrinsic 介绍

    什么是 LLVM intrinsic LLVM 支持“intrinsic function”的概念。这些函数具有众所周知的名称和语义,并且需要遵循某些限制。 总的来说,这些 intrinsic 代表 LLVM 语言的扩展机制,在添加到语言(或者位码读取器/写入器、解析器等)时不需要更改 LLVM 中的所有转换。 命名格式 intrinsic名必须全部以“ llvm”开头前缀。这个前缀在 LLVM 中保留用于intrinsic名称; 因此,函数名称不能以这个前缀开头。 这导致了一系列函数,如 @llvm.ctpop.i8(i8 %val)和 i29 @llvm.ctpop.i29(i29 %val).只有一个类型(返回类型)被重载,并且只需要一个类型后缀。 (例如: llvm.ssa.copy.p0s_s.2(%42*)), 这个数字在 LLVM 模块中被跟踪,并确保模块中的唯一名称。在将两个模块链接在一起时,仍然有可能出现名称冲突。

    2.1K20编辑于 2022-05-11
  • 来自专栏AI系统

    【AI系统】LLVM IR 详解

    在上一篇文章中,我们已经简要介绍了 LLVM 的基本概念和架构,我们现在将更深入地研究 LLVM 的 IR(中间表示)的概念。 LLVM IR 指令集 LLVM IR 是 LLVM 编译器框架中的一种中间语言,它提供了一个抽象层次,使得编译器能够在多个阶段进行优化和代码生成。 LLVM IR 中三地址码 LLVM IR 是 LLVM 编译器框架使用的一种中间表示,采用了类似三地址码的设计理念。 LLVM IR 设计原则 LLVM IR 是一种通用的、低级的虚拟指令集,用于编译器和工具链开发。 LLVM IR 内存模型 在进行编译器优化时,需要了解 LLVM IR(中间表示)的内存模型。LLVM IR 的内存模型是基于基本块的,每个基本块都有自己的内存空间,指令只能在其内存空间内执行。

    1.1K10编辑于 2024-12-04
  • 来自专栏Postgresql源码分析

    LLVM(1)Fibonacci实例

    "llvm/ExecutionEngine/GenericValue.h" #include "llvm/ExecutionEngine/MCJIT.h" #include "llvm/IR/Argument.h " #include "llvm/IR/BasicBlock.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/Function.h" #include "llvm/IR/InstrTypes.h" #include "llvm/IR/Instructions.h" #include "llvm /IR/LLVMContext.h" #include "llvm/IR/Module.h" #include "llvm/IR/Type.h" #include "llvm/Support/Casting.h = `llvm-config --cxxflags` LLVM_L_FLAGS = `llvm-config --ldflags --system-libs --libs all` .PHONY:

    50050编辑于 2023-10-13
  • 来自专栏随意记录

    使用 Inkwell 生成 LLVM IR

    最后将 LLVM IR 交给 LLVMLLVM 将其生成指定平台的目标代码。IR 指中间表达方式,介于高级语言和汇编语言之间。 1 LLVM 数据结构Context: 拥有和管理 LLVM 核心基础设施的核心“全局”数据,包括类型和常量统一表。 ());global_value.as_pointer_value()Builder: 生成 LLVM 指令。 IR 应该是什么样子,然后再使用 Inkwell 写出对应的 LLVM IR。 如果不知道 LLVM IR 应该是什么样的,可以先写出 C 代码,然后用如下命令生成 LLVM IR:clang -S -emit-llvm hello.c

    1.4K80编辑于 2023-06-13
  • 来自专栏homura的博客

    LLVM异常实现四 personality

    LLVM doesn't currently support // any such platforms and Clang doesn't export a macro for them.

    36610编辑于 2024-10-03
  • 来自专栏Fish

    Clang与LLVM的关系

    2006年Chris Lattner加盟Apple Inc.并致力于LLVM在Apple开发体系中的应用。Apple也是LLVM计划的主要资助者[引自百度百科]。 我们可以认为LLVM是一个完整的编译器架构,也可以认为它是一个用于开发编译器、解释器相关的库。在理解LLVM时,我们可以认为它包括了一个狭义的LLVM和一个广义的LLVM。 广义的LLVM其实就是指整个LLVM编译器架构,包括了前端、后端、优化器、众多的库函数以及很多的模块;而狭义的LLVM其实就是聚焦于编译器后端功能(代码生成、代码优化、JIT等)的一系列模块和库。 Clang是一个C++编写、基于LLVM、发布于LLVM BSD许可证下的C/C++/Objective-C/Objective-C++编译器。那么为什么已经有了GCC还要开发Clang呢? Clang其实大致上可以对应到编译器的前端,主要处理一些和具体机器无关的针对语言的分析操作;编译器的优化器部分和后端部分其实就是我们之前谈到的LLVM后端(狭义的LLVM);而整体的Compiler架构就是

    2.1K12发布于 2019-05-27
  • 来自专栏闲余说

    ubuntu安装LLVM和clang

    问题描述 笔者在安装LLVM和clang时遇到一下奇葩的问题,搞的人极为头大。先说说笔者的环境吧。 ubuntu12.04 64位。用这个主要是笔者之前做的一些工作需要在这个环境上部署。 g++从4.7才开始支持C++11,而笔者所装LLVM版本为3.7已经有一些C++11特性了,自带g++4.6.3已经不能对其进行编译了。 路有三条: 直接sudo apt-get install llvm clang一条命令搞定,可是安装的LLVM版本比较老,是3.0版本的。 和第一条路类似,降低LLVM版本,这就为难了——降到哪个版本呢? 笔者选择了第三条路,升级gcc/g++,通过笔者走的是保守路线,升级到4.8也不高也不低。 安装LLVM和clang 总算把各种路障清干净了,接下来就更好办了,直接按照官方文档一步一步输命令安装即可。不再赘述,详情见参考资料。

    4.5K20编辑于 2022-08-19
  • 来自专栏homura的博客

    LLVM Pass 其三:PassBuilder

    LLVM Pass 其三:PassBuilder 出来吧,罪青眼白龙! 在llvm官方的仓库里example目录中有这么一段代码 examples/Bye/Bye.cpp /* New PM Registration */ llvm::PassPluginLibraryInfo getByePluginInfo() { return {LLVM_PLUGIN_API_VERSION, "Bye", LLVM_VERSION_STRING, [](PassBuilder extern "C" LLVM_ATTRIBUTE_WEAK ::llvm::PassPluginLibraryInfo llvmGetPassPluginInfo() { return getByePluginInfo 通过这种插件的方式可以给LLVM添加一些自己实现的Pass,可以看到有一个传入PassBuilder的lambda,之后通过注册各种callback来实现。

    2.8K20编辑于 2023-04-07
领券