PING. On Thu, Jul 28, 2011 at 3:01 PM, H.J. Lu <hjl.to...@gmail.com> wrote: > Hi Richard, Jason, > > Is this patch > > http://gcc.gnu.org/ml/gcc-patches/2011-06/msg02401.html > > OK for trunk? > > Thanks. > > > H.J. > On Mon, Jul 11, 2011 at 3:21 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >> Ping. >> >> On Wed, Jul 6, 2011 at 2:20 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >>> PING. >>> >>> On Thu, Jun 30, 2011 at 1:47 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >>>> On Thu, Jun 30, 2011 at 12:02 PM, Richard Henderson <r...@redhat.com> >>>> wrote: >>>>> On 06/30/2011 11:23 AM, H.J. Lu wrote: >>>>>> +#ifdef REG_VALUE_IN_UNWIND_CONTEXT >>>>>> +typedef _Unwind_Word _Unwind_Context_Reg_Val; >>>>>> +/* Signal frame context. */ >>>>>> +#define SIGNAL_FRAME_BIT ((_Unwind_Word) 1 >> 0) >>>>> >>>>> There's absolutely no reason to re-define this. >>>>> So what if the value is most-significant-bit set? >>>>> >>>>> Nor do I see any reason not to continue setting E_C_B. >>>> >>>> Done. >>>> >>>>>> +#define _Unwind_IsExtendedContext(c) 1 >>>>> >>>>> Why is this not still an inline function? >>>> >>>> It is defined before _Unwind_Context is declared. I used >>>> macros so that there can be one less "#ifdef". >>>> >>>>>> + >>>>>> +static inline _Unwind_Word >>>>>> +_Unwind_Get_Unwind_Word (_Unwind_Context_Reg_Val val) >>>>>> +{ >>>>>> + return val; >>>>>> +} >>>>>> + >>>>>> +static inline _Unwind_Context_Reg_Val >>>>>> +_Unwind_Get_Unwind_Context_Reg_Val (_Unwind_Word val) >>>>>> +{ >>>>>> + return val; >>>>>> +} >>>>> >>>>> I cannot believe this actually works. I see nowhere that >>>>> you copy the by-address slot out of the stack frame and >>>>> place it into the by-value slot in the unwind context. >>>> >>>> I changed the implantation based on the feedback from >>>> Jason. Now I use the same reg field for both value and >>>> address. >>>> >>>>>> /* This will segfault if the register hasn't been saved. */ >>>>>> if (size == sizeof(_Unwind_Ptr)) >>>>>> - return * (_Unwind_Ptr *) ptr; >>>>>> + return * (_Unwind_Ptr *) (_Unwind_Internal_Ptr) val; >>>>>> else >>>>>> { >>>>>> gcc_assert (size == sizeof(_Unwind_Word)); >>>>>> - return * (_Unwind_Word *) ptr; >>>>>> + return * (_Unwind_Word *) (_Unwind_Internal_Ptr) val; >>>>>> } >>>>> >>>>> Indeed, this section is both wrong and belies the change >>>>> you purport to make. >>>>> >>>>> You didn't even test this, did you? >>>>> >>>> >>>> Here is the updated patch. It works on simple tests. >>>> I am running full tests. I kept config/i386/value-unwind.h >>>> since libgcc/md-unwind-support.h is included too late >>>> in unwind-dw2.c and I don't want to move it to be on >>>> the safe side. >>>> >>>> OK for trunk? >>>> >>>> Thanks. >>>> >>>> -- >>>> H.J. >>>> --- >>>> gcc/ >>>> >>>> 2011-06-30 H.J. Lu <hongjiu...@intel.com> >>>> >>>> * config.gcc (libgcc_tm_file): Add i386/value-unwind.h for >>>> Linux/x86. >>>> >>>> * system.h (REG_VALUE_IN_UNWIND_CONTEXT): Poisoned. >>>> >>>> * unwind-dw2.c (_Unwind_Context_Reg_Val): New. >>>> (_Unwind_Get_Unwind_Word): Likewise. >>>> (_Unwind_Get_Unwind_Context_Reg_Val): Likewise. >>>> (_Unwind_Context): Use _Unwind_Context_Reg_Val on the reg field. >>>> (_Unwind_IsExtendedContext): Defined as macro. >>>> (_Unwind_GetGR): Updated. >>>> (_Unwind_SetGR): Likewise. >>>> (_Unwind_GetGRPtr): Likewise. >>>> (_Unwind_SetGRPtr): Likewise. >>>> (_Unwind_SetGRValue): Likewise. >>>> (_Unwind_GRByValue): Likewise. >>>> (__frame_state_for): Likewise. >>>> (uw_install_context_1): Likewise. >>>> >>>> * doc/tm.texi.in: Document REG_VALUE_IN_UNWIND_CONTEXT. >>>> * doc/tm.texi: Regenerated. >>>> >>>> libgcc/ >>>> >>>> 2011-06-30 H.J. Lu <hongjiu...@intel.com> >>>> >>>> * config/i386/value-unwind.h: New. >>>> >>> >>> >
-- H.J.