diff options
Diffstat (limited to 'libgcc/unwind.inc')
-rw-r--r-- | libgcc/unwind.inc | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/libgcc/unwind.inc b/libgcc/unwind.inc index 658bd94f8f3..a98154b1b72 100644 --- a/libgcc/unwind.inc +++ b/libgcc/unwind.inc @@ -36,9 +36,11 @@ static _Unwind_Reason_Code _Unwind_RaiseException_Phase2(struct _Unwind_Exception *exc, - struct _Unwind_Context *context) + struct _Unwind_Context *context, + unsigned long *frames_p) { _Unwind_Reason_Code code; + unsigned long frames = 1; while (1) { @@ -71,8 +73,10 @@ _Unwind_RaiseException_Phase2(struct _Unwind_Exception *exc, gcc_assert (!match_handler); uw_update_context (context, &fs); + frames++; } + *frames_p = frames; return code; } @@ -83,6 +87,7 @@ _Unwind_RaiseException(struct _Unwind_Exception *exc) { struct _Unwind_Context this_context, cur_context; _Unwind_Reason_Code code; + unsigned long frames; /* Set up this_context to describe the current stack frame. */ uw_init_context (&this_context); @@ -128,11 +133,11 @@ _Unwind_RaiseException(struct _Unwind_Exception *exc) exc->private_2 = uw_identify_context (&cur_context); cur_context = this_context; - code = _Unwind_RaiseException_Phase2 (exc, &cur_context); + code = _Unwind_RaiseException_Phase2 (exc, &cur_context, &frames); if (code != _URC_INSTALL_CONTEXT) return code; - uw_install_context (&this_context, &cur_context); + uw_install_context (&this_context, &cur_context, frames); } @@ -140,11 +145,13 @@ _Unwind_RaiseException(struct _Unwind_Exception *exc) static _Unwind_Reason_Code _Unwind_ForcedUnwind_Phase2 (struct _Unwind_Exception *exc, - struct _Unwind_Context *context) + struct _Unwind_Context *context, + unsigned long *frames_p) { _Unwind_Stop_Fn stop = (_Unwind_Stop_Fn) (_Unwind_Ptr) exc->private_1; void *stop_argument = (void *) (_Unwind_Ptr) exc->private_2; _Unwind_Reason_Code code, stop_code; + unsigned long frames = 1; while (1) { @@ -183,8 +190,10 @@ _Unwind_ForcedUnwind_Phase2 (struct _Unwind_Exception *exc, /* Update cur_context to describe the same frame as fs, and discard the previous context if necessary. */ uw_advance_context (context, &fs); + frames++; } + *frames_p = frames; return code; } @@ -197,6 +206,7 @@ _Unwind_ForcedUnwind (struct _Unwind_Exception *exc, { struct _Unwind_Context this_context, cur_context; _Unwind_Reason_Code code; + unsigned long frames; uw_init_context (&this_context); cur_context = this_context; @@ -204,11 +214,11 @@ _Unwind_ForcedUnwind (struct _Unwind_Exception *exc, exc->private_1 = (_Unwind_Ptr) stop; exc->private_2 = (_Unwind_Ptr) stop_argument; - code = _Unwind_ForcedUnwind_Phase2 (exc, &cur_context); + code = _Unwind_ForcedUnwind_Phase2 (exc, &cur_context, &frames); if (code != _URC_INSTALL_CONTEXT) return code; - uw_install_context (&this_context, &cur_context); + uw_install_context (&this_context, &cur_context, frames); } @@ -220,6 +230,7 @@ _Unwind_Resume (struct _Unwind_Exception *exc) { struct _Unwind_Context this_context, cur_context; _Unwind_Reason_Code code; + unsigned long frames; uw_init_context (&this_context); cur_context = this_context; @@ -227,13 +238,13 @@ _Unwind_Resume (struct _Unwind_Exception *exc) /* Choose between continuing to process _Unwind_RaiseException or _Unwind_ForcedUnwind. */ if (exc->private_1 == 0) - code = _Unwind_RaiseException_Phase2 (exc, &cur_context); + code = _Unwind_RaiseException_Phase2 (exc, &cur_context, &frames); else - code = _Unwind_ForcedUnwind_Phase2 (exc, &cur_context); + code = _Unwind_ForcedUnwind_Phase2 (exc, &cur_context, &frames); gcc_assert (code == _URC_INSTALL_CONTEXT); - uw_install_context (&this_context, &cur_context); + uw_install_context (&this_context, &cur_context, frames); } @@ -245,6 +256,7 @@ _Unwind_Resume_or_Rethrow (struct _Unwind_Exception *exc) { struct _Unwind_Context this_context, cur_context; _Unwind_Reason_Code code; + unsigned long frames; /* Choose between continuing to process _Unwind_RaiseException or _Unwind_ForcedUnwind. */ @@ -254,11 +266,11 @@ _Unwind_Resume_or_Rethrow (struct _Unwind_Exception *exc) uw_init_context (&this_context); cur_context = this_context; - code = _Unwind_ForcedUnwind_Phase2 (exc, &cur_context); + code = _Unwind_ForcedUnwind_Phase2 (exc, &cur_context, &frames); gcc_assert (code == _URC_INSTALL_CONTEXT); - uw_install_context (&this_context, &cur_context); + uw_install_context (&this_context, &cur_context, frames); } |