- 博客(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> <
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关注的人