OSDN Git Service

* unwind-dw2-fde.c (fde_unencoded_compare): Replace type punning
authorbje <bje@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 19 May 2009 13:24:30 +0000 (13:24 +0000)
committerbje <bje@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 19 May 2009 13:24:30 +0000 (13:24 +0000)
assignments with memcpy calls.
(add_fdes): Likewise.
(binary_search_unencoded_fdes): Likewise.
(linear_search_fdes): Eliminate type puns.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@147705 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/unwind-dw2-fde.c

index 1b3b0fc..07d2c8e 100644 (file)
@@ -1,3 +1,11 @@
+2009-05-19  Ben Elliston  <bje@au.ibm.com>
+
+       * unwind-dw2-fde.c (fde_unencoded_compare): Replace type punning
+       assignments with memcpy calls.
+       (add_fdes): Likewise.
+       (binary_search_unencoded_fdes): Likewise.
+       (linear_search_fdes): Eliminate type puns.
+       
 2009-05-19  Richard Guenther  <rguenther@suse.de>
 
        * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Do
 2009-05-19  Richard Guenther  <rguenther@suse.de>
 
        * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Do
index fcac25f..4aa9d82 100644 (file)
@@ -318,8 +318,9 @@ static int
 fde_unencoded_compare (struct object *ob __attribute__((unused)),
                       const fde *x, const fde *y)
 {
 fde_unencoded_compare (struct object *ob __attribute__((unused)),
                       const fde *x, const fde *y)
 {
-  const _Unwind_Ptr x_ptr = *(const _Unwind_Ptr *) x->pc_begin;
-  const _Unwind_Ptr y_ptr = *(const _Unwind_Ptr *) y->pc_begin;
+  _Unwind_Ptr x_ptr, y_ptr;
+  memcpy (&x_ptr, x->pc_begin, sizeof (_Unwind_Ptr));
+  memcpy (&y_ptr, y->pc_begin, sizeof (_Unwind_Ptr));
 
   if (x_ptr > y_ptr)
     return 1;
 
   if (x_ptr > y_ptr)
     return 1;
@@ -674,7 +675,9 @@ add_fdes (struct object *ob, struct fde_accumulator *accu, const fde *this_fde)
 
       if (encoding == DW_EH_PE_absptr)
        {
 
       if (encoding == DW_EH_PE_absptr)
        {
-         if (*(const _Unwind_Ptr *) this_fde->pc_begin == 0)
+         _Unwind_Ptr ptr;
+         memcpy (&ptr, this_fde->pc_begin, sizeof (_Unwind_Ptr));
+         if (ptr == 0)
            continue;
        }
       else
            continue;
        }
       else
@@ -792,8 +795,9 @@ linear_search_fdes (struct object *ob, const fde *this_fde, void *pc)
 
       if (encoding == DW_EH_PE_absptr)
        {
 
       if (encoding == DW_EH_PE_absptr)
        {
-         pc_begin = ((const _Unwind_Ptr *) this_fde->pc_begin)[0];
-         pc_range = ((const _Unwind_Ptr *) this_fde->pc_begin)[1];
+         const _Unwind_Ptr *pc_array = (const _Unwind_Ptr *) this_fde->pc_begin;
+         pc_begin = pc_array[0];
+         pc_range = pc_array[1];
          if (pc_begin == 0)
            continue;
        }
          if (pc_begin == 0)
            continue;
        }
@@ -840,8 +844,10 @@ binary_search_unencoded_fdes (struct object *ob, void *pc)
     {
       size_t i = (lo + hi) / 2;
       const fde *const f = vec->array[i];
     {
       size_t i = (lo + hi) / 2;
       const fde *const f = vec->array[i];
-      const void *pc_begin = ((const void *const*) f->pc_begin)[0];
-      const uaddr pc_range = ((const uaddr *) f->pc_begin)[1];
+      void *pc_begin;
+      uaddr pc_range;
+      memcpy (&pc_begin, (const void * const *) f->pc_begin, sizeof (void *));
+      memcpy (&pc_range, (const uaddr *) f->pc_begin + 1, sizeof (uaddr));
 
       if (pc < pc_begin)
        hi = i;
 
       if (pc < pc_begin)
        hi = i;