Index: libffi/ChangeLog =================================================================== --- libffi.orig/ChangeLog +++ libffi/ChangeLog @@ -50,6 +50,23 @@ * configure: Regenerate. +2011-02-13 Anthony Green + + * include/ffi_common.h (UNLIKELY, LIKELY): Define. + * src/x86/ffi64.c (UNLIKELY, LIKELY): Remove definition. + * src/prep_cif.c (UNLIKELY, LIKELY): Remove definition. + + * src/prep_cif.c (initialize_aggregate): Convert assertion into + FFI_BAD_TYPEDEF return. Initialize arg size and alignment to 0. + + * src/pa/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, + just return FFI_BAD_ABI when things are wrong. + * src/arm/ffi.c (ffi_prep_closure_loc): Ditto. + * src/powerpc/ffi.c (ffi_prep_closure_loc): Ditto. + * src/mips/ffi.c (ffi_prep_closure_loc): Ditto. + * src/ia64/ffi.c (ffi_prep_closure_loc): Ditto. + * src/avr32/ffi.c (ffi_prep_closure_loc): Ditto. + 2011-02-11 Anthony Green * src/sparc/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, Index: libffi/include/ffi_common.h =================================================================== --- libffi.orig/include/ffi_common.h +++ libffi/include/ffi_common.h @@ -1,7 +1,8 @@ /* ----------------------------------------------------------------------- - ffi_common.h - Copyright (c) 1996 Red Hat, Inc. - Copyright (C) 2007 Free Software Foundation, Inc - + ffi_common.h - Copyright (C) 2011 Anthony Green + Copyright (C) 2007 Free Software Foundation, Inc + Copyright (c) 1996 Red Hat, Inc. + Common internal definitions and macros. Only necessary for building libffi. ----------------------------------------------------------------------- */ @@ -112,11 +113,14 @@ typedef signed int SINT64 __attribute_ typedef float FLOAT32; +#ifndef __GNUC__ +#define __builtin_expect(x, expected_value) (x) +#endif +#define LIKELY(x) __builtin_expect((x),1) +#define UNLIKELY(x) __builtin_expect((x),1) #ifdef __cplusplus } #endif #endif - - Index: libffi/src/arm/ffi.c =================================================================== --- libffi.orig/src/arm/ffi.c +++ libffi/src/arm/ffi.c @@ -1,7 +1,9 @@ /* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 1998, 2008, 2011 Red Hat, Inc. - Copyright (c) 2011 Plausible Labs Cooperative, Inc. - + ffi.c - Copyright (c) 2011 Plausible Labs Cooperative, Inc. + Copyright (c) 2011 Anthony Green + Copyright (c) 2011 Free Software Foundation + Copyright (c) 1998, 2008, 2011 Red Hat, Inc. + ARM Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining @@ -586,7 +588,7 @@ ffi_prep_closure_loc (ffi_closure* closu else if (cif->abi == FFI_VFP) closure_func = &ffi_closure_VFP; else - FFI_ASSERT (0); + return FFI_BAD_ABI; #if FFI_EXEC_TRAMPOLINE_TABLE void **config = FFI_TRAMPOLINE_CODELOC_CONFIG(codeloc); Index: libffi/src/avr32/ffi.c =================================================================== --- libffi.orig/src/avr32/ffi.c +++ libffi/src/avr32/ffi.c @@ -1,5 +1,6 @@ /* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2009 Bradley Smith + ffi.c - Copyright (c) 2011 Anthony Green + Copyright (c) 2009 Bradley Smith AVR32 Foreign Function Interface @@ -394,7 +395,8 @@ ffi_status ffi_prep_closure_loc(ffi_clos void (*fun)(ffi_cif*, void*, void**, void*), void *user_data, void *codeloc) { - FFI_ASSERT(cif->abi == FFI_SYSV); + if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; unsigned char *__tramp = (unsigned char*)(&closure->tramp[0]); unsigned int __fun = (unsigned int)(&ffi_closure_SYSV); Index: libffi/src/ia64/ffi.c =================================================================== --- libffi.orig/src/ia64/ffi.c +++ libffi/src/ia64/ffi.c @@ -1,7 +1,8 @@ /* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 1998, 2007, 2008 Red Hat, Inc. - Copyright (c) 2000 Hewlett Packard Company - + ffi.c - Copyright (c) 2011 Anthony Green + Copyright (c) 2000 Hewlett Packard Company + Copyright (c) 1998, 2007, 2008 Red Hat, Inc. + IA64 Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining @@ -425,7 +426,8 @@ ffi_prep_closure_loc (ffi_closure* closu struct ffi_ia64_trampoline_struct *tramp; struct ia64_fd *fd; - FFI_ASSERT (cif->abi == FFI_UNIX); + if (cif->abi != FFI_UNIX) + return FFI_BAD_ABI; tramp = (struct ffi_ia64_trampoline_struct *)closure->tramp; fd = (struct ia64_fd *)(void *)ffi_closure_unix; Index: libffi/src/mips/ffi.c =================================================================== --- libffi.orig/src/mips/ffi.c +++ libffi/src/mips/ffi.c @@ -1,6 +1,7 @@ /* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 1996, 2007, 2008 Red Hat, Inc. - Copyright (c) 2008 David Daney + ffi.c - Copyright (c) 2011 Anthony Green + Copyright (c) 2008 David Daney + Copyright (c) 1996, 2007, 2008, 2011 Red Hat, Inc. MIPS Foreign Function Interface @@ -662,10 +663,12 @@ ffi_prep_closure_loc (ffi_closure *closu char *clear_location = (char *) codeloc; #if defined(FFI_MIPS_O32) - FFI_ASSERT(cif->abi == FFI_O32 || cif->abi == FFI_O32_SOFT_FLOAT); + if (cif->abi != FFI_O32 && cif->abi != FFI_O32_SOFT_FLOAT) + return FFI_BAD_ABI; fn = ffi_closure_O32; #else /* FFI_MIPS_N32 */ - FFI_ASSERT(cif->abi == FFI_N32 || cif->abi == FFI_N64); + if (cif->abi != FFI_N32 && cif->abi != FFI_N64) + return FFI_BAD_ABI; fn = ffi_closure_N32; #endif /* FFI_MIPS_O32 */ Index: libffi/src/pa/ffi.c =================================================================== --- libffi.orig/src/pa/ffi.c +++ libffi/src/pa/ffi.c @@ -1,9 +1,11 @@ /* ----------------------------------------------------------------------- - ffi.c - (c) 2003-2004 Randolph Chung + ffi.c - (c) 2011 Anthony Green (c) 2008 Red Hat, Inc. - + (c) 2006 Free Software Foundation, Inc. + (c) 2003-2004 Randolph Chung + HPPA Foreign Function Interface - HP-UX PA ABI support (c) 2006 Free Software Foundation, Inc. + HP-UX PA ABI support Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -633,7 +635,8 @@ ffi_prep_closure_loc (ffi_closure* closu UINT32 *tmp; #endif - FFI_ASSERT (cif->abi == FFI_PA32); + if (cif->abi != FFI_PA32) + return FFI_BAD_ABI; /* Make a small trampoline that will branch to our handler function. Use PC-relative addressing. */ Index: libffi/src/powerpc/ffi.c =================================================================== --- libffi.orig/src/powerpc/ffi.c +++ libffi/src/powerpc/ffi.c @@ -1,7 +1,8 @@ /* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 1998 Geoffrey Keating - Copyright (C) 2007, 2008 Free Software Foundation, Inc - Copyright (C) 2008 Red Hat, Inc + ffi.c - Copyright (C) 2011 Anthony Green + Copyright (C) 2008 Red Hat, Inc + Copyright (C) 2007, 2008 Free Software Foundation, Inc + Copyright (c) 1998 Geoffrey Keating PowerPC Foreign Function Interface @@ -949,14 +950,16 @@ ffi_prep_closure_loc (ffi_closure *closu #ifdef POWERPC64 void **tramp = (void **) &closure->tramp[0]; - FFI_ASSERT (cif->abi == FFI_LINUX64); + if (cif->abi != FFI_LINUX64) + return FFI_BAD_ABI; /* Copy function address and TOC from ffi_closure_LINUX64. */ memcpy (tramp, (char *) ffi_closure_LINUX64, 16); tramp[2] = codeloc; #else unsigned int *tramp; - FFI_ASSERT (cif->abi == FFI_GCC_SYSV || cif->abi == FFI_SYSV); + if (! (cif->abi == FFI_GCC_SYSV || cif->abi == FFI_SYSV)) + return FFI_BAD_ABI; tramp = (unsigned int *) &closure->tramp[0]; tramp[0] = 0x7c0802a6; /* mflr r0 */ Index: libffi/src/prep_cif.c =================================================================== --- libffi.orig/src/prep_cif.c +++ libffi/src/prep_cif.c @@ -27,12 +27,6 @@ #include #include -#ifndef __GNUC__ -#define __builtin_expect(x, expected_value) (x) -#endif -#define LIKELY(x) __builtin_expect((x),1) -#define UNLIKELY(x) __builtin_expect((x),1) - /* Round up to FFI_SIZEOF_ARG. */ #define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG) @@ -44,11 +38,11 @@ static ffi_status initialize_aggregate(f { ffi_type **ptr; - FFI_ASSERT(arg != NULL); + if (UNLIKELY(arg == NULL || arg->elements == NULL)) + return FFI_BAD_TYPEDEF; - FFI_ASSERT(arg->elements != NULL); - FFI_ASSERT(arg->size == 0); - FFI_ASSERT(arg->alignment == 0); + arg->size = 0; + arg->alignment = 0; ptr = &(arg->elements[0]); Index: libffi/src/x86/ffi64.c =================================================================== --- libffi.orig/src/x86/ffi64.c +++ libffi/src/x86/ffi64.c @@ -1,7 +1,8 @@ /* ----------------------------------------------------------------------- - ffi64.c - Copyright (c) 2002, 2007 Bo Thorsen + ffi64.c - Copyright (c) 20011 Anthony Green Copyright (c) 2008, 2010 Red Hat, Inc. - + Copyright (c) 2002, 2007 Bo Thorsen + x86-64 Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining @@ -28,12 +29,6 @@ #include #include -#ifndef __GNUC__ -#define __builtin_expect(x, expected_value) (x) -#endif -#define LIKELY(x) __builtin_expect((x),1) -#define UNLIKELY(x) __builtin_expect((x),1) - #include #include