Next: , Previous: Frame Layout, Up: Stack and Calling


17.10.2 对异常处理的支持

— Macro: EH_RETURN_DATA_REGNO (N)

一个C表达式,其值为第N个寄存器的编号,用于异常处理的数据, 或者为INVALID_REGNUM,如果小于N个寄存器可用。

异常处理库程序与异常处理者通过一套协定好的寄存器来通讯。理想的, 这些寄存器应该为调用破坏的;可以使用调用保存的寄存器, 但可能会对代码大小产生负影响。target必须支持至少两个数据寄存器, 但如果有足够的可用的寄存器,则应该定义为4。

你必须定义该宏,如果你想支持像DWARF 2提供的调用帧异常处理。

— Macro: EH_RETURN_STACKADJ_RTX

一个C表达式,其值为RTL,表示一个位置,用来存储栈调整,在函数返回前应用。 这用于unwind栈到一个异常处理的调用帧中。其将被赋予0在通常的返回代码路径上。

通常这是一个调用破坏的硬件寄存器,但也可以为一个栈槽。

不要定义该宏,如果栈指针在调用帧本身通过序言和尾声来保存和恢复时; 这种情况下,异常处理库函数将更新栈位置并保存。否则,你必须定义该宏, 如果你想支持调用帧异常处理,就像DWARF2提供的那样。

— Macro: EH_RETURN_HANDLER_RTX

一个C表达式,其值为一个RTL,表示一个位置,用来存储我们应该返回的异常处理的地址。 其在通常的返回的代码路径上将不被赋值。

通常这是在调用帧中通常返回地址存储的位置。对于通过在栈中弹出地址的target, 这可以为一个内存地址,就在target调用帧的下面,而不是在当前调用帧中。 如果被定义,EH_RETURN_STACKADJ_RTX将已经被赋值, 所以其可以用于计算target调用帧的位置。

一些target具有更加复杂的要求,比在初始化代码生成阶段存储到地址中。 这种情况下,要替代的使用eh_return指令模式。

如果你想支持调用帧异常处理,你必须定义该宏或者eh_return指令模式。

— Macro: RETURN_ADDR_OFFSET

如果定义,则为一个整数值的C表达式,并会为此生成rtl来加上异常处理地址, 在其在异常处理表中搜索之前,并且再减去它,在用它来返回到异常处理之前。

— Macro: ASM_PREFERRED_EH_DATA_FORMAT (code, global)

该宏选择在异常处理section中嵌入的指针的解码。如果尽可能,该宏应该被定义, 这样异常处理section将不会要求进行动态重定位,并可以为只读的。

code为0,对于数据,1对于代码标号,2对于函数指针。 global为真,如果符号可以由动态重定位影响。 宏应该返回在dwarf2.h中可以找到的DW_EH_PE_*的组合。

如果该宏没有定义,则指针将不被解码,而是直接表示。

— Macro: ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX (file, encoding, size, addr, done)

该宏允许target生成特定的magic, 用于表示ASM_PREFERRED_EH_DATA_FORMAT选择的encoding。 通常代码考虑pc-relative和indirect解码; 如果target使用text-relative或者data-relative解码,则必须定义该宏。

这是一个C语句,如果格式被处理,则执行分支跳转。encoding为选择的格式, size为格式占用的字节数,addr为生成的SYMBOL_REF

— Macro: MD_UNWIND_SUPPORT

一个字符串,指定了文件在unwind-dw2.c中被#include包含进来。 被包含进来的文件通常定义了MD_FALLBACK_FRAME_STATE_FOR

— Macro: MD_FALLBACK_FRAME_STATE_FOR (context, fs)

该宏允许target增加CPU和操作系统特定代码到call-frame unwinder, 用于当没有unwind数据可用时。最常见的原因是实现该宏来通过signal帧来unwind。

该宏由unwind-dw2.c, unwind-dw2-xtensa.cunwind-ia64.c中的 uw_frame_state_for调用。context为一个_Unwind_Contextfs为一个_Unwind_FrameState。检查context->ra来得到被执行的 代码的地址,检查context->cfa来得到栈指针的值。如果帧可以被解码, 则寄存器保存地址应该在fs中更新,并且宏应该求值为_URC_NO_REASON。 如果帧不能被解码,则宏应该求解为_URC_END_OF_STACK

对于java中合适的信号处理,该宏通过MAKE_THROW_FRAME来应用, 在libjava/include/*-signal.h中定义。

— Macro: MD_HANDLE_UNWABI (context, fs)

该宏允许target增加操作系统特定的代码到调用帧unwinder, 来处理IA-64 .unwabi unwinding伪指令,通常用于signal或者interrrupt帧。

该宏由unwind-ia64.c中的uw_update_context调用。 context为一个_Unwind_Contextfs为一个_Unwind_FrameState。检查fs->unwabi来得到abi。 如果.unwabi伪指令可以被处理,则寄存器保存地址应该在fs中更新。

— Macro: TARGET_USES_WEAK_UNWIND_INFO

一个C表达式,计算为真,如果target需要unwind info给定comdat linkage。 定义其为1,如果comdat linkage有必要。缺省为0