自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 收藏
  • 关注

原创 llvm libLLVMCore源码分析 25 - GVMaterializer Class

源码路径llvm\include\llvm\IR\GVMaterializer.hllvm\include\llvm\IR\AutoUpgrade.hllvm\Bitcode\BitcodeReader.hllvm\lib\Bitcode\Reader\BitcodeReader.cppllvm GVMaterializer Classllvm中使用GVMaterializer类作为加载Module的类的抽象接口,比如llvm的BitcodeReader就是该类的实体类:cla

2022-03-28 11:45:51 492

原创 llvm libLLVMCore源码分析 24 - Comdat Class

源码路径llvm\include\llvm\IR\Comdat.hCOMDAT在很多ABI中,定义了COMDAT段,这种类型的段在链接时会根据段名进行合并。链接器如何合并这些段,通过一个标志指示。llvm支持的标志的可选类型如下:enum SelectionKind { Any, ///< 链接器可以选择任意一个COMDAT ExactMatch, ///< 所有COMDAT的内容必须完全相同,否则会上报链接错误。 Larges

2022-03-28 09:55:02 562

原创 llvm libLLVMCore源码分析 23 - DINode

源码路径llvm\include\llvm\IR\Metadata.hllvm\include\llvm\IR\DebugInfoMetadata.hDINode表示DWARF标签信息(DW_TAG_*),DINode继承树如下:GenericDINode泛化的类DWARF元数据类型,第一个Operand是一个MDString,其余的Operand是对其他Metadata的指针。IR示例如下:!0 = !{}!1 = !GenericDINode(tag: 3, he

2022-03-25 11:26:52 1479

原创 llvm libLLVMCore源码分析 22 - DebugInfoMetadata

源码路径llvm\include\llvm\IR\Metadata.hllvm\include\llvm\IR\DebugInfoMetadata.hDebugInfoMetadataDebugInfoMetadata是特殊的元数据类型,用于调试:除了MDTuple,其余都是DebugInfoMetadata。DILocationDILocation表示源代码中的位置。用第1个Operand表示范围,类型为DILocalScope;用第2个Operand表示函数Inline.

2022-03-25 11:01:42 705

原创 llvm libLLVMCore源码分析 21 - Metadata Class

源码路径llvm\include\llvm\IR\Metadata.hllvm\include\llvm\IR\DebugInfoMetadata.hllvm Metadata classllvm IR中允许使用元数据附在指令和全局对象上,为优化器和代码生成器提供一些额外的信息(比如调试信息)。在llvm中,使用Metadata类表示元数据。Metadata类的继承树如下:为了高效的管理Metadata对象,Metadata在llvm中的存储分为3种类型:Uniqued:元数据内

2022-03-18 17:15:19 860

原创 llvm libLLVMCore源码分析 20 - Function Class

源码路径llvm\include\llvm\IR\Function.hllvm Function class在llvm中,使用Function class表示函数,Function class的定义如下:class Function : public GlobalObject, public ilist_node<Function> {...};首先,Function继承自GlobalObject,是一个全局独立对象。其次,Function继承ilist_node&

2022-03-16 10:37:44 1065

原创 llvm libLLVMCore源码分析 19 - GlobalValue

源码路径llvm\include\llvm\IR\GlobalValue.hllvm\include\llvm\IR\GlobalIndirectSymbol.hllvm\include\llvm\IR\GlobalAlias.hllvm\include\llvm\IR\GlobalIFunc.hllvm\include\llvm\IR\GlobalVariable.hllvm\include\llvm\IR\Function.hllvm GlobalValue class在

2022-03-15 15:28:50 1255

原创 llvm libLLVMCore源码分析 18 - BlockAddress & ConstantExpr

源码路径llvm\include\llvm\IR\Constant.hllvm BlockAddress classBlockAddress用于唯一标识一组(Function F,BasicBlock B)的地址:blockaddress(@function,%block)BlockAddress常量的类型是i8 addrspace(P)*,P是包含该BasicBlock的Function所在的地址空间(通常是0)。BlockAddress只能用作indirectbr/callb.

2022-03-14 10:27:50 516

原创 llvm libLLVMCore源码分析 17 - ConstantAggregate

源码路径llvm\include\llvm\IR\Constant.hllvm ConstantAggregate classConstantAggregate是所有复合常量的基类,复合常量把子复合常量或者简单常量(ConstantData)当作操作数进行管理,继承树如下:ConstantStruct表示结构体常量,如下代码:const struct Foo f = { .a = 1, .b = 2 };int constant_struct(int b) { return

2022-03-14 09:35:21 232

原创 llvm libLLVMCore源码分析 16 - ConstantData

源码路径llvm\include\llvm\IR\Constant.hllvm ConstantData classConstantData类是所有简单常量的基类,继承树如下:ConstantData仅用于表示常量本身,使用了Flyweight设计模式,可以在不相关的Module之间共享。既比如1个的常量i32 100,可以用于所有需要表示常量i32 100的地方,仅需要1个对象实例。ConstantInt表示任意位宽的整型常量。如下代码:int constant_i.

2022-03-11 16:25:31 302

原创 llvm libLLVMCore源码分析 15 - Constant Class

源码路径llvm\include\llvm\IR\Constant.hllvm Constant class在llvm中,用Constant类作为所有常量的基类,代表值不会在运行时发生变化。Constant类定义如下,可以看到Constant类继承自User,因为Constant会引用其他Value,也会被其他Value引用。class Constant : public User {};Constant类继承树如下:ConstantData:简单常量,如int,floa

2022-03-11 10:59:00 281

原创 llvm libLLVMCore源码分析 14 - BasicBlock Class

源码路径llvm\include\llvm\IR\BasicBlock.hllvm BasicBlock class回顾一下llvm IR的组织结构。在llmv中,一个Module中可以有n个Function,Function内可以有n个BasicBlock,BasicBlock是单进单出的n条Instruction序列。因此,BasicBlock本质上是一个顺序执行的指令的容器。在源代码中,BasicBlock的定义如下:classBasicBlockfinal:pu...

2022-03-09 18:19:32 915 2

原创 llvm libLLVMCore源码分析 11 - PHI Node Instruction

源码路径llvm\include\llvm\IR\Instruction.hllvm\include\llvm\IR\Instruction.defllvm\include\llvm\IR\Instructions.hllvm\include\llvm\IR\InstrTypes.hllvm PHI NodeLLVM IR采用SSA(Static Single Assignment)的形式,这种形式的核心要求有2点:每个变量只被赋值1次。 每个变量在使用前必须先定义。如下源代

2022-03-09 15:37:25 438

原创 llvm libLLVMCore源码分析 12 - Vector & Aggregate Operations

源码路径llvm\include\llvm\IR\Instruction.hllvm\include\llvm\IR\Instruction.defllvm\include\llvm\IR\Instructions.hllvm\include\llvm\IR\InstrTypes.hVector OperationsExtractElementInst(父类:Instruction)extractelement指令从vector从取出指定索引位置的标量。语法<re

2022-03-09 09:53:30 467

原创 llvm libLLVMCore源码分析 13 - Other Operators

源码路径llvm\include\llvm\IR\Instruction.hllvm\include\llvm\IR\Instruction.defllvm\include\llvm\IR\Instructions.hllvm\include\llvm\IR\InstrTypes.hOther Operatorsllvm中有部分指令不能简单地归类到某一类别下,这些指令被llvm归类到Other Operators。ICmpInst(父类:CmpInst)icmp返回比较两个操

2022-03-08 18:14:42 955

原创 llvm libLLVMCore源码分析 10 - Exception Handling Instructions

源码路径llvm\include\llvm\IR\Instruction.hllvm\include\llvm\IR\Instruction.defllvm\include\llvm\IR\Instructions.hllvm\include\llvm\IR\InstrTypes.hLLVM中的异常处理当LLVM的代码中抛出异常时,LLVM runtime会先尝试找到对应函数的异常帧(exception frame),如果是支持异常处理的语言(如C++),则异常帧中会包含异常处理表(

2022-03-08 11:08:53 626

原创 llvm libLLVMCore源码分析 09 - Cast Operators

源码路径llvm\include\llvm\IR\Instruction.hllvm\include\llvm\IR\Instruction.defllvm\include\llvm\IR\Instructions.hllvm\include\llvm\IR\InstrTypes.hCast OperatorsTruncInst(父类:CastInst)trunc指令将操作数截断为另一个类型。语法<result> = trunc <ty> &lt

2022-03-01 16:48:27 997

原创 llvm libLLVMCore源码分析 08 - Memory Operators

源码路径llvm\include\llvm\IR\Instruction.hllvm\include\llvm\IR\Instruction.defllvm\include\llvm\IR\Instructions.hllvm\include\llvm\IR\InstrTypes.hMemory Ordering待补充Memory OperatorsAllocaInst(父类:UnaryInstruction)alloca指令用于在当前函数的栈帧上分配内存,当函数返回

2022-02-28 17:02:52 770

原创 llvm libLLVMCore源码分析 07 - Unary & Binary Operators

源码路径llvm\include\llvm\IR\Instruction.hllvm\include\llvm\IR\Instruction.defllvm\include\llvm\IR\Instructions.hllvm\include\llvm\IR\InstrTypes.hUnary Operators所有的Unary Operators在llvm中均使用类UnaryOperator实现,没有单独的子类。fnegfneg指令用于返回操作数的负值。语法&..

2022-02-26 18:25:38 796

原创 llvm libLLVMCore源码分析 06 - Terminator Instructions

源码路径llvm\include\llvm\IR\Instruction.hllvm\include\llvm\IR\Instruction.defllvm\include\llvm\IR\Instructions.hllvm\include\llvm\IR\InstrTypes.hTerminator InstructionsTerminator指令用于指示当前BasicBlock的结尾,并指示下一个要执行的BasicBlock。ReturnInst(父类:Instructio.

2022-02-26 11:32:53 661

原创 llvm libLLVMCore源码分析 05 - Instruction Class

源码路径llvm\include\llvm\IR\Instruction.hllvm\include\llvm\IR\Instruction.defllvm\include\llvm\IR\Instructions.hllvm\include\llvm\IR\InstrTypes.hInstruction和BasicBlock在分析代码前,需要先介绍一下llvm IR的组织结构。在llmv中,一个Module中可以有n个Function,Function内可以有n个BasicBloc

2022-02-25 16:42:26 1009

原创 llvm libLLVMCore源码分析 04 - Use Class

源码路径llvm\include\llvm\IR\Use.hllvm\include\llvm\IR\Value.hllvm\include\llvm\IR\User.hllvm Use class在之前的系列文章中,我们讲到Use类表示User和Value之间的关系:1)一个Value可以有多个Use,每个Use对应一个User,既def-use chain。2)一个User可以有多个Use,每个Use对应一个Value,既use-def chain。所以Use类的核心

2022-02-23 11:40:06 1084 2

原创 llvm libLLVMCore源码分析 26 - Module Class

源码路径llvm\include\llvm\IR\Module.hllvm Module Class在llvm中,Module类代表的是llvm程序(既IR编写的程序)的顶层结构。1个Module本质上就是原始程序的1个翻译单元(TU),或者是原始程序的多个翻译单元通过链接器链接而成。Module中包含了全局变量列表,函数列表,依赖的库/Module列表,符号表以及其他描述目标架构信息的数据。DataLayoutDataLayout既数据布局,是1个字符串,描述了数据在内存中的布局。

2022-02-22 18:06:58 593

原创 llvm libLLVMCore源码分析 03 - User Class

源码路径llvm\include\llvm\IR\User.hllvm User Class在llvm,User类是所有引用Value类的节点的基类,User类的继承树如下:use-def chainUser中引用的Value被称为Operands,因为llvm的IR是SSA形式的,所以User的Operands直接指向Value的定义处,这就是use-def chain。有2种方式可以遍历User引用的Value,方式1是使用索引:Value *getOperand(un

2022-02-21 21:57:24 833

原创 llvm libLLVMCore源码分析 02 - Value Class

源码路径llvm\include\llvm\IR\Value.hllvm\include\llvm\IR\ValueHandle.hllvm Value Class在llvm中,Value类是所有程序计算出的值的类(如Arguments,Instructions, Functions等)的基类。Value Type:Value都是有类型的,可以通过getType()方法获取Value的Type。Value Name:Value可以有名字,如下所示的IR中,这个Instructio

2022-02-21 21:08:53 985

原创 llvm libLLVMCore源码分析 01 - Type Class

源码路径llvm\include\llvm\IR\Type.hllvm\include\llvm\IR\DerivedTypes.hllvm类型系统llvm类型系统是llvm IR最重要的特性之一,是llvm IR和普通的三地址码的重要区别,是一系列的基于IR的优化的基础。以下面的源代码为例:// type.cppint add1(int a, int b) { return a + b;}使用命令"clang -S -emit-llvm type.cpp -o type.

2022-02-15 17:11:50 1812

翻译 C程序中的未定义行为(Undefined Behavior)

什么是UBLLVM IR和C语言中都有UB的概念。很多在C语言中看似合理的事都可能导致UB,UB是代码中很多BUG的源泉。UB在C或类C语言中存在的原因是因为追求极致的性能。类似JAVA之类的语言为了安全和可重现行为的特性,和有意避开了UB,但损失了性能。在讲解更多的细节之前,先简单讲解一下要实现一个对大部分C程序性能友好的编译器,有哪些关键要素:a) 做好关键算法的实现:寄存器分配、调度等等。 b) 知道大量的小技巧(tricks),比如peephole optimization(将一部

2022-02-12 09:33:46 1909

原创 Google Sanitizers

Google SanitizersGoogle的sanitizers一共有5种:AddressSanitizer (检查寻址问题) :包含LeakSanitizer (检查内存泄漏问题) ThreadSanitizer:检查数据竞争和死锁问题(支持C++和Go) MemorySanitizer:检查使用未初始化的内存问题 HWASAN(Hardware-assisted AddressSanitizer):AddressSanitizer的变种,相比AddressSanitizer消耗的内存更

2022-02-12 09:25:11 1833

原创 llvm libLLVMCore源码分析 - 目录

llvm libLLVMCore由一系列类组成,主要的功能是使用IR的形式表示程序(由于历史原因,这个库被命令为libLLVMCore,其实命名为libLLVMIR更准确)。这些类的头文件都被放置在include/llvm/IR目录下,源文件放置在lib/IR目录下。本系列博客会按照如下顺序,对llvm libLLVMCore中的类进行逐个分析(更新中~~~):llvm libLLVMCore源码分析 01 - Type Classllvm libLLVMCore源码分析 02 - Value

2022-02-10 15:21:35 1721

原创 llvm pass 调试

llvm为开发者提供了2种常用的新开发pass调试方法:statistic class和debug counter。statistic classstatistic class是一个计数器,通常用于统计Transform Pass对代码进行Transform的次数。使用如下代码可以定义一个新的计数器NumXForms。#define DEBUG_TYPE "mypassname" // This goes after any #includes.STATISTIC(NumXForms,

2022-02-09 17:22:03 792

原创 llvm RTTI(Run-Time Type Identification)

llvm RTTI(Run-Time Type Identification)

2022-02-08 18:15:31 2050

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除