diff options
author | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-05-22 10:39:03 +0000 |
---|---|---|
committer | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-05-22 10:39:03 +0000 |
commit | 34a60aa2c3ff2a37a0ad1cc39065c8f6ebb73a4a (patch) | |
tree | 7548e1ba9721293c6bf1e352e1d0edbe58ea1a3c /libgcc | |
parent | eb1cea71ff53182b44704597c94567e6a357db88 (diff) | |
download | gcc-34a60aa2c3ff2a37a0ad1cc39065c8f6ebb73a4a.tar.gz |
* config/sparc/sol2-unwind.h (sparc64_frob_update_context): Do it for
signal frames as well.
(MD_FALLBACK_FRAME_STATE_FOR): Do minor cleanups throughout and add the
STACK_BIAS to the CFA offset.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@199191 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgcc')
-rw-r--r-- | libgcc/ChangeLog | 7 | ||||
-rw-r--r-- | libgcc/config/sparc/sol2-unwind.h | 24 |
2 files changed, 16 insertions, 15 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 2617c7e0607..a1bd0bffc3b 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,10 @@ +2013-05-22 Eric Botcazou <ebotcazou@adacore.com> + + * config/sparc/sol2-unwind.h (sparc64_frob_update_context): Do it for + signal frames as well. + (MD_FALLBACK_FRAME_STATE_FOR): Do minor cleanups throughout and add the + STACK_BIAS to the CFA offset. + 2013-05-17 Richard Henderson <rth@redhat.com> PR target/49146 diff --git a/libgcc/config/sparc/sol2-unwind.h b/libgcc/config/sparc/sol2-unwind.h index 0605332d2f6..584a9b09666 100644 --- a/libgcc/config/sparc/sol2-unwind.h +++ b/libgcc/config/sparc/sol2-unwind.h @@ -155,12 +155,10 @@ sparc64_frob_update_context (struct _Unwind_Context *context, { /* The column of %sp contains the old CFA, not the old value of %sp. The CFA offset already comprises the stack bias so, when %sp is the - CFA register, we must avoid counting the stack bias twice. Do not - do that for signal frames as the offset is artificial for them. */ + CFA register, we must avoid counting the stack bias twice. */ if (fs->regs.cfa_reg == __builtin_dwarf_sp_column () && fs->regs.cfa_how == CFA_REG_OFFSET - && fs->regs.cfa_offset != 0 - && !fs->signal_frame) + && fs->regs.cfa_offset != 0) { long i; @@ -296,9 +294,8 @@ MD_FALLBACK_FRAME_STATE_FOR (struct _Unwind_Context *context, _Unwind_FrameState *fs) { void *pc = context->ra; - struct frame *fp = (struct frame *) context->cfa; - int nframes; void *this_cfa = context->cfa; + int nframes = 0; long new_cfa; void *ra_location, *shifted_ra_location; mcontext_t *mctx; @@ -318,21 +315,22 @@ MD_FALLBACK_FRAME_STATE_FOR (struct _Unwind_Context *context, return _URC_NO_REASON; } + /* Do some pattern matching at the return address. */ if (IS_SIGHANDLER (pc, this_cfa, &nframes)) { + struct frame *fp = (struct frame *) this_cfa; struct handler_args { struct frame frwin; ucontext_t ucontext; } *handler_args; ucontext_t *ucp; - /* context->cfa points into the frame after the saved frame pointer and + /* this_cfa points into the frame after the saved frame pointer and saved pc (struct frame). The ucontext_t structure is in the kernel frame after a struct frame. Since the frame sizes vary even within OS releases, we need to walk the stack to get there. */ - for (i = 0; i < nframes; i++) fp = (struct frame *) ((char *)fp->fr_savfp + STACK_BIAS); @@ -340,19 +338,15 @@ MD_FALLBACK_FRAME_STATE_FOR (struct _Unwind_Context *context, ucp = &handler_args->ucontext; mctx = &ucp->uc_mcontext; } - - /* Exit if the pattern at the return address does not match the - previous three patterns. */ else return _URC_END_OF_STACK; - new_cfa = mctx->gregs[REG_SP]; /* The frame address is %sp + STACK_BIAS in 64-bit mode. */ - new_cfa += STACK_BIAS; + new_cfa = mctx->gregs[REG_SP] + STACK_BIAS; fs->regs.cfa_how = CFA_REG_OFFSET; fs->regs.cfa_reg = __builtin_dwarf_sp_column (); - fs->regs.cfa_offset = new_cfa - (long) this_cfa; + fs->regs.cfa_offset = new_cfa - (long) this_cfa + STACK_BIAS; /* Restore global and out registers (in this order) from the ucontext_t structure, uc_mcontext.gregs field. */ @@ -372,7 +366,7 @@ MD_FALLBACK_FRAME_STATE_FOR (struct _Unwind_Context *context, for (i = 0; i < 16; i++) { fs->regs.reg[i + 16].how = REG_SAVED_OFFSET; - fs->regs.reg[i + 16].loc.offset = i*sizeof(long); + fs->regs.reg[i + 16].loc.offset = i * sizeof(long); } /* Check whether we need to restore FPU registers. */ |