I'm trying to track down why unwinding through a signal frame crashes
on MIPS n32. David, I'm pretty sure you introduced the crash here:
2006-11-20 David Daney <ddaney@avtrex.com>
* config/mips/linux-unwind.h (mips_fallback_frame_state): Adjust
PC to point to following instruction.
There's two problems with this patch. One is that it's just broken
for N64; you're loading the PC as a u_int32_t. The other is that it
triggers an assertion in the unwinder for n32.
_Unwind_SetGRValue does this:
258 gcc_assert (dwarf_reg_size_table[index] == sizeof (_Unwind_Ptr));
259
260 context->by_value[index] = 1;
261 context->reg[index] = (void *) (_Unwind_Internal_Ptr) val;
context->reg[index] is a void *. On N32, general registers are 64-bit
but pointers are 32-bit. So if we get here, the assertion is almost
sure to trigger. REG_SAVED_VAL_OFFSET brings us here. Does anyone
see a way to fix this that doesn't involve making context->reg big
enough - and is _Unwind_Word always at least as large as _Unwind_Ptr
(i.e. mode(word) always at least as large as mode(pointer))?