llvm libLLVMCore源码分析 06 - Terminator Instructions

源码路径

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运行时异常处理,不做介绍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值