调用指令如何在LLVM中工作?

时间:2014-03-05 16:02:59

标签: llvm invoke

有人可以向我解释llvm如何调用这些作品吗? 我有声明:

invoke void @ _ZN7sc_core9sc_signalIN5sc_dt6sc_intILi16EEEEC1Ev (% "class.sc_core :: sc_signal.57" *% operator1) to label %invoke.cont unwind label %lpad

在我看来,它调用函数然后跳转到标签。但是哪个标签?标签%invoke.cont或标签%lpad ?? 如何识别它跳转的标签?

1 个答案:

答案 0 :(得分:2)

LLVM Language Reference

  

<强>语法

<result> = invoke [cconv] [ret attrs] <ptr to function ty> <function ptr val>(<function args>) [fn attrs]
 to label <normal label> unwind label <exception label>
     

<强>概述

     

'invoke'指令使控制转移到指定的函数,控制流转移到'normal'标签或'exception'标签的可能性。如果被调用函数返回“ret”指令,则控制流将返回“normal”标签。如果被调用者(或任何间接被调用者)通过“resume”指令或其他异常处理机制返回,则控制被中断并在动态最近的“异常”标签处继续。

语法规范将第一个标签标识为普通标签,用于ret,第二个标签用作异常标签,用于例外。这很容易记住,因为术语“展开”是指在抛出异常时执行的清理。因此指令明确标识'展开标签'。并且用于此的代码通常被称为“着陆垫”,因此标签“lpad”用于提醒基本块的作用。