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 <[EMAIL PROTECTED]> * 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))? -- Daniel Jacobowitz CodeSourcery