[Python-checkins] r60358 - python/trunk/Modules/_ctypes/libffi/src/alpha/ffi.c python/trunk/Modules/_ctypes/libffi/src/alpha/osf.S

neal.norwitz python-checkins at python.org
Sun Jan 27 18:10:43 CET 2008


Author: neal.norwitz
Date: Sun Jan 27 18:10:43 2008
New Revision: 60358
Modified:
 python/trunk/Modules/_ctypes/libffi/src/alpha/ffi.c
 python/trunk/Modules/_ctypes/libffi/src/alpha/osf.S
Log:
Update to newer version of ffi. Fixes crashes and test failures of longdouble
Modified: python/trunk/Modules/_ctypes/libffi/src/alpha/ffi.c
==============================================================================
--- python/trunk/Modules/_ctypes/libffi/src/alpha/ffi.c	(original)
+++ python/trunk/Modules/_ctypes/libffi/src/alpha/ffi.c	Sun Jan 27 18:10:43 2008
@@ -25,11 +25,22 @@
 
 #include <ffi.h>
 #include <ffi_common.h>
-
 #include <stdlib.h>
 
-extern void ffi_call_osf(void *, unsigned long, unsigned, void *, void (*)(void));
-extern void ffi_closure_osf(void);
+/* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE;
+ all further uses in this file will refer to the 128-bit type. */
+#if defined(__LONG_DOUBLE_128__)
+# if FFI_TYPE_LONGDOUBLE != 4
+# error FFI_TYPE_LONGDOUBLE out of date
+# endif
+#else
+# undef FFI_TYPE_LONGDOUBLE
+# define FFI_TYPE_LONGDOUBLE 4
+#endif
+
+extern void ffi_call_osf(void *, unsigned long, unsigned, void *, void (*)(void))
+ FFI_HIDDEN;
+extern void ffi_closure_osf(void) FFI_HIDDEN;
 
 
 ffi_status
@@ -49,6 +60,11 @@
 cif->flags = cif->rtype->type;
 break;
 
+ case FFI_TYPE_LONGDOUBLE:
+ /* 128-bit long double is returned in memory, like a struct. */
+ cif->flags = FFI_TYPE_STRUCT;
+ break;
+
 default:
 cif->flags = FFI_TYPE_INT;
 break;
@@ -57,6 +73,7 @@
 return FFI_OK;
 }
 
+
 void
 ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
 {
@@ -64,8 +81,6 @@
 long i, avn;
 ffi_type **arg_types;
 
- FFI_ASSERT (cif->abi == FFI_OSF);
-
 /* If the return value is a struct and we don't have a return
 value address then we need to make one. */
 if (rvalue == NULL && cif->flags == FFI_TYPE_STRUCT)
@@ -84,6 +99,8 @@
 
 while (i < avn)
 {
+ size_t size = (*arg_types)->size;
+
 switch ((*arg_types)->type)
 	{
 	case FFI_TYPE_SINT8:
@@ -129,6 +146,12 @@
 	 *(double *) argp = *(double *)(* avalue);
 	 break;
 
+	case FFI_TYPE_LONGDOUBLE:
+	 /* 128-bit long double is passed by reference. */
+	 *(long double **) argp = (long double *)(* avalue);
+	 size = sizeof (long double *);
+	 break;
+
 	case FFI_TYPE_STRUCT:
 	 memcpy(argp, *avalue, (*arg_types)->size);
 	 break;
@@ -137,7 +160,7 @@
 	 FFI_ASSERT(0);
 	}
 
- argp += ALIGN((*arg_types)->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
+ argp += ALIGN(size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
 i++, arg_types++, avalue++;
 }
 
@@ -153,8 +176,6 @@
 {
 unsigned int *tramp;
 
- FFI_ASSERT (cif->abi == FFI_OSF);
-
 tramp = (unsigned int *) &closure->tramp[0];
 tramp[0] = 0x47fb0401;	/* mov 27,ドル1ドル		*/
 tramp[1] = 0xa77b0010;	/* ldq 27,16ドル(27ドル)	*/
@@ -177,7 +198,8 @@
 return FFI_OK;
 }
 
-int
+
+long FFI_HIDDEN
 ffi_closure_osf_inner(ffi_closure *closure, void *rvalue, unsigned long *argp)
 {
 ffi_cif *cif;
@@ -205,6 +227,8 @@
 /* Grab the addresses of the arguments from the stack frame. */
 while (i < avn)
 {
+ size_t size = arg_types[i]->size;
+
 switch (arg_types[i]->type)
 	{
 	case FFI_TYPE_SINT8:
@@ -236,16 +260,22 @@
 	 avalue[i] = &argp[argn - (argn < 6 ? 6 : 0)];
 	 break;
 
+	case FFI_TYPE_LONGDOUBLE:
+	 /* 128-bit long double is passed by reference. */
+	 avalue[i] = (long double *) argp[argn];
+	 size = sizeof (long double *);
+	 break;
+
 	default:
-	 FFI_ASSERT(0);
+	 abort ();
 	}
 
- argn += ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
+ argn += ALIGN(size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
 i++;
 }
 
 /* Invoke the closure. */
- (closure->fun) (cif, rvalue, avalue, closure->user_data);
+ closure->fun (cif, rvalue, avalue, closure->user_data);
 
 /* Tell ffi_closure_osf how to perform return type promotions. */
 return cif->rtype->type;
Modified: python/trunk/Modules/_ctypes/libffi/src/alpha/osf.S
==============================================================================
--- python/trunk/Modules/_ctypes/libffi/src/alpha/osf.S	(original)
+++ python/trunk/Modules/_ctypes/libffi/src/alpha/osf.S	Sun Jan 27 18:10:43 2008
@@ -1,10 +1,8 @@
 /* -----------------------------------------------------------------------
- osf.S - Copyright (c) 1998, 2001 Red Hat
+ osf.S - Copyright (c) 1998, 2001, 2007 Red Hat
 
 Alpha/OSF Foreign Function Interface 
 
- $Id: osf.S,v 1.2 2006年03月03日 20:24:26 theller Exp $
-
 Permission is hereby granted, free of charge, to any person obtaining
 a copy of this software and associated documentation files (the
 ``Software''), to deal in the Software without restriction, including
@@ -42,6 +40,8 @@
 	.align	3
 	.globl	ffi_call_osf
 	.ent	ffi_call_osf
+	FFI_HIDDEN(ffi_call_osf)
+
 ffi_call_osf:
 	.frame	15,ドル 32, 26,ドル 0
 	.mask 0x4008000, -32
@@ -129,6 +129,8 @@
 	.align	3
 	.globl	ffi_closure_osf
 	.ent	ffi_closure_osf
+	FFI_HIDDEN(ffi_closure_osf)
+
 ffi_closure_osf:
 	.frame	30,ドル 16*8, 26,ドル 0
 	.mask	0x4000000, -16*8
@@ -265,7 +267,7 @@
 	.gprel32 $load_32	# FFI_TYPE_INT
 	.gprel32 $load_float	# FFI_TYPE_FLOAT
 	.gprel32 $load_double	# FFI_TYPE_DOUBLE
-	.gprel32 $load_double	# FFI_TYPE_LONGDOUBLE
+	.gprel32 $load_none	# FFI_TYPE_LONGDOUBLE
 	.gprel32 $load_u8	# FFI_TYPE_UINT8
 	.gprel32 $load_s8	# FFI_TYPE_SINT8
 	.gprel32 $load_u16	# FFI_TYPE_UINT16


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /