This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
PATCH: PR other/48007: Unwind library doesn't work with UNITS_PER_WORD > sizeof (void *)
- From: "H.J. Lu" <hongjiu dot lu at intel dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sun, 6 Mar 2011 09:18:30 -0800
- Subject: PATCH: PR other/48007: Unwind library doesn't work with UNITS_PER_WORD > sizeof (void *)
- Reply-to: "H.J. Lu" <hjl dot tools at gmail dot com>
Hi,
We shouldn't save call frame hard registers as "void *". This patch
changes the unwind library to save call frame hard registers as
_Unwind_Word. OK for 4.7?
Thanks.
H.J.
----
commit 4163355471bfb192fdacc5da1ceb9aec5569ff94
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Sun Mar 6 08:19:25 2011 -0800
Save call frame hard registers as _Unwind_Word.
diff --git a/gcc/ChangeLog.x32 b/gcc/ChangeLog.x32
index 5389f19..022767b 100644
--- a/gcc/ChangeLog.x32
+++ b/gcc/ChangeLog.x32
@@ -1,3 +1,15 @@
+2011-03-06 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR other/48007
+ * unwind-dw2.c (_Unwind_Context): Save call frame hard registers
+ as _Unwind_Word.
+ (_Unwind_GetGR): Get GR value as _Unwind_Word.
+ (_Unwind_SetGR): Set GR value as _Unwind_Word.
+ (_Unwind_SetGRValue): Likewise.
+ (_Unwind_GetGRPtr): Cast return to "void *".
+ (_Unwind_SetGRPtr): Cast pointer to _Unwind_Word.
+ (uw_install_context_1): Cast pointer to "void *".
+
2011-03-05 H.J. Lu <hongjiu.lu@intel.com>
* config/i386/linux-unwind.h (x86_64_fallback_frame_state):
diff --git a/gcc/unwind-dw2.c b/gcc/unwind-dw2.c
index 2ea9adb..229c373 100644
--- a/gcc/unwind-dw2.c
+++ b/gcc/unwind-dw2.c
@@ -60,7 +60,7 @@
to its caller. */
struct _Unwind_Context
{
- void *reg[DWARF_FRAME_REGISTERS+1];
+ _Unwind_Word reg[DWARF_FRAME_REGISTERS+1];
void *cfa;
void *ra;
void *lsda;
@@ -152,7 +152,7 @@ inline _Unwind_Word
_Unwind_GetGR (struct _Unwind_Context *context, int index)
{
int size;
- void *ptr;
+ _Unwind_Word val;
#ifdef DWARF_ZERO_REG
if (index == DWARF_ZERO_REG)
@@ -162,18 +162,18 @@ _Unwind_GetGR (struct _Unwind_Context *context, int index)
index = DWARF_REG_TO_UNWIND_COLUMN (index);
gcc_assert (index < (int) sizeof(dwarf_reg_size_table));
size = dwarf_reg_size_table[index];
- ptr = context->reg[index];
+ val = context->reg[index];
if (_Unwind_IsExtendedContext (context) && context->by_value[index])
- return (_Unwind_Word) (_Unwind_Internal_Ptr) ptr;
+ return val;
/* This will segfault if the register hasn't been saved. */
if (size == sizeof(_Unwind_Ptr))
- return * (_Unwind_Ptr *) ptr;
+ return * (_Unwind_Ptr *) (intptr_t) val;
else
{
gcc_assert (size == sizeof(_Unwind_Word));
- return * (_Unwind_Word *) ptr;
+ return * (_Unwind_Word *) (intptr_t) val;
}
}
@@ -205,11 +205,11 @@ _Unwind_SetGR (struct _Unwind_Context *context, int index, _Unwind_Word val)
if (_Unwind_IsExtendedContext (context) && context->by_value[index])
{
- context->reg[index] = (void *) (_Unwind_Internal_Ptr) val;
+ context->reg[index] = val;
return;
}
- ptr = context->reg[index];
+ ptr = (void *) (intptr_t) context->reg[index];
if (size == sizeof(_Unwind_Ptr))
* (_Unwind_Ptr *) ptr = val;
@@ -227,8 +227,8 @@ _Unwind_GetGRPtr (struct _Unwind_Context *context, int index)
{
index = DWARF_REG_TO_UNWIND_COLUMN (index);
if (_Unwind_IsExtendedContext (context) && context->by_value[index])
- return &context->reg[index];
- return context->reg[index];
+ return (void *) (intptr_t) &context->reg[index];
+ return (void *) (intptr_t) context->reg[index];
}
/* Set the pointer to a register INDEX as saved in CONTEXT. */
@@ -239,7 +239,7 @@ _Unwind_SetGRPtr (struct _Unwind_Context *context, int index, void *p)
index = DWARF_REG_TO_UNWIND_COLUMN (index);
if (_Unwind_IsExtendedContext (context))
context->by_value[index] = 0;
- context->reg[index] = p;
+ context->reg[index] = (_Unwind_Word) (intptr_t) p;
}
/* Overwrite the saved value for register INDEX in CONTEXT with VAL. */
@@ -250,10 +250,10 @@ _Unwind_SetGRValue (struct _Unwind_Context *context, int index,
{
index = DWARF_REG_TO_UNWIND_COLUMN (index);
gcc_assert (index < (int) sizeof(dwarf_reg_size_table));
- gcc_assert (dwarf_reg_size_table[index] == sizeof (_Unwind_Ptr));
+ gcc_assert (dwarf_reg_size_table[index] == sizeof (_Unwind_Word));
context->by_value[index] = 1;
- context->reg[index] = (void *) (_Unwind_Internal_Ptr) val;
+ context->reg[index] = val;
}
/* Return nonzero if register INDEX is stored by value rather than
@@ -1524,8 +1524,8 @@ uw_install_context_1 (struct _Unwind_Context *current,
for (i = 0; i < DWARF_FRAME_REGISTERS; ++i)
{
- void *c = current->reg[i];
- void *t = target->reg[i];
+ void *c = (void *) (intptr_t) current->reg[i];
+ void *t = (void *) (intptr_t) target->reg[i];
gcc_assert (current->by_value[i] == 0);
if (target->by_value[i] && c)