From: bje Date: Tue, 19 May 2009 13:24:30 +0000 (+0000) Subject: * unwind-dw2-fde.c (fde_unencoded_compare): Replace type punning X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=46d25b89f82b8bde610e26a40607782dc4c35b4a * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@147705 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1b3b0fc213c..07d2c8e9d9f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2009-05-19 Ben Elliston + + * 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 * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Do diff --git a/gcc/unwind-dw2-fde.c b/gcc/unwind-dw2-fde.c index fcac25f7259..4aa9d82af8d 100644 --- a/gcc/unwind-dw2-fde.c +++ b/gcc/unwind-dw2-fde.c @@ -318,8 +318,9 @@ static int 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; @@ -674,7 +675,9 @@ add_fdes (struct object *ob, struct fde_accumulator *accu, const fde *this_fde) 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 @@ -792,8 +795,9 @@ linear_search_fdes (struct object *ob, const fde *this_fde, void *pc) 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; } @@ -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]; - 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;