This is the mail archive of the
libffi-discuss@sourceware.org
mailing list for the libffi project.
[PATCH 2/4] s390: Avoid aliasing warnings
- From: Richard Henderson <rth at twiddle dot net>
- To: libffi-discuss at sourceware dot org
- Cc: Ulrich dot Weigand at de dot ibm dot com, vogt at linux dot vnet dot ibm dot com, krebbel at linux dot vnet dot ibm dot com, Richard Henderson <rth at redhat dot com>
- Date: Thu, 18 Dec 2014 15:33:21 -0600
- Subject: [PATCH 2/4] s390: Avoid aliasing warnings
- Authentication-results: sourceware.org; auth=none
- References: <1418938403-15836-1-git-send-email-rth at twiddle dot net>
From: Richard Henderson <rth@redhat.com>
---
src/s390/ffi.c | 33 ++++++++++++++++-----------------
1 file changed, 16 insertions(+), 17 deletions(-)
diff --git a/src/s390/ffi.c b/src/s390/ffi.c
index b0c3092..c06b79e 100644
--- a/src/s390/ffi.c
+++ b/src/s390/ffi.c
@@ -762,29 +762,28 @@ ffi_prep_closure_loc (ffi_closure *closure,
void *user_data,
void *codeloc)
{
- if (cif->abi != FFI_SYSV)
- return FFI_BAD_ABI;
-
+ static unsigned short const template[] = {
+ 0x0d10, /* basr %r1,0 */
#ifndef __s390x__
- *(short *)&closure->tramp [0] = 0x0d10; /* basr %r1,0 */
- *(short *)&closure->tramp [2] = 0x9801; /* lm %r0,%r1,6(%r1) */
- *(short *)&closure->tramp [4] = 0x1006;
- *(short *)&closure->tramp [6] = 0x07f1; /* br %r1 */
- *(long *)&closure->tramp [8] = (long)codeloc;
- *(long *)&closure->tramp[12] = (long)&ffi_closure_SYSV;
+ 0x9801, 0x1006, /* lm %r0,%r1,6(%r1) */
#else
- *(short *)&closure->tramp [0] = 0x0d10; /* basr %r1,0 */
- *(short *)&closure->tramp [2] = 0xeb01; /* lmg %r0,%r1,14(%r1) */
- *(short *)&closure->tramp [4] = 0x100e;
- *(short *)&closure->tramp [6] = 0x0004;
- *(short *)&closure->tramp [8] = 0x07f1; /* br %r1 */
- *(long *)&closure->tramp[16] = (long)codeloc;
- *(long *)&closure->tramp[24] = (long)&ffi_closure_SYSV;
+ 0xeb01, 0x100e, 0x0004, /* lmg %r0,%r1,14(%r1) */
#endif
+ 0x07f1 /* br %r1 */
+ };
+
+ unsigned long *tramp = (unsigned long *)&closure->tramp;
+
+ if (cif->abi != FFI_SYSV)
+ return FFI_BAD_ABI;
+
+ memcpy (tramp, template, sizeof(template));
+ tramp[2] = (unsigned long)codeloc;
+ tramp[3] = (unsigned long)&ffi_closure_SYSV;
closure->cif = cif;
- closure->user_data = user_data;
closure->fun = fun;
+ closure->user_data = user_data;
return FFI_OK;
}
--
2.1.0