Please Cc: comments to me because I do not subscribe to the
gcc-patches mailing list. I receive far too much email already.
Duncan Simpson (-:
--- libffi/ChangeLog.dist 2009-09-02 00:30:05.958626045 +0100
+++ libffi/ChangeLog 2009-09-04 00:48:32.986127555 +0100
@@ -1,3 +1,24 @@
+2009-08-03 Duncan Simpson <dps@simpson.demon.co.uk>
+
+ * src/prep_cif.c: In ffi_prep_cif return FFI_BAD_ABI is the abi
+ parameter is not valid.
+ * src/x86/libffi64.c: In ffi_prep_closure_loc return FFI_BAD_ABI
+ if cif->abi is not a valid abi (tested on x86_64)
+ * src/alpha/ffi.c: ditto (not tested)
+ * src/arm/ffi.c: ditto (not tested)
+ * src/cris/ffi.c: ditto (not tested)
+ * src/frv/ffi.c: ditto (not tested)
+ * src/ia64/ffi.c: In ffi_prep_cloure_loc return FFI_BAD_ABI
+ instead of failing an assertion (not tested).
+ * src/m66k/ffi.c: ditto (not tested)
+ * src/mips/ffi.c: ditto (not tested)
+ * src/pa/ffi.c: ditto (not tested)
+ * src/powerpc/ffi.c: ditto (not tested)
+ * src/s390/ffi.c: ditto (not tested)
+ * src/sh/ffi.c: ditto (not tested)
+ * src/sh64/ffi.c: ditto (not tested)
+ * src/sparc/ffi.c: ditto (not tested)
+
2009-08-24 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
* configure.ac (AC_PREREQ): Bump to 2.64.
--- libffi/src/mips/ffi.c.dist 2009-08-29 01:26:58.686124378 +0100
+++ libffi/src/mips/ffi.c 2009-09-02 18:05:16.990135433 +0100
@@ -574,9 +574,13 @@
char *clear_location = (char *) codeloc;
#if defined(FFI_MIPS_O32)
+ if (cif->abi != FFI_O32 && cif->abi != FFI_O32_SOFT_FLOAT)
+ return FFI_BAD_ABI;
FFI_ASSERT(cif->abi == FFI_O32 || cif->abi == FFI_O32_SOFT_FLOAT);
fn = ffi_closure_O32;
#else /* FFI_MIPS_N32 */
+ if (cif->abi != FFI_N32 && cif->abi != FFI_N64)
+ return FFI_BAD_ABI;
FFI_ASSERT(cif->abi == FFI_N32 || cif->abi == FFI_N64);
fn = ffi_closure_N32;
#endif /* FFI_MIPS_O32 */
--- libffi/src/sparc/ffi.c.dist 2009-08-29 01:26:59.110636528 +0100
+++ libffi/src/sparc/ffi.c 2009-09-02 18:16:50.266131344 +0100
@@ -447,6 +447,8 @@
#ifdef SPARC64
/* Trampoline address is equal to the closure address. We take
advantage
of that to reduce the trampoline size by 8 bytes. */
+ if (cif->abi != FFI_V9)
+ return FFI_BAD_ABIl
FFI_ASSERT (cif->abi == FFI_V9);
fn = (unsigned long) ffi_closure_v9;
tramp[0] = 0x83414000; /* rd %pc, %g1 */
@@ -456,6 +458,8 @@
*((unsigned long *) &tramp[4]) = fn;
#else
unsigned long ctx = (unsigned long) codeloc;
+ if (cif->abi != FFI_V8)
+ return FFI_BAD_ABIl
FFI_ASSERT (cif->abi == FFI_V8);
fn = (unsigned long) ffi_closure_v8;
tramp[0] = 0x03000000 | fn >> 10; /* sethi %hi(fn), %g1 */
--- libffi/src/sh/ffi.c.dist 2009-08-29 01:26:59.206126820 +0100
+++ libffi/src/sh/ffi.c 2009-09-02 18:15:30.382640181 +0100
@@ -463,6 +463,8 @@
unsigned int *tramp;
unsigned int insn;
+ if (cif->abi != FFI_GCC_SYSV)
+ return FFI_BAD_ABI;
FFI_ASSERT (cif->abi == FFI_GCC_SYSV);
tramp = (unsigned int *) &closure->tramp[0];
--- libffi/src/pa/ffi.c.dist 2009-08-29 01:26:58.534630514 +0100
+++ libffi/src/pa/ffi.c 2009-09-02 18:06:35.230132463 +0100
@@ -626,6 +626,8 @@
UINT32 *tmp;
#endif
+ if (cif->abi != FFI_PA32)
+ return FFI_BAD_ABI;
FFI_ASSERT (cif->abi == FFI_PA32);
/* Make a small trampoline that will branch to our
--- libffi/src/s390/ffi.c.dist 2009-08-29 01:26:58.438636691 +0100
+++ libffi/src/s390/ffi.c 2009-09-02 18:12:54.014145749 +0100
@@ -750,6 +750,8 @@
void *user_data,
void *codeloc)
{
+ if (cif->abi != FFI_SYSV)
+ return FFI_BAD_ABI;
FFI_ASSERT (cif->abi == FFI_SYSV);
#ifndef __s390x__
--- libffi/src/alpha/ffi.c.dist 2009-09-04 00:06:11.686634778 +0100
+++ libffi/src/alpha/ffi.c 2009-09-04 00:06:21.262635864 +0100
@@ -177,6 +177,8 @@
void *codeloc)
{
unsigned int *tramp;
+ if (cif->abi<=FFI_FIRST_ABI || cif->abi > FFI_DEFAULT_ABI)
+ return FFI_BAD_ABI;
tramp = (unsigned int *) &closure->tramp[0];
tramp[0] = 0x47fb0401; /* mov $27,$1 */
--- libffi/src/frv/ffi.c.dist 2009-09-04 00:10:17.254128944 +0100
+++ libffi/src/frv/ffi.c 2009-09-04 00:13:07.638635251 +0100
@@ -259,6 +259,8 @@
register void *got __asm__("gr15");
#endif
int i;
+ if (cif->abi != FFI_EABI)
+ return FFI_BAD_ABI;
fn = (unsigned long) ffi_closure_eabi;
--- libffi/src/prep_cif.c.dist 2009-09-04 00:38:46.514149189 +0100
+++ libffi/src/prep_cif.c 2009-09-04 00:47:32.930636373 +0100
@@ -92,6 +92,8 @@
unsigned int i;
ffi_type **ptr;
+ if (abi <= FFI_FIRST_ABI || abi > FFI_DEFAULT_ABI)
+ return FFI_BAD_ABI;
FFI_ASSERT(cif != NULL);
FFI_ASSERT((abi > FFI_FIRST_ABI) && (abi <= FFI_DEFAULT_ABI));
--- libffi/src/powerpc/ffi.c.dist 2009-08-29 01:26:57.814627263 +0100
+++ libffi/src/powerpc/ffi.c 2009-09-02 18:08:40.154128013 +0100
@@ -948,6 +948,8 @@
#ifdef POWERPC64
void **tramp = (void **) &closure->tramp[0];
+ if (cif->abi != FFI_LINUX64)
+ return FFI_BAD_ABI;
FFI_ASSERT (cif->abi == FFI_LINUX64);
/* Copy function address and TOC from ffi_closure_LINUX64. */
memcpy (tramp, (char *) ffi_closure_LINUX64, 16);
@@ -955,6 +957,8 @@
#else
unsigned int *tramp;
+ if (cif->abi != FFI_GCC_SYSV && cif->abi != FFI_SYSV)
+ return FFI_BAD_ABI;
FFI_ASSERT (cif->abi == FFI_GCC_SYSV || cif->abi == FFI_SYSV);
tramp = (unsigned int *) &closure->tramp[0];
--- libffi/src/powerpc/ffi_darwin.c.dist 2009-08-29
01:26:57.822630703 +0100
+++ libffi/src/powerpc/ffi_darwin.c 2009-09-02 18:10:20.642135172 +0100
@@ -581,8 +581,7 @@
default:
- FFI_ASSERT(0);
- break;
+ return FFI_BAD_ABI;
}
return FFI_OK;
}
--- libffi/src/sh64/ffi.c.dist 2009-08-29 01:26:57.954649606 +0100
+++ libffi/src/sh64/ffi.c 2009-09-02 18:14:30.966136362 +0100
@@ -302,6 +302,8 @@
{
unsigned int *tramp;
+ if (cif->abi == FFI_GCC_SYSV)
+ return FFI_BAD_ABI;
FFI_ASSERT (cif->abi == FFI_GCC_SYSV);
tramp = (unsigned int *) &closure->tramp[0];
--- libffi/src/arm/ffi.c.dist 2009-08-29 01:26:57.658650933 +0100
+++ libffi/src/arm/ffi.c 2009-09-02 17:57:59.422131055 +0100
@@ -295,6 +295,8 @@
void *user_data,
void *codeloc)
{
+ if (cif->abi != FFI_SYSV)
+ return FFI_BAD_ABI;
FFI_ASSERT (cif->abi == FFI_SYSV);
FFI_INIT_TRAMPOLINE (&closure->tramp[0], \
--- libffi/src/m68k/ffi.c.dist 2009-08-29 01:26:58.354638462 +0100
+++ libffi/src/m68k/ffi.c 2009-09-02 18:03:11.070637441 +0100
@@ -255,6 +255,8 @@
void *user_data,
void *codeloc)
{
+ if (cif->abi != FFI_SYSV)
+ return FFI_BAD_ABI;
FFI_ASSERT (cif->abi == FFI_SYSV);
*(unsigned short *)closure->tramp = 0x207c;
--- libffi/src/x86/ffi64.c.dist 2009-08-29 01:26:58.182641857 +0100
+++ libffi/src/x86/ffi64.c 2009-09-03 23:45:40.134139291 +0100
@@ -442,6 +442,8 @@
void *codeloc)
{
volatile unsigned short *tramp;
+ if (cif->abi<=FFI_FIRST_ABI || cif->abi > FFI_DEFAULT_ABI)
+ return FFI_BAD_ABI;
tramp = (volatile unsigned short *) &closure->tramp[0];
--- libffi/src/ia64/ffi.c.dist 2009-08-29 01:26:58.582632324 +0100
+++ libffi/src/ia64/ffi.c 2009-09-02 18:01:49.994135712 +0100
@@ -425,6 +425,8 @@
struct ffi_ia64_trampoline_struct *tramp;
struct ia64_fd *fd;
+ if (cif->abi != FFI_UNIX)
+ return FFI_BAD_ABI;
FFI_ASSERT (cif->abi == FFI_UNIX);
tramp = (struct ffi_ia64_trampoline_struct *)closure->tramp;
--- libffi/src/cris/ffi.c.dist 2009-08-29 01:26:58.482635236 +0100
+++ libffi/src/cris/ffi.c 2009-09-02 17:58:13.890132060 +0100
@@ -368,6 +368,8 @@
void *codeloc)
{
void *innerfn = ffi_prep_closure_inner;
+ if (cif->abi != FFI_SYSV)
+ return FFI_BAD_ABI;
FFI_ASSERT (cif->abi == FFI_SYSV);
closure->cif = cif;
closure->user_data = user_data;