diff --git a/external/gpl3/gcc.old/dist/libgcc/unwind-dw2.c b/external/gpl3/gcc.old/dist/libgcc/unwind-dw2.c index 3d0eb1ecd086..ac562777c63a 100644 --- a/external/gpl3/gcc.old/dist/libgcc/unwind-dw2.c +++ b/external/gpl3/gcc.old/dist/libgcc/unwind-dw2.c @@ -1257,11 +1257,25 @@ uw_frame_state_for (struct _Unwind_Context *context, _Unwind_FrameState *fs) context->args_size = 0; context->lsda = 0; - if (context->ra == 0) - return _URC_END_OF_STACK; - fde = _Unwind_Find_FDE (context->ra + _Unwind_IsSignalFrame (context) - 1, &context->bases); + if (fde == NULL + && _Unwind_IsSignalFrame (context)) + { + /* XXX verify it's an appropriate kind of signal frame */ +#if defined __x86_64__ + void *const *rsp = (const void *) + _Unwind_GetGR (context, __builtin_dwarf_sp_column ()); + void *ra = rsp[0]; /* XXX how to validate rsp? */ +#elif defined __aarch64__ + void *ra = _Unwind_GetGR (context, R_LR); /* XXX untested */ +#else +# error XXX +#endif + fde = _Unwind_Find_FDE (ra, &context->bases); + if (fde != NULL) /* XXX necessary? */ + context->ra = ra; + } if (fde == NULL) { #ifdef MD_FALLBACK_FRAME_STATE_FOR @@ -1546,6 +1560,22 @@ uw_update_context (struct _Unwind_Context *context, _Unwind_FrameState *fs) ret_addr = _Unwind_GetPtr (context, fs->retaddr_column); #endif context->ra = __builtin_extract_return_addr (ret_addr); + if (0 && _Unwind_IsSignalFrame (context) + && _Unwind_FindEnclosingFunction (context->ra) == NULL) + { + /* XXX verify it's an appropriate kind of signal frame */ +#if defined __x86_64__ + void *const *rsp = (const void *) + _Unwind_GetGR (context, __builtin_dwarf_sp_column ()); + void *ra = rsp[0]; /* XXX how to validate rsp? */ +#elif defined __aarch64__ + void *ra = _Unwind_GetGR (context, R_LR); /* XXX untested */ +#else +# error XXX +#endif + if (_Unwind_FindEnclosingFunction (ra) != NULL) /* XXX necessary? */ + context->ra = ra; + } } }