U盘PE| w764位旗舰版下载 | U盘装win7系统 | U盘启动 |win7pe | win10下载 |加入收藏土豆PE官网U盘PE,U盘装win7系统,win7pe,U盘启动,U盘装系统,w764位旗舰版下载站!
当前位置:主页 > 帮助中心 > 土豆PE使用教程 >

llvm libLLVMCore源码分析 08 - Memory Operators

来源:http://www.tudoupe.com时间:2022-03-01

源码路径

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)

示例

Copyright © 2012-2014 Www.tudoupe.Com. 土豆启动 版权所有 意见建议:tdsky@tudoupe.com

土豆系统,土豆PE,win7系统下载,win7 64位旗舰版下载,u盘启动,u盘装系统,win10下载,win10正式版下载,win10 RTM正式版下载,win8下载,电脑蓝屏,IE11修复,网络受限,4K对齐,双系统,隐藏分区,系统安装不了,U盘装系统,笔记本装系统,台式机装系统,diskgenius运用,GHSOT装系统,U盘修复,U盘技巧,U盘速度,U盘不能格式化,U盘复制发生错误,U盘加密,U盘选购,开机黑屏,蓝屏,进不了系统,上不了网,打不开程序,点击无反应,系统设置,PE个性化,PE添加网络,PE维护系统

点击这里给我发消息