summaryrefslogtreecommitdiff
path: root/patches/sparc-v8-aggregate-returns
diff options
context:
space:
mode:
Diffstat (limited to 'patches/sparc-v8-aggregate-returns')
-rw-r--r--patches/sparc-v8-aggregate-returns108
1 files changed, 0 insertions, 108 deletions
diff --git a/patches/sparc-v8-aggregate-returns b/patches/sparc-v8-aggregate-returns
deleted file mode 100644
index 2e71dec..0000000
--- a/patches/sparc-v8-aggregate-returns
+++ /dev/null
@@ -1,108 +0,0 @@
-Index: libffi/ChangeLog
-===================================================================
---- libffi.orig/ChangeLog
-+++ libffi/ChangeLog
-@@ -111,6 +111,12 @@
-
- * configure: Regenerate.
-
-+2011-02-08 Ginn Chen <ginn.chen@oracle.com>
-+
-+ * src/sparc/ffi.c (ffi_call): Make compatible with Solaris Studio
-+ aggregate return ABI. Flush cache.
-+ (ffi_prep_closure_loc): Flush cache.
-+
- 2011-02-11 Anthony Green <green@moxielogic.com>
-
- From Tom Honermann <tom.honermann@oracle.com>:
-Index: libffi/src/sparc/ffi.c
-===================================================================
---- libffi.orig/src/sparc/ffi.c
-+++ libffi/src/sparc/ffi.c
-@@ -1,5 +1,6 @@
- /* -----------------------------------------------------------------------
- ffi.c - Copyright (c) 1996, 2003, 2004, 2007, 2008 Red Hat, Inc.
-+ Copyright (c) 2011 Anthony Green
-
- SPARC Foreign Function Interface
-
-@@ -406,8 +407,50 @@ void ffi_call(ffi_cif *cif, void (*fn)(v
- /* We don't yet support calling 32bit code from 64bit */
- FFI_ASSERT(0);
- #else
-- ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes,
-- cif->flags, rvalue, fn);
-+ if (rvalue && (cif->rtype->type == FFI_TYPE_STRUCT
-+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-+ || cif->flags == FFI_TYPE_LONGDOUBLE
-+#endif
-+ ))
-+ {
-+ /* For v8, we need an "unimp" with size of returning struct */
-+ /* behind "call", so we alloc some executable space for it. */
-+ /* l7 is used, we need to make sure v8.S doesn't use %l7. */
-+ unsigned int *call_struct = NULL;
-+ ffi_closure_alloc(32, &call_struct);
-+ if (call_struct)
-+ {
-+ unsigned long f = (unsigned long)fn;
-+ call_struct[0] = 0xae10001f; /* mov %i7, %l7 */
-+ call_struct[1] = 0xbe10000f; /* mov %o7, %i7 */
-+ call_struct[2] = 0x03000000 | f >> 10; /* sethi %hi(fn), %g1 */
-+ call_struct[3] = 0x9fc06000 | (f & 0x3ff); /* jmp %g1+%lo(fn), %o7 */
-+ call_struct[4] = 0x01000000; /* nop */
-+ if (cif->rtype->size < 0x7f)
-+ call_struct[5] = cif->rtype->size; /* unimp */
-+ else
-+ call_struct[5] = 0x01000000; /* nop */
-+ call_struct[6] = 0x81c7e008; /* ret */
-+ call_struct[7] = 0xbe100017; /* mov %l7, %i7 */
-+ asm volatile ("iflush %0; iflush %0+8; iflush %0+16; iflush %0+24" : :
-+ "r" (call_struct) : "memory");
-+ /* SPARC v8 requires 5 instructions for flush to be visible */
-+ asm volatile ("nop; nop; nop; nop; nop");
-+ ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes,
-+ cif->flags, rvalue, call_struct);
-+ ffi_closure_free(call_struct);
-+ }
-+ else
-+ {
-+ ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes,
-+ cif->flags, rvalue, fn);
-+ }
-+ }
-+ else
-+ {
-+ ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes,
-+ cif->flags, rvalue, fn);
-+ }
- #endif
- break;
- case FFI_V9:
-@@ -425,7 +468,6 @@ void ffi_call(ffi_cif *cif, void (*fn)(v
- FFI_ASSERT(0);
- break;
- }
--
- }
-
-
-@@ -468,13 +510,13 @@ ffi_prep_closure_loc (ffi_closure* closu
- closure->fun = fun;
- closure->user_data = user_data;
-
-- /* Flush the Icache. FIXME: alignment isn't certain, assume 8 bytes */
-+ /* Flush the Icache. closure is 8 bytes aligned. */
- #ifdef SPARC64
-- asm volatile ("flush %0" : : "r" (closure) : "memory");
-- asm volatile ("flush %0" : : "r" (((char *) closure) + 8) : "memory");
-+ asm volatile ("flush %0; flush %0+8" : : "r" (closure) : "memory");
- #else
-- asm volatile ("iflush %0" : : "r" (closure) : "memory");
-- asm volatile ("iflush %0" : : "r" (((char *) closure) + 8) : "memory");
-+ asm volatile ("iflush %0; iflush %0+8" : : "r" (closure) : "memory");
-+ /* SPARC v8 requires 5 instructions for flush to be visible */
-+ asm volatile ("nop; nop; nop; nop; nop");
- #endif
-
- return FFI_OK;