Commit 6673f90b by Nathan Froyd Committed by Nathan Froyd

unwind-dw2.h: Move cfa-related variables into struct frame_state_reg_info to ensure that the...

	* gcc/unwind-dw2.h: Move cfa-related variables into
	struct frame_state_reg_info to ensure that the CFA is properly
	handled when executing DW_CFA_{remember,restore}_state.
	* gcc/unwind-dw2.c, gcc/config/alpha/linux-unwind.h,
	gcc/config/alpha/vms-unwind.h, gcc/config/s390/tpf-unwind.h
	gcc/config/s390/linux-unwind.h, gcc/config/sparc/linux-unwind.h
	gcc/config/i386/linux-unwind.h, gcc/config/sh/linux-unwind.h
	gcc/config/rs6000/linux-unwind.h,
	gcc/config/rs6000/darwin-fallback.c, gcc/config/pa/linux-unwind.h,
	gcc/config/pa/hpux-unwind.h, gcc/config/mips/linux-unwind.h:
	Modify to use new cfa_* fields.

From-SVN: r118068
parent 4bab2b23
2006-10-26 Nathan Froyd <froydnj@codesourcery.com>
* gcc/unwind-dw2.h: Move cfa-related variables into
struct frame_state_reg_info to ensure that the CFA is properly
handled when executing DW_CFA_{remember,restore}_state.
* gcc/unwind-dw2.c, gcc/config/alpha/linux-unwind.h,
gcc/config/alpha/vms-unwind.h, gcc/config/s390/tpf-unwind.h
gcc/config/s390/linux-unwind.h, gcc/config/sparc/linux-unwind.h
gcc/config/i386/linux-unwind.h, gcc/config/sh/linux-unwind.h
gcc/config/rs6000/linux-unwind.h,
gcc/config/rs6000/darwin-fallback.c, gcc/config/pa/linux-unwind.h,
gcc/config/pa/hpux-unwind.h, gcc/config/mips/linux-unwind.h:
Modify to use new cfa_* fields.
2006-10-26 Andreas Krebbel <krebbel1@de.ibm.com> 2006-10-26 Andreas Krebbel <krebbel1@de.ibm.com>
* config/s390/s390.c (s390_init_frame_layout): Check positive * config/s390/s390.c (s390_init_frame_layout): Check positive
......
...@@ -60,9 +60,9 @@ alpha_fallback_frame_state (struct _Unwind_Context *context, ...@@ -60,9 +60,9 @@ alpha_fallback_frame_state (struct _Unwind_Context *context,
else else
return _URC_END_OF_STACK; return _URC_END_OF_STACK;
new_cfa = sc->sc_regs[30]; new_cfa = sc->sc_regs[30];
fs->cfa_how = CFA_REG_OFFSET; fs->regs.cfa_how = CFA_REG_OFFSET;
fs->cfa_reg = 30; fs->regs.cfa_reg = 30;
fs->cfa_offset = new_cfa - (long) context->cfa; fs->regs.cfa_offset = new_cfa - (long) context->cfa;
for (i = 0; i < 30; ++i) for (i = 0; i < 30; ++i)
{ {
fs->regs.reg[i].how = REG_SAVED_OFFSET; fs->regs.reg[i].how = REG_SAVED_OFFSET;
......
...@@ -35,10 +35,10 @@ alpha_fallback_frame_state (struct _Unwind_Context *context, ...@@ -35,10 +35,10 @@ alpha_fallback_frame_state (struct _Unwind_Context *context,
{ {
int i, j; int i, j;
fs->cfa_offset = pv->pdsc$l_size; fs->regs.cfa_offset = pv->pdsc$l_size;
fs->cfa_reg = pv->pdsc$w_flags & PDSC$M_BASE_REG_IS_FP ? 29 : 30; fs->regs.cfa_reg = pv->pdsc$w_flags & PDSC$M_BASE_REG_IS_FP ? 29 : 30;
fs->retaddr_column = 26; fs->retaddr_column = 26;
fs->cfa_how = CFA_REG_OFFSET; fs->regs.cfa_how = CFA_REG_OFFSET;
fs->regs.reg[27].loc.offset = -pv->pdsc$l_size; fs->regs.reg[27].loc.offset = -pv->pdsc$l_size;
fs->regs.reg[27].how = REG_SAVED_OFFSET; fs->regs.reg[27].how = REG_SAVED_OFFSET;
fs->regs.reg[26].loc.offset fs->regs.reg[26].loc.offset
...@@ -57,10 +57,10 @@ alpha_fallback_frame_state (struct _Unwind_Context *context, ...@@ -57,10 +57,10 @@ alpha_fallback_frame_state (struct _Unwind_Context *context,
} }
else if (pv && ((pv->pdsc$w_flags & 0xf) == PDSC$K_KIND_FP_REGISTER)) else if (pv && ((pv->pdsc$w_flags & 0xf) == PDSC$K_KIND_FP_REGISTER))
{ {
fs->cfa_offset = pv->pdsc$l_size; fs->regs.cfa_offset = pv->pdsc$l_size;
fs->cfa_reg = pv->pdsc$w_flags & PDSC$M_BASE_REG_IS_FP ? 29 : 30; fs->regs.cfa_reg = pv->pdsc$w_flags & PDSC$M_BASE_REG_IS_FP ? 29 : 30;
fs->retaddr_column = 26; fs->retaddr_column = 26;
fs->cfa_how = CFA_REG_OFFSET; fs->regs.cfa_how = CFA_REG_OFFSET;
fs->regs.reg[26].loc.reg = pv->pdsc$b_save_ra; fs->regs.reg[26].loc.reg = pv->pdsc$b_save_ra;
fs->regs.reg[26].how = REG_SAVED_REG; fs->regs.reg[26].how = REG_SAVED_REG;
fs->regs.reg[29].loc.reg = pv->pdsc$b_save_fp; fs->regs.reg[29].loc.reg = pv->pdsc$b_save_fp;
......
...@@ -61,10 +61,10 @@ x86_64_fallback_frame_state (struct _Unwind_Context *context, ...@@ -61,10 +61,10 @@ x86_64_fallback_frame_state (struct _Unwind_Context *context,
return _URC_END_OF_STACK; return _URC_END_OF_STACK;
new_cfa = sc->rsp; new_cfa = sc->rsp;
fs->cfa_how = CFA_REG_OFFSET; fs->regs.cfa_how = CFA_REG_OFFSET;
/* Register 7 is rsp */ /* Register 7 is rsp */
fs->cfa_reg = 7; fs->regs.cfa_reg = 7;
fs->cfa_offset = new_cfa - (long) context->cfa; fs->regs.cfa_offset = new_cfa - (long) context->cfa;
/* The SVR4 register numbering macros aren't usable in libgcc. */ /* The SVR4 register numbering macros aren't usable in libgcc. */
fs->regs.reg[0].how = REG_SAVED_OFFSET; fs->regs.reg[0].how = REG_SAVED_OFFSET;
...@@ -151,9 +151,9 @@ x86_fallback_frame_state (struct _Unwind_Context *context, ...@@ -151,9 +151,9 @@ x86_fallback_frame_state (struct _Unwind_Context *context,
return _URC_END_OF_STACK; return _URC_END_OF_STACK;
new_cfa = sc->REG_NAME(esp); new_cfa = sc->REG_NAME(esp);
fs->cfa_how = CFA_REG_OFFSET; fs->regs.cfa_how = CFA_REG_OFFSET;
fs->cfa_reg = 4; fs->regs.cfa_reg = 4;
fs->cfa_offset = new_cfa - (long) context->cfa; fs->regs.cfa_offset = new_cfa - (long) context->cfa;
/* The SVR4 register numbering macros aren't usable in libgcc. */ /* The SVR4 register numbering macros aren't usable in libgcc. */
fs->regs.reg[0].how = REG_SAVED_OFFSET; fs->regs.reg[0].how = REG_SAVED_OFFSET;
......
...@@ -86,9 +86,9 @@ mips_fallback_frame_state (struct _Unwind_Context *context, ...@@ -86,9 +86,9 @@ mips_fallback_frame_state (struct _Unwind_Context *context,
return _URC_END_OF_STACK; return _URC_END_OF_STACK;
new_cfa = (_Unwind_Ptr)sc; new_cfa = (_Unwind_Ptr)sc;
fs->cfa_how = CFA_REG_OFFSET; fs->regs.cfa_how = CFA_REG_OFFSET;
fs->cfa_reg = STACK_POINTER_REGNUM; fs->regs.cfa_reg = STACK_POINTER_REGNUM;
fs->cfa_offset = new_cfa - (_Unwind_Ptr) context->cfa; fs->regs.cfa_offset = new_cfa - (_Unwind_Ptr) context->cfa;
#if _MIPS_SIM == _ABIO32 && defined __MIPSEB__ #if _MIPS_SIM == _ABIO32 && defined __MIPSEB__
/* On o32 Linux, the register save slots in the sigcontext are /* On o32 Linux, the register save slots in the sigcontext are
......
...@@ -147,9 +147,9 @@ pa_fallback_frame_state (struct _Unwind_Context *context, ...@@ -147,9 +147,9 @@ pa_fallback_frame_state (struct _Unwind_Context *context,
&& *(pc + 0) == 0x4bc23fd1 /* ldw -18(sp),rp */ && *(pc + 0) == 0x4bc23fd1 /* ldw -18(sp),rp */
&& *(pc + 1) == 0xe840d002)) /* bve,n (rp) */ && *(pc + 1) == 0xe840d002)) /* bve,n (rp) */
{ {
fs->cfa_how = CFA_REG_OFFSET; fs->regs.cfa_how = CFA_REG_OFFSET;
fs->cfa_reg = 30; fs->regs.cfa_reg = 30;
fs->cfa_offset = 0; fs->regs.cfa_offset = 0;
fs->retaddr_column = 0; fs->retaddr_column = 0;
fs->regs.reg[0].how = REG_SAVED_OFFSET; fs->regs.reg[0].how = REG_SAVED_OFFSET;
...@@ -167,9 +167,9 @@ pa_fallback_frame_state (struct _Unwind_Context *context, ...@@ -167,9 +167,9 @@ pa_fallback_frame_state (struct _Unwind_Context *context,
&& (*(pc + 1) == 0xe840c002 /* bv,n r0(rp) */ && (*(pc + 1) == 0xe840c002 /* bv,n r0(rp) */
|| *(pc + 1) == 0xe840d002)) /* bve,n (rp) */ || *(pc + 1) == 0xe840d002)) /* bve,n (rp) */
{ {
fs->cfa_how = CFA_REG_OFFSET; fs->regs.cfa_how = CFA_REG_OFFSET;
fs->cfa_reg = 30; fs->regs.cfa_reg = 30;
fs->cfa_offset = 0; fs->regs.cfa_offset = 0;
fs->retaddr_column = 0; fs->retaddr_column = 0;
fs->regs.reg[0].how = REG_SAVED_OFFSET; fs->regs.reg[0].how = REG_SAVED_OFFSET;
...@@ -239,9 +239,9 @@ pa_fallback_frame_state (struct _Unwind_Context *context, ...@@ -239,9 +239,9 @@ pa_fallback_frame_state (struct _Unwind_Context *context,
long new_cfa = GetSSReg (mc, ss_sp); long new_cfa = GetSSReg (mc, ss_sp);
fs->cfa_how = CFA_REG_OFFSET; fs->regs.cfa_how = CFA_REG_OFFSET;
fs->cfa_reg = 30; fs->regs.cfa_reg = 30;
fs->cfa_offset = new_cfa - (long) context->cfa; fs->regs.cfa_offset = new_cfa - (long) context->cfa;
UPDATE_FS_FOR_GR (fs, 1, 1); UPDATE_FS_FOR_GR (fs, 1, 1);
UPDATE_FS_FOR_GR (fs, 2, 2); UPDATE_FS_FOR_GR (fs, 2, 2);
......
...@@ -111,9 +111,9 @@ pa32_fallback_frame_state (struct _Unwind_Context *context, ...@@ -111,9 +111,9 @@ pa32_fallback_frame_state (struct _Unwind_Context *context,
sc = &frame->uc.uc_mcontext; sc = &frame->uc.uc_mcontext;
new_cfa = sc->sc_gr[30]; new_cfa = sc->sc_gr[30];
fs->cfa_how = CFA_REG_OFFSET; fs->regs.cfa_how = CFA_REG_OFFSET;
fs->cfa_reg = 30; fs->regs.cfa_reg = 30;
fs->cfa_offset = new_cfa - (long) context->cfa; fs->regs.cfa_offset = new_cfa - (long) context->cfa;
for (i = 1; i <= 31; i++) for (i = 1; i <= 31; i++)
{ {
fs->regs.reg[i].how = REG_SAVED_OFFSET; fs->regs.reg[i].how = REG_SAVED_OFFSET;
......
...@@ -421,9 +421,9 @@ handle_syscall (_Unwind_FrameState *fs, const reg_unit gprs[32], ...@@ -421,9 +421,9 @@ handle_syscall (_Unwind_FrameState *fs, const reg_unit gprs[32],
return_addr = m->srr0; return_addr = m->srr0;
} }
fs->cfa_how = CFA_REG_OFFSET; fs->regs.cfa_how = CFA_REG_OFFSET;
fs->cfa_reg = STACK_POINTER_REGNUM; fs->regs.cfa_reg = STACK_POINTER_REGNUM;
fs->cfa_offset = new_cfa - old_cfa;; fs->regs.cfa_offset = new_cfa - old_cfa;;
/* The choice of column for the return address is somewhat tricky. /* The choice of column for the return address is somewhat tricky.
Fortunately, the actual choice is private to this file, and Fortunately, the actual choice is private to this file, and
......
...@@ -232,9 +232,9 @@ ppc_fallback_frame_state (struct _Unwind_Context *context, ...@@ -232,9 +232,9 @@ ppc_fallback_frame_state (struct _Unwind_Context *context,
return _URC_END_OF_STACK; return _URC_END_OF_STACK;
new_cfa = regs->gpr[STACK_POINTER_REGNUM]; new_cfa = regs->gpr[STACK_POINTER_REGNUM];
fs->cfa_how = CFA_REG_OFFSET; fs->regs.cfa_how = CFA_REG_OFFSET;
fs->cfa_reg = STACK_POINTER_REGNUM; fs->regs.cfa_reg = STACK_POINTER_REGNUM;
fs->cfa_offset = new_cfa - (long) context->cfa; fs->regs.cfa_offset = new_cfa - (long) context->cfa;
for (i = 0; i < 32; i++) for (i = 0; i < 32; i++)
if (i != STACK_POINTER_REGNUM) if (i != STACK_POINTER_REGNUM)
......
...@@ -101,9 +101,9 @@ s390_fallback_frame_state (struct _Unwind_Context *context, ...@@ -101,9 +101,9 @@ s390_fallback_frame_state (struct _Unwind_Context *context,
} }
new_cfa = regs->gprs[15] + 16*sizeof(long) + 32; new_cfa = regs->gprs[15] + 16*sizeof(long) + 32;
fs->cfa_how = CFA_REG_OFFSET; fs->regs.cfa_how = CFA_REG_OFFSET;
fs->cfa_reg = 15; fs->regs.cfa_reg = 15;
fs->cfa_offset = fs->regs.cfa_offset =
new_cfa - (long) context->cfa + 16*sizeof(long) + 32; new_cfa - (long) context->cfa + 16*sizeof(long) + 32;
for (i = 0; i < 16; i++) for (i = 0; i < 16; i++)
......
...@@ -76,9 +76,9 @@ s390_fallback_frame_state (struct _Unwind_Context *context, ...@@ -76,9 +76,9 @@ s390_fallback_frame_state (struct _Unwind_Context *context,
return _URC_END_OF_STACK; return _URC_END_OF_STACK;
/* No stack frame. */ /* No stack frame. */
fs->cfa_how = CFA_REG_OFFSET; fs->regs.cfa_how = CFA_REG_OFFSET;
fs->cfa_reg = 15; fs->regs.cfa_reg = 15;
fs->cfa_offset = STACK_POINTER_OFFSET; fs->regs.cfa_offset = STACK_POINTER_OFFSET;
/* All registers remain unchanged ... */ /* All registers remain unchanged ... */
for (i = 0; i < 32; i++) for (i = 0; i < 32; i++)
...@@ -100,9 +100,9 @@ s390_fallback_frame_state (struct _Unwind_Context *context, ...@@ -100,9 +100,9 @@ s390_fallback_frame_state (struct _Unwind_Context *context,
(((unsigned long int) context->cfa) - STACK_POINTER_OFFSET)); (((unsigned long int) context->cfa) - STACK_POINTER_OFFSET));
new_cfa = regs + STACK_POINTER_OFFSET; new_cfa = regs + STACK_POINTER_OFFSET;
fs->cfa_how = CFA_REG_OFFSET; fs->regs.cfa_how = CFA_REG_OFFSET;
fs->cfa_reg = 15; fs->regs.cfa_reg = 15;
fs->cfa_offset = new_cfa - fs->regs.cfa_offset = new_cfa -
(unsigned long int) context->cfa + STACK_POINTER_OFFSET; (unsigned long int) context->cfa + STACK_POINTER_OFFSET;
for (i = 0; i < 16; i++) for (i = 0; i < 16; i++)
......
...@@ -94,9 +94,9 @@ shmedia_fallback_frame_state (struct _Unwind_Context *context, ...@@ -94,9 +94,9 @@ shmedia_fallback_frame_state (struct _Unwind_Context *context,
return _URC_END_OF_STACK; return _URC_END_OF_STACK;
new_cfa = sc->sc_regs[15]; new_cfa = sc->sc_regs[15];
fs->cfa_how = CFA_REG_OFFSET; fs->regs.cfa_how = CFA_REG_OFFSET;
fs->cfa_reg = 15; fs->regs.cfa_reg = 15;
fs->cfa_offset = new_cfa - (long) context->cfa; fs->regs.cfa_offset = new_cfa - (long) context->cfa;
for (i = 0; i < 63; i++) for (i = 0; i < 63; i++)
{ {
...@@ -191,9 +191,9 @@ sh_fallback_frame_state (struct _Unwind_Context *context, ...@@ -191,9 +191,9 @@ sh_fallback_frame_state (struct _Unwind_Context *context,
return _URC_END_OF_STACK; return _URC_END_OF_STACK;
new_cfa = sc->sc_regs[15]; new_cfa = sc->sc_regs[15];
fs->cfa_how = CFA_REG_OFFSET; fs->regs.cfa_how = CFA_REG_OFFSET;
fs->cfa_reg = 15; fs->regs.cfa_reg = 15;
fs->cfa_offset = new_cfa - (long) context->cfa; fs->regs.cfa_offset = new_cfa - (long) context->cfa;
for (i = 0; i < 15; i++) for (i = 0; i < 15; i++)
{ {
......
...@@ -53,9 +53,9 @@ sparc64_fallback_frame_state (struct _Unwind_Context *context, ...@@ -53,9 +53,9 @@ sparc64_fallback_frame_state (struct _Unwind_Context *context,
new_cfa = *(long *)((context->cfa) + (regs_off + (14 * 8))); new_cfa = *(long *)((context->cfa) + (regs_off + (14 * 8)));
new_cfa += 2047; /* Stack bias */ new_cfa += 2047; /* Stack bias */
fpu_save = *(long *)((this_cfa) + (fpu_save_off)); fpu_save = *(long *)((this_cfa) + (fpu_save_off));
fs->cfa_how = CFA_REG_OFFSET; fs->regs.cfa_how = CFA_REG_OFFSET;
fs->cfa_reg = 14; fs->regs.cfa_reg = 14;
fs->cfa_offset = new_cfa - (long) context->cfa; fs->regs.cfa_offset = new_cfa - (long) context->cfa;
for (i = 1; i < 16; ++i) for (i = 1; i < 16; ++i)
{ {
fs->regs.reg[i].how = REG_SAVED_OFFSET; fs->regs.reg[i].how = REG_SAVED_OFFSET;
...@@ -122,9 +122,9 @@ sparc_fallback_frame_state (struct _Unwind_Context *context, ...@@ -122,9 +122,9 @@ sparc_fallback_frame_state (struct _Unwind_Context *context,
this_cfa = (int) context->cfa; this_cfa = (int) context->cfa;
new_cfa = *(int *)((context->cfa) + (regs_off+(4*4)+(14 * 4))); new_cfa = *(int *)((context->cfa) + (regs_off+(4*4)+(14 * 4)));
fpu_save = *(int *)((this_cfa) + (fpu_save_off)); fpu_save = *(int *)((this_cfa) + (fpu_save_off));
fs->cfa_how = CFA_REG_OFFSET; fs->regs.cfa_how = CFA_REG_OFFSET;
fs->cfa_reg = 14; fs->regs.cfa_reg = 14;
fs->cfa_offset = new_cfa - (int) context->cfa; fs->regs.cfa_offset = new_cfa - (int) context->cfa;
for (i = 1; i < 16; ++i) for (i = 1; i < 16; ++i)
{ {
if (i == 14) if (i == 14)
......
...@@ -932,26 +932,26 @@ execute_cfa_program (const unsigned char *insn_ptr, ...@@ -932,26 +932,26 @@ execute_cfa_program (const unsigned char *insn_ptr,
break; break;
case DW_CFA_def_cfa: case DW_CFA_def_cfa:
insn_ptr = read_uleb128 (insn_ptr, &fs->cfa_reg); insn_ptr = read_uleb128 (insn_ptr, &fs->regs.cfa_reg);
insn_ptr = read_uleb128 (insn_ptr, &utmp); insn_ptr = read_uleb128 (insn_ptr, &utmp);
fs->cfa_offset = utmp; fs->regs.cfa_offset = utmp;
fs->cfa_how = CFA_REG_OFFSET; fs->regs.cfa_how = CFA_REG_OFFSET;
break; break;
case DW_CFA_def_cfa_register: case DW_CFA_def_cfa_register:
insn_ptr = read_uleb128 (insn_ptr, &fs->cfa_reg); insn_ptr = read_uleb128 (insn_ptr, &fs->regs.cfa_reg);
fs->cfa_how = CFA_REG_OFFSET; fs->regs.cfa_how = CFA_REG_OFFSET;
break; break;
case DW_CFA_def_cfa_offset: case DW_CFA_def_cfa_offset:
insn_ptr = read_uleb128 (insn_ptr, &utmp); insn_ptr = read_uleb128 (insn_ptr, &utmp);
fs->cfa_offset = utmp; fs->regs.cfa_offset = utmp;
/* cfa_how deliberately not set. */ /* cfa_how deliberately not set. */
break; break;
case DW_CFA_def_cfa_expression: case DW_CFA_def_cfa_expression:
fs->cfa_exp = insn_ptr; fs->regs.cfa_exp = insn_ptr;
fs->cfa_how = CFA_EXP; fs->regs.cfa_how = CFA_EXP;
insn_ptr = read_uleb128 (insn_ptr, &utmp); insn_ptr = read_uleb128 (insn_ptr, &utmp);
insn_ptr += utmp; insn_ptr += utmp;
break; break;
...@@ -975,15 +975,15 @@ execute_cfa_program (const unsigned char *insn_ptr, ...@@ -975,15 +975,15 @@ execute_cfa_program (const unsigned char *insn_ptr,
break; break;
case DW_CFA_def_cfa_sf: case DW_CFA_def_cfa_sf:
insn_ptr = read_uleb128 (insn_ptr, &fs->cfa_reg); insn_ptr = read_uleb128 (insn_ptr, &fs->regs.cfa_reg);
insn_ptr = read_sleb128 (insn_ptr, &fs->cfa_offset); insn_ptr = read_sleb128 (insn_ptr, &fs->regs.cfa_offset);
fs->cfa_how = CFA_REG_OFFSET; fs->regs.cfa_how = CFA_REG_OFFSET;
fs->cfa_offset *= fs->data_align; fs->regs.cfa_offset *= fs->data_align;
break; break;
case DW_CFA_def_cfa_offset_sf: case DW_CFA_def_cfa_offset_sf:
insn_ptr = read_sleb128 (insn_ptr, &fs->cfa_offset); insn_ptr = read_sleb128 (insn_ptr, &fs->regs.cfa_offset);
fs->cfa_offset *= fs->data_align; fs->regs.cfa_offset *= fs->data_align;
/* cfa_how deliberately not set. */ /* cfa_how deliberately not set. */
break; break;
...@@ -1149,7 +1149,7 @@ __frame_state_for (void *pc_target, struct frame_state *state_in) ...@@ -1149,7 +1149,7 @@ __frame_state_for (void *pc_target, struct frame_state *state_in)
/* We have no way to pass a location expression for the CFA to our /* We have no way to pass a location expression for the CFA to our
caller. It wouldn't understand it anyway. */ caller. It wouldn't understand it anyway. */
if (fs.cfa_how == CFA_EXP) if (fs.regs.cfa_how == CFA_EXP)
return 0; return 0;
for (reg = 0; reg < PRE_GCC3_DWARF_FRAME_REGISTERS + 1; reg++) for (reg = 0; reg < PRE_GCC3_DWARF_FRAME_REGISTERS + 1; reg++)
...@@ -1169,8 +1169,8 @@ __frame_state_for (void *pc_target, struct frame_state *state_in) ...@@ -1169,8 +1169,8 @@ __frame_state_for (void *pc_target, struct frame_state *state_in)
} }
} }
state_in->cfa_offset = fs.cfa_offset; state_in->cfa_offset = fs.regs.cfa_offset;
state_in->cfa_reg = fs.cfa_reg; state_in->cfa_reg = fs.regs.cfa_reg;
state_in->retaddr_column = fs.retaddr_column; state_in->retaddr_column = fs.retaddr_column;
state_in->args_size = context.args_size; state_in->args_size = context.args_size;
state_in->eh_ptr = fs.eh_ptr; state_in->eh_ptr = fs.eh_ptr;
...@@ -1227,16 +1227,16 @@ uw_update_context_1 (struct _Unwind_Context *context, _Unwind_FrameState *fs) ...@@ -1227,16 +1227,16 @@ uw_update_context_1 (struct _Unwind_Context *context, _Unwind_FrameState *fs)
#endif #endif
/* Compute this frame's CFA. */ /* Compute this frame's CFA. */
switch (fs->cfa_how) switch (fs->regs.cfa_how)
{ {
case CFA_REG_OFFSET: case CFA_REG_OFFSET:
cfa = _Unwind_GetPtr (&orig_context, fs->cfa_reg); cfa = _Unwind_GetPtr (&orig_context, fs->regs.cfa_reg);
cfa += fs->cfa_offset; cfa += fs->regs.cfa_offset;
break; break;
case CFA_EXP: case CFA_EXP:
{ {
const unsigned char *exp = fs->cfa_exp; const unsigned char *exp = fs->regs.cfa_exp;
_Unwind_Word len; _Unwind_Word len;
exp = read_uleb128 (exp, &len); exp = read_uleb128 (exp, &len);
...@@ -1384,9 +1384,9 @@ uw_init_context_1 (struct _Unwind_Context *context, ...@@ -1384,9 +1384,9 @@ uw_init_context_1 (struct _Unwind_Context *context,
/* Force the frame state to use the known cfa value. */ /* Force the frame state to use the known cfa value. */
_Unwind_SetSpColumn (context, outer_cfa, &sp_slot); _Unwind_SetSpColumn (context, outer_cfa, &sp_slot);
fs.cfa_how = CFA_REG_OFFSET; fs.regs.cfa_how = CFA_REG_OFFSET;
fs.cfa_reg = __builtin_dwarf_sp_column (); fs.regs.cfa_reg = __builtin_dwarf_sp_column ();
fs.cfa_offset = 0; fs.regs.cfa_offset = 0;
uw_update_context_1 (context, &fs); uw_update_context_1 (context, &fs);
......
...@@ -61,18 +61,18 @@ typedef struct ...@@ -61,18 +61,18 @@ typedef struct
/* Used to implement DW_CFA_remember_state. */ /* Used to implement DW_CFA_remember_state. */
struct frame_state_reg_info *prev; struct frame_state_reg_info *prev;
} regs;
/* The CFA can be described in terms of a reg+offset or a /* The CFA can be described in terms of a reg+offset or a
location expression. */ location expression. */
_Unwind_Sword cfa_offset; _Unwind_Sword cfa_offset;
_Unwind_Word cfa_reg; _Unwind_Word cfa_reg;
const unsigned char *cfa_exp; const unsigned char *cfa_exp;
enum { enum {
CFA_UNSET, CFA_UNSET,
CFA_REG_OFFSET, CFA_REG_OFFSET,
CFA_EXP CFA_EXP
} cfa_how; } cfa_how;
} regs;
/* The PC described by the current frame state. */ /* The PC described by the current frame state. */
void *pc; void *pc;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment