您现在的位置是:首页» windows系统» llvm源码编译,llvm源码解读

llvm源码编译,llvm源码解读

2024-07-13 03:39:49
本内容由系统网小编为大家分享,Windows系统安装教程、办公系统、软件怎么使用、软件使用教程、办公软件攻略等信息。源码路径llvmincludellvmIRInstruction.hllvmincludellvmIRInstruction

本内容由系统网小编为大家分享,Windows系统安装教程、办公系统、软件怎么使用、软件使用教程、办公软件攻略等信息。

源码路径

llvmincludellvmIRInstruction.h

llvmincludellvmIRInstruction.def

llvmincludellvmIRInstructions.h

llvmincludellvmIRInstrTypes.h

Memory Ordering

atomic指令(cmpxchg/atomicrmw/fence/atomic load/atomic store)通过ordering参数决定操作同一个地址的指令间的同步关系。

llvm的ordering参数:(notatomic)/unordered/monotonic/acquire/release/acq_rel/seq_cst

notatomic

只保证在竞争条件下不出现未定义行为,不可以用于同步。

monotonic

等同于C++中的memory_order_relaxed,在同一线程内对同一地址的原则操作保持happens-before关系,不可以被重排。线程间仅保证对同一地址的修改操作有序。该ordering通常用作原子计数器。

acquire

等同于C++中的memory_order_acquire,在monotonic的基础上,建立了一条从load acquire起始的synchronizes-with的边到store release操作。线程间可以保证load acquire的时候,读到store release之前的所有修改操作。

release

等同于C++中的memory_order_release,在monotonic的基础上,synchronizes-with后续的load acquire操作。线程间可以保证load acquire的时候,读到store release之前的所有修改操作。

acq_rel

等同于C++中的memory_order_acq_rel,等同于acquire+release,既可以读到其他线程release之前的所有修改操作,也保证自己的修改操作能被其他线程acquire到。

seq_cst

等同于C++中的memory_order_seq_cst和Java中的volatile,在acq_rel的基础上,对每一个地址的原子操作在整个程序范围内进行排序,所有线程看到的内存操作顺序都是一样的。

Sync Scope

syncscope("singlethread")

acquire和release:只与同一个线程内的原子操作有synchronizes-with关系。

seq_cst:只与同一线程内的原子操作进行排序。

syncscope("target-scope")

目标特定的同步范围。

Other

上述两者都不是的原子操作之间有synchronizes-with关系并在seq_cst下进行排序。

Memory Operators

AllocaInst(父类:UnaryInstruction)

alloca指令用于在当前函数的栈帧上分配内存,当函数返回时自动释放。

语法

参数说明:

type:申请内存的单个元素的类型,必须支持sizeof。

NumElements(可选):申请内存的元素个数,不指定则默认为1。

alignment(可选):申请内存的首地址对齐,不指定或为0,则会使用适合type的对齐。

addrspace(可选):申请内存的地址空间(address space),如果不显式指定,则默认从datalayout中指定的地址空间中申请。

语义

在当前函数的栈帧上分配未经初始化的内存,当函数返回时自动释放。如果栈空间不足,则指令的行为是未定义的。

示例

LoadInst(父类:UnaryInstruction)

load指令用于读取内存。

语法

参数说明:

ty:支持sizeof的类型

volatile(可选):如果指定了volatile,则优化器不能改变本指令和其他volatile指令之间的执行顺序。

atomic(可选):如果指定了atomic,则需要指定ordering参数:unordered/monotonic/acquire/seq_cst,同时指定syncscope("<target-scope>")参数:syncscope("singlethread")/syncscope("target-scope”)。atomic load保证在多个atomic  write的情况下,产生确定的结果。

align(可选):指定load的对齐,如果不指定,则使用ABI中的对齐。注:atomic存在的时候为必选。

!nontemporal !<nontemp_node>(可选):load的结果不需要在cache中被重用,可以选择特殊的指令避免读入到cache。

!invariant.load !<empty_node>(可选):load的地址中的值必须在程序中所有地方保持一致?

!nonnull ! <empty_node>(可选):load的值不为空,仅能用于ty为pointer类型。

!dereferenceable !<deref_bytes_node>(可选) :load的值是可以被解引用的,解引用的长度由deref_bytes_node对应的元数据指定。

!dereferenceable_or_null ! <deref_bytes_node>(可选):load的值要么为null,要么是可以被解引用的,解引用的长度由deref_bytes_node对应的元数据指定。

!align !<align_node>(可选):load的值是按照align_node中指定的值对齐的。

!noundef !<empty_node>(可选):load的值是well defined?

语义

读取pointer指向的内存中的值。

示例

StoreInst(父类:Instruction)

store指令用于将值写入内存。

语法

参数说明:

ty:支持sizeof的类型

volatile(可选):如果指定了volatile,则优化器不能改变本指令和其他volatile指令之间的执行顺序。

atomic(可选):如果指定了atomic,则需要指定ordering参数:unordered/monotonic/release/seq_cst,同时指定syncscope("<target-scope>")参数:syncscope("singlethread")/syncscope("target-scope”)。atomic load保证在多个atomic store的情况下,产生确定的结果。

align(可选):指定store的对齐,如果不指定,则使用ABI中的对齐。注:atomic存在的时候为必选。

!nontemporal !<nontemp_node>(可选):store的结果不需要在cache中被重用,可以选择特殊的指令避免读入到cache。

!invariant.load !<empty_node>(可选):?

语义

pointer指向的内存中的值被更新为value。

示例

GetElementPtrInst(父类:Instruction)

getelementptr指令用于获取聚合数据类型中的成员地址。

语法

参数说明:

ty:聚合数据类型。

ptrval:指针或者指针矢量,指向聚合数据类型的起始地址。

idx:聚合数据类型的第几个成员。

inbounds(可选):如果指定了inbounds且成员地址超出了ptrval指向的对象的范围,则result为Poison Value。

inrange(可选):如果指定了inrange,则inrange紧跟的index不能超过范围,否则指令行为是未定义的,目前只用于常量。

语法

参考下列示例:

示例

FenceInst(父类:Instruction)

fence指令用于指定指令间的happens-before关系。

语法

参数说明:

ordering:acquire/release/acq_rel/seq_cst

语义

fence指令用于指定指令间的happens-before关系。

简单理解:

monotonic load + fence acquire = acquire load

monotonic store + fence release = release store

示例

AtomicCmpXchgInst(父类:Instruction)

cmpxchg指令用于自动修改内存。

语法

参数说明:

ty:整型或者指针类型,位宽必须超过8bit。*pointer/cmp/new的类型必须一致。

pointer:指令操作的内存地址。

cmp:用于比较的值。

new:比较相等后写入内存的值。

volatile(可选):如果指定了volatile,则优化器不能改变本指令和其他volatile指令之间的执行顺序。

success ordering(可选):monotonic/acquire/release/acq_rel/seq_cst

failure ordering(可选):monotonic/acquire/seq_cst

syncscope(可选):syncscope("singlethread")/syncscope("target-scope”)

align(可选):必须大于等于ty的size。

weak(可选):如果设置了weak,则允许比较相等后,写入new不成功。

语义

指令读取pointer指向的内存中的值,与cmp比较,如果相等,则将new写入pointer指向的内存。指令返回pointer指向的内存中的原始值和一个是否成功写入new的标志。

示例

AtomicRMWInst(父类:Instruction)

atomicrmw指令用于自动修改内存。

语法

参数说明:

operation:xchg/add/sub/and/nand/or/xor/max/min/umax/umin/fadd/fsub

pointer:修改的内存地址。

value:operation的参数。

volatile(可选):如果指定了volatile,则优化器不能改变本指令和其他volatile指令之间的执行顺序。

align(可选):必须大于等于ty的size。

syncscope(可选):syncscope("singlethread")/syncscope("target-scope”)

语义

指令读取pointer指向的内存中的值,修改后再写回。修改的方式如下:

xchg:*ptr = val add:*ptr = *ptr + val sub:*ptr = *ptr - val and:*ptr = *ptr & val nand:*ptr = ~(*ptr & val) or:*ptr = *ptr | val xor:*ptr = *ptr ^ val max:*ptr = *ptr > val ? *ptr : val(using a signed comparison) min:*ptr = *ptr < val ? *ptr : val(using a signed comparison) umax:*ptr = *ptr > val ? *ptr : val(using an unsigned comparison) umin:*ptr = *ptr < val ? *ptr : val(using an unsigned comparison) fadd:*ptr = *ptr + val(using floating point arithmetic) fsub:*ptr = *ptr - val(using floating point arithmetic)

示例

XTw.com.Cn系统网专业应用软件下载教程,免费windows10系统,win11,办公软件,OA办公系统,OA软件,办公自动化软件,开源系统,移动办公软件等信息,解决一体化的办公方案。

免责声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。内容仅供参考使用,不准确地方联系删除处理!

联系邮箱:773537036@qq.com

标签: 源码 分析 llvm