Next: Stack Checking, Previous: Frame Layout, Up: Stack and Calling
一个C表达式,其值为第N个寄存器的编号,用于异常处理的数据, 或者为
INVALID_REGNUM
,如果小于N个寄存器可用。异常处理库程序与异常处理者通过一套协定好的寄存器来通讯。理想的, 这些寄存器应该为调用破坏的;可以使用调用保存的寄存器, 但可能会对代码大小产生负影响。target必须支持至少两个数据寄存器, 但如果有足够的可用的寄存器,则应该定义为4。
你必须定义该宏,如果你想支持像DWARF 2提供的调用帧异常处理。
一个C表达式,其值为RTL,表示一个位置,用来存储栈调整,在函数返回前应用。 这用于unwind栈到一个异常处理的调用帧中。其将被赋予0在通常的返回代码路径上。
通常这是一个调用破坏的硬件寄存器,但也可以为一个栈槽。
不要定义该宏,如果栈指针在调用帧本身通过序言和尾声来保存和恢复时; 这种情况下,异常处理库函数将更新栈位置并保存。否则,你必须定义该宏, 如果你想支持调用帧异常处理,就像DWARF2提供的那样。
一个C表达式,其值为一个RTL,表示一个位置,用来存储我们应该返回的异常处理的地址。 其在通常的返回的代码路径上将不被赋值。
通常这是在调用帧中通常返回地址存储的位置。对于通过在栈中弹出地址的target, 这可以为一个内存地址,就在target调用帧的下面,而不是在当前调用帧中。 如果被定义,
EH_RETURN_STACKADJ_RTX
将已经被赋值, 所以其可以用于计算target调用帧的位置。一些target具有更加复杂的要求,比在初始化代码生成阶段存储到地址中。 这种情况下,要替代的使用
eh_return
指令模式。如果你想支持调用帧异常处理,你必须定义该宏或者
eh_return
指令模式。
如果定义,则为一个整数值的C表达式,并会为此生成rtl来加上异常处理地址, 在其在异常处理表中搜索之前,并且再减去它,在用它来返回到异常处理之前。
该宏选择在异常处理section中嵌入的指针的解码。如果尽可能,该宏应该被定义, 这样异常处理section将不会要求进行动态重定位,并可以为只读的。
code为0,对于数据,1对于代码标号,2对于函数指针。 global为真,如果符号可以由动态重定位影响。 宏应该返回在dwarf2.h中可以找到的
DW_EH_PE_*
的组合。如果该宏没有定义,则指针将不被解码,而是直接表示。
该宏允许target生成特定的magic, 用于表示
ASM_PREFERRED_EH_DATA_FORMAT
选择的encoding。 通常代码考虑pc-relative和indirect解码; 如果target使用text-relative或者data-relative解码,则必须定义该宏。这是一个C语句,如果格式被处理,则执行分支跳转。encoding为选择的格式, size为格式占用的字节数,addr为生成的
SYMBOL_REF
。
一个字符串,指定了文件在unwind-dw2.c中被#include包含进来。 被包含进来的文件通常定义了
MD_FALLBACK_FRAME_STATE_FOR
。
该宏允许target增加CPU和操作系统特定代码到call-frame unwinder, 用于当没有unwind数据可用时。最常见的原因是实现该宏来通过signal帧来unwind。
该宏由unwind-dw2.c, unwind-dw2-xtensa.c和unwind-ia64.c中的
uw_frame_state_for
调用。context为一个_Unwind_Context
; fs为一个_Unwind_FrameState
。检查context->ra
来得到被执行的 代码的地址,检查context->cfa
来得到栈指针的值。如果帧可以被解码, 则寄存器保存地址应该在fs中更新,并且宏应该求值为_URC_NO_REASON
。 如果帧不能被解码,则宏应该求解为_URC_END_OF_STACK
。对于java中合适的信号处理,该宏通过
MAKE_THROW_FRAME
来应用, 在libjava/include/*-signal.h中定义。