源码路径
llvm\include\llvm\IR\Instruction.h
llvm\include\llvm\IR\Instruction.def
llvm\include\llvm\IR\Instructions.h
llvm\include\llvm\IR\InstrTypes.h
Terminator Instructions
Terminator指令用于指示当前BasicBlock的结尾,并指示下一个要执行的BasicBlock。
ReturnInst(父类:Instruction)
ret指令用于将控制流从函数中返回到函数调用者(caller)。
语法
ret <type> <value> ; Return a value from a non-void function
ret void ; Return from void function
语义
如果调用者通过call指令调用当前函数,控制流返回到call指令的下一条指令;
如果调用者通过invoke指令调用当前函数,控制流返回正常目的的BasicBlock的起始。
如果有返回value,则将call或者invoke指令的返回值置为value。
示例
ret i32 5 ; Return an integer value of 5
ret void ; Return from a void function
ret { i32, i8 } { i32 4, i8 2 } ; Return a struct of values 4 and 2
BranchInst(父类:Instruction)
br指令用于将控制流转移到当前函数的另一个BasicBlock,分为条件跳转和无条件跳转两种。
语法
br i1 <cond>, label <iftrue>, label <iffalse>
br label <dest> ; Unconditional branch
语义
条件跳转指令:先计算参数i1的值,如果是true,则控制流跳转到iftrue label;如果是false,则控制流跳转到iffalse label。
示例
Test:
%cond = icmp eq i32 %a, %b
br i1 %cond, label %IfEqual, label %IfUnequal
IfEqual:
ret i32 1
IfUnequal:
ret i32 0
SwitchInst(父类:Instruction)
switch指令用于将控制流转移到多处目的地中的某一处。
语法
switch <intty> <value>, label <defaultdest> [ <intty> <val>, label <dest> ... ]
语义
switch指令指定了一个值和指令跳转目的地的映射表。指令执行时,会在表中搜索给定的值。如果找到了,则控制流会跳转到对应的目的地,否则会跳转到默认的目的地。
示例
; Emulate a conditional br instruction
%Val = zext i1 %value to i32
switch i32 %Val, label %truedest [ i32 0, label %falsedest ]
; Emulate an unconditional br instruction
switch i32 0, label %dest [ ]
; Implement a jump table:
switch i32 %val, label %otherwise [ i32 0, label %onzero
i32 1, label %onone
i32 2, label %ontwo ]
IndirectBrInst(父类:Instruction)
indirectbr指令用于间接跳转到当前函数内的某个地址为address的label,可能的label集合在列表中给出(用于CFG)。
语法
indirectbr <somety>* <address>, [ label <dest1>, label <dest2>, ... ]
语义
控制流跳转到address指定的label。
示例
indirectbr i8* %Addr, [ label %bb1, label %bb2, label %bb3 ]
InvokeInst(父类:CallBase)
invoke指令用于将控制流转移到一个指定的函数。若该函数通过ret指令返回,则控制流跳转到normal label;若该函数通过resume指令或者其他异常处理机制返回,则控制流跳转到最近的exception label。exception label中,必须要有landingpad指令,指示程序栈展开之后的行为。
语法
<result> = invoke [cconv] [ret attrs] [addrspace(<num>)] <ty>|<fnty> <fnptrval>(<function args>) [fn attrs]
[operand bundles] to label <normal label> unwind label <exception label>
参数说明:
- cconv(可选):指示调用约定(calling conventions),如果不制定则默认使用C的调用约定。
- ret attrs(可选):返回值的属性列表,可选的属性:
zeroext/signext/inreg
- addrspace(可选):被调用函数的地址空间,如果不指定则使用datalayout中的值。
- ty:被调用函数返回值的类型。
- fnty:被调用函数的函数签名。
- fnptrval:被调用函数的指针。
- function args:被调用函数的参数列表,与函数签名相匹配。
- fn attrs(可选):函数属性列表。
- operand bundles(可选):参数的标签集。
- normal label:被调用函数使用ret指令返回时跳转到的label。
- exception label:被调用函数使用resume或者其他异常处理机制返回时跳转到的label。
语义
指令大部分功能和call类似,主要的区别是建立了一系列的label,被运行时用作栈展开,用于支持高级语言实现catch功能等用途。
示例
%retval = invoke i32 @Test(i32 15) to label %Continue
unwind label %TestCleanup ; i32:retval set
%retval = invoke coldcc i32 %Testfnptr(i32 15) to label %Continue
unwind label %TestCleanup ; i32:retval set
CallBrInst(父类:CallBase)
callbr指令用于将控制流转移到一个指定的函数,从函数返回时,可能是fallthrough继续往下执行,也可能跳转到indirect label指定的label。注意:当前该指令仅用于带goto的内联汇编。
语法
<result> = callbr [cconv] [ret attrs] [addrspace(<num>)] <ty>|<fnty> <fnptrval>(<function args>) [fn attrs]
[operand bundles] to label <fallthrough label> [indirect labels]
语义
指令大部分功能和call类似,主要的区别是建立了一系列的label,用于定义call结束之后控制流可能跳转到的label。
示例
; "asm goto" without output constraints.
callbr void asm "", "r,X"(i32 %x, i8 *blockaddress(@foo, %indirect))
to label %fallthrough [label %indirect]
; "asm goto" with output constraints.
<result> = callbr i32 asm "", "=r,r,X"(i32 %x, i8 *blockaddress(@foo, %indirect))
to label %fallthrough [label %indirect]
UnreachableInst(父类:Instruction)
指令用于通知优化器这个部分的代码是不可达的。
语法
unreachable
语义
指令没有语义。
CatchSwitchInst(父类:Instruction)
用于WINDOWS运行时异常处理,不做介绍。
CatchReturnInst(父类:Instruction)
用于WINDOWS运行时异常处理,不做介绍。
CleanupReturnInst(父类:Instruction)
用于WINDOWS运行时异常处理,不做介绍。