summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2002-03-15 10:18:21 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2002-03-15 10:18:21 +0000
commit9081a51e986b6d0a308793e137d21355f3f184cf (patch)
tree11521398006c65e3f25600bd6197110990c7bbc5
parent511fa697095b1912fce172d91909aa1cb8657aed (diff)
downloadgcc-9081a51e986b6d0a308793e137d21355f3f184cf.tar.gz
add comments
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@50805 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/unwind-dw2.c14
-rw-r--r--gcc/unwind.inc7
2 files changed, 19 insertions, 2 deletions
diff --git a/gcc/unwind-dw2.c b/gcc/unwind-dw2.c
index d3828e97ad4..e873f50d8cc 100644
--- a/gcc/unwind-dw2.c
+++ b/gcc/unwind-dw2.c
@@ -48,7 +48,9 @@
#define PRE_GCC3_DWARF_FRAME_REGISTERS DWARF_FRAME_REGISTERS
#endif
-/* This is the register and unwind state for a particular frame. */
+/* This is the register and unwind state for a particular frame. This
+ provides the information necessary to unwind up past a frame and return
+ to its caller. */
struct _Unwind_Context
{
void *reg[DWARF_FRAME_REGISTERS+1];
@@ -889,6 +891,11 @@ execute_cfa_program (const unsigned char *insn_ptr,
}
}
+/* Given the _Unwind_Context CONTEXT for a stack frame, look up the FDE for
+ its caller and decode it into FS. This function also sets the
+ args_size and lsda members of CONTEXT, as they are really information
+ about the caller's frame. */
+
static _Unwind_Reason_Code
uw_frame_state_for (struct _Unwind_Context *context, _Unwind_FrameState *fs)
{
@@ -1083,6 +1090,11 @@ uw_update_context_1 (struct _Unwind_Context *context, _Unwind_FrameState *fs)
}
}
+/* CONTEXT describes the unwind state for a frame, and FS describes the FDE
+ of its caller. Update CONTEXT to refer to the caller as well. Note
+ that the args_size and lsda members are not updated here, but later in
+ uw_frame_state_for. */
+
static void
uw_update_context (struct _Unwind_Context *context, _Unwind_FrameState *fs)
{
diff --git a/gcc/unwind.inc b/gcc/unwind.inc
index f00441ea024..0422cb81a03 100644
--- a/gcc/unwind.inc
+++ b/gcc/unwind.inc
@@ -72,7 +72,6 @@ _Unwind_RaiseException_Phase2(struct _Unwind_Exception *exc,
return code;
}
-
/* Raise an exception, passing along the given exception object. */
_Unwind_Reason_Code
@@ -81,6 +80,7 @@ _Unwind_RaiseException(struct _Unwind_Exception *exc)
struct _Unwind_Context this_context, cur_context;
_Unwind_Reason_Code code;
+ /* Set up this_context to describe the current stack frame. */
uw_init_context (&this_context);
cur_context = this_context;
@@ -90,6 +90,8 @@ _Unwind_RaiseException(struct _Unwind_Exception *exc)
{
_Unwind_FrameState fs;
+ /* Set up fs to describe the FDE for the caller of cur_context. The
+ first time through the loop, that means __cxa_throw. */
code = uw_frame_state_for (&cur_context, &fs);
if (code == _URC_END_OF_STACK)
@@ -112,6 +114,7 @@ _Unwind_RaiseException(struct _Unwind_Exception *exc)
return _URC_FATAL_PHASE1_ERROR;
}
+ /* Update cur_context to describe the same frame as fs. */
uw_update_context (&cur_context, &fs);
}
@@ -144,6 +147,7 @@ _Unwind_ForcedUnwind_Phase2(struct _Unwind_Exception *exc,
_Unwind_FrameState fs;
int action;
+ /* Set up fs to describe the FDE for the caller of cur_context. */
code = uw_frame_state_for (context, &fs);
if (code != _URC_NO_REASON && code != _URC_END_OF_STACK)
return _URC_FATAL_PHASE2_ERROR;
@@ -172,6 +176,7 @@ _Unwind_ForcedUnwind_Phase2(struct _Unwind_Exception *exc,
return _URC_FATAL_PHASE2_ERROR;
}
+ /* Update cur_context to describe the same frame as fs. */
uw_update_context (context, &fs);
}