Next: , Previous: GIMPLE instruction set, Up: GIMPLE


12.3 异常处理

其它异常处理结构使用GIMPLE_TRY_CATCH来表示。GIMPLE_TRY_CATCH有两个操作数。第一个操作数为一个要执行的语句序列。如果执行这些语句并没有抛出异常,则第二个操作数被忽略。否则,如果有异常被抛出,则GIMPLE_TRY_CATCH的第二个操作数将被检查。第二个操作数可以具有以下形式:

  1. 一个要执行的语句序列。当发生异常时,这些语句被执行,然后异常被重新抛出。
  2. 一个GIMPLE_CATCH语句序列。每个GIMPLE_CATCH有一个可适用的异常类型列表和处理代码。如果被抛出的异常匹配其中一个类型,则相关的处理代码被执行。如果处理代码执行到结尾并结束,则在最初的GIMPLE_TRY_CATCH之后继续执行。
  3. 一条GIMPLE_EH_FILTER语句。具有一个允许的异常类型列表,和当匹配失败时的处理代码。如果被抛出的异常不匹配所允许的类型之一,则相关的匹配失败代码会被执行。如果抛出的异常确实匹配,则继续查找下一个处理。

目前抛出异常并不直接用GIMPLE来表示,而是通过调用一个函数来实现。将来的某个时候,我们将增加某种方式来表示抛出已知类型的异常的调用。

就在运行优化器之前,编译器将高级别的EH结构下降为一组‘goto’,魔术标号,以及EH区域。