2014-03-05 152 views
2

有人可以向我解释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? 如何识别它跳转的标签?

回答

2

LLVM Language Reference

语法

​​

概述

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

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