summaryrefslogtreecommitdiff
path: root/libgcc/unwind.inc
diff options
context:
space:
mode:
Diffstat (limited to 'libgcc/unwind.inc')
-rw-r--r--libgcc/unwind.inc34
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);
}