This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
DWARF-2 unwinder versus MIPS n32
- From: Daniel Jacobowitz <drow at false dot org>
- To: gcc at gcc dot gnu dot org
- Cc: David Daney <ddaney at avtrex dot com>
- Date: Thu, 7 Jun 2007 11:29:20 -0400
- Subject: DWARF-2 unwinder versus MIPS n32
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))?
--
Daniel Jacobowitz
CodeSourcery