This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]