aboutsummaryrefslogtreecommitdiff
path: root/libffi/src/moxie/ffi.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2021-08-31 07:14:47 -0700
committerH.J. Lu <hjl.tools@gmail.com>2021-10-20 05:35:52 -0700
commit92456a4e5658e138e2cea79e390e3306b07685b0 (patch)
tree6ef878e933b504a902035f1ae89510fde96a976d /libffi/src/moxie/ffi.c
parentd738405e7fe62cc8eb9580948a6ea39005cd7170 (diff)
downloadgcc-92456a4e5658e138e2cea79e390e3306b07685b0.zip
gcc-92456a4e5658e138e2cea79e390e3306b07685b0.tar.gz
gcc-92456a4e5658e138e2cea79e390e3306b07685b0.tar.bz2
libffi: Sync with libffi 3.4.2
Merged commit: f9ea41683444ebe11cfa45b05223899764df28fb
Diffstat (limited to 'libffi/src/moxie/ffi.c')
-rw-r--r--libffi/src/moxie/ffi.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/libffi/src/moxie/ffi.c b/libffi/src/moxie/ffi.c
index 540a042..16d2bb3 100644
--- a/libffi/src/moxie/ffi.c
+++ b/libffi/src/moxie/ffi.c
@@ -1,5 +1,5 @@
/* -----------------------------------------------------------------------
- ffi.c - Copyright (C) 2012, 2013 Anthony Green
+ ffi.c - Copyright (C) 2012, 2013, 2018 Anthony Green
Moxie Foreign Function Interface
@@ -100,7 +100,7 @@ void *ffi_prep_args(char *stack, extended_cif *ecif)
count += z;
}
- return (stack + ((count > 24) ? 24 : ALIGN_DOWN(count, 8)));
+ return (stack + ((count > 24) ? 24 : FFI_ALIGN_DOWN(count, 8)));
}
/* Perform machine dependent cif processing */
@@ -111,7 +111,7 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
else
cif->flags = cif->rtype->size;
- cif->bytes = ALIGN (cif->bytes, 8);
+ cif->bytes = FFI_ALIGN (cif->bytes, 8);
return FFI_OK;
}
@@ -159,7 +159,7 @@ void ffi_closure_eabi (unsigned arg1, unsigned arg2, unsigned arg3,
unsigned arg4, unsigned arg5, unsigned arg6)
{
/* This function is called by a trampoline. The trampoline stows a
- pointer to the ffi_closure object in $r7. We must save this
+ pointer to the ffi_closure object in $r12. We must save this
pointer in a place that will persist while we do our work. */
register ffi_closure *creg __asm__ ("$r12");
ffi_closure *closure = creg;
@@ -215,7 +215,18 @@ void ffi_closure_eabi (unsigned arg1, unsigned arg2, unsigned arg3,
break;
default:
/* This is an 8-byte value. */
- avalue[i] = ptr;
+ if (ptr == (char *) &register_args[5])
+ {
+ /* The value is split across two locations */
+ unsigned *ip = alloca(8);
+ avalue[i] = ip;
+ ip[0] = *(unsigned *) ptr;
+ ip[1] = *(unsigned *) stack_args;
+ }
+ else
+ {
+ avalue[i] = ptr;
+ }
ptr += 4;
break;
}
@@ -223,8 +234,10 @@ void ffi_closure_eabi (unsigned arg1, unsigned arg2, unsigned arg3,
/* If we've handled more arguments than fit in registers,
start looking at the those passed on the stack. */
- if (ptr == &register_args[6])
+ if (ptr == (char *) &register_args[6])
ptr = stack_args;
+ else if (ptr == (char *) &register_args[7])
+ ptr = stack_args + 4;
}
/* Invoke the closure. */
@@ -257,7 +270,7 @@ ffi_prep_closure_loc (ffi_closure* closure,
fn = (unsigned long) ffi_closure_eabi;
- tramp[0] = 0x01e0; /* ldi.l $r7, .... */
+ tramp[0] = 0x01e0; /* ldi.l $r12, .... */
tramp[1] = cls >> 16;
tramp[2] = cls & 0xffff;
tramp[3] = 0x1a00; /* jmpa .... */