On Tue, Mar 22, 2011 at 9:52 PM, Ian Lance Taylor <i...@google.com> wrote:
> "H.J. Lu" <hjl.to...@gmail.com> writes:
>
>>> This suggests that, at least, when sizeof(_Unwind_Word) > sizeof(void*),
>>> we need to extend _Unwind_Context with a new array at the end, and use
>>> that new array when by_value[REG] is true.
>>
>> Will there be a case where 2 copies of unwind-dw2.c are within the same
>> process?
>
> Sure, that's easy.  I think what you are really asking is: will there be
> a case where we could call functions from one copy and then pass the
> context to the functions from a different copy.  I don't know the answer
> to that, but it doesn't seem impossible.
>

Then. will this be acceptable?

Thanks.

-- 
H.J.
---
#ifndef UNWIND_REGISTER_AS_UNION
#if defined __x86_64 && !defined __LP64__
# define UNWIND_REGISTER_AS_UNION
#endif
#endif

#ifdef UNWIND_REGISTER_AS_UNION
typedef union
{
  void *ref;
  _Unwind_Word val;
} _Unwind_Register;
# define UNWIND_REGISTER_GET_VAL_FROM_REF(TYPE, REG) \
   * (TYPE *) (REG).ref
# define UNWIND_REGISTER_SET_VAL(INDEX, VAL) \
   context->reg[INDEX].val = (VAL)
# define UNWIND_REGISTER_GET_REF(INDEX) \
   context->reg[INDEX].ref
# define UNWIND_REGISTER_GET_REF_FROM_VAL(INDEX) \
   &context->reg[INDEX].val
#else
typedef void *_Unwind_Register;
# define UNWIND_REGISTER_GET_VAL_FROM_REF(TYPE, REG) \
   * (TYPE *) (REG)
# define UNWIND_REGISTER_SET_VAL(INDEX, VAL) \
   context->reg[INDEX] = (void *) (_Unwind_Internal_Ptr) (VAL)
# define UNWIND_REGISTER_GET_REF(INDEX) \
   context->reg[INDEX]
# define UNWIND_REGISTER_GET_REF_FROM_VAL(INDEX) \
   &context->reg[INDEX]
#endif

/* 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
{
  _Unwind_Register reg[DWARF_FRAME_REGISTERS+1];
  void *cfa;

Reply via email to