有人可以向我解释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 ?? 如何识别它跳转的标签?
答案 0 :(得分:2)
<强>语法强>
<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”用于提醒基本块的作用。