mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	bpo-36071 Add support for Windows ARM32 in ctypes/libffi (GH-12059)
This commit is contained in:
		
							parent
							
								
									264a0b40b0
								
							
						
					
					
						commit
						11efd79076
					
				
					 7 changed files with 31 additions and 8 deletions
				
			
		| 
						 | 
					@ -427,7 +427,7 @@ extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* get and set x87 control word for VisualStudio/x86 */
 | 
					/* get and set x87 control word for VisualStudio/x86 */
 | 
				
			||||||
#if defined(_MSC_VER) && defined(_M_IX86) /* x87 only supported in x86 */
 | 
					#if defined(_MSC_VER) && !defined(_WIN64) && !defined(_M_ARM) /* x87 not supported in 64-bit or ARM */
 | 
				
			||||||
#define HAVE_PY_SET_53BIT_PRECISION 1
 | 
					#define HAVE_PY_SET_53BIT_PRECISION 1
 | 
				
			||||||
#define _Py_SET_53BIT_PRECISION_HEADER \
 | 
					#define _Py_SET_53BIT_PRECISION_HEADER \
 | 
				
			||||||
    unsigned int old_387controlword, new_387controlword, out_387controlword
 | 
					    unsigned int old_387controlword, new_387controlword, out_387controlword
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -165,7 +165,7 @@ PyAPI_DATA(PyThreadState*) _PyOS_ReadlineTState;
 | 
				
			||||||
   to an 8k margin. */
 | 
					   to an 8k margin. */
 | 
				
			||||||
#define PYOS_STACK_MARGIN 2048
 | 
					#define PYOS_STACK_MARGIN 2048
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(WIN32) && !defined(MS_WIN64) && defined(_MSC_VER) && _MSC_VER >= 1300
 | 
					#if defined(WIN32) && !defined(MS_WIN64) && !defined(_M_ARM) && defined(_MSC_VER) && _MSC_VER >= 1300
 | 
				
			||||||
/* Enable stack checking under Microsoft C */
 | 
					/* Enable stack checking under Microsoft C */
 | 
				
			||||||
#define USE_STACKCHECK
 | 
					#define USE_STACKCHECK
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -380,7 +380,7 @@ CThunkObject *_ctypes_alloc_callback(PyObject *callable,
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cc = FFI_DEFAULT_ABI;
 | 
					    cc = FFI_DEFAULT_ABI;
 | 
				
			||||||
#if defined(MS_WIN32) && !defined(_WIN32_WCE) && !defined(MS_WIN64)
 | 
					#if defined(MS_WIN32) && !defined(_WIN32_WCE) && !defined(MS_WIN64) && !defined(_M_ARM)
 | 
				
			||||||
    if ((flags & FUNCFLAG_CDECL) == 0)
 | 
					    if ((flags & FUNCFLAG_CDECL) == 0)
 | 
				
			||||||
        cc = FFI_STDCALL;
 | 
					        cc = FFI_STDCALL;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -742,7 +742,12 @@ int can_return_struct_as_int(size_t s)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int can_return_struct_as_sint64(size_t s)
 | 
					int can_return_struct_as_sint64(size_t s)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					#ifdef _M_ARM
 | 
				
			||||||
 | 
					    // 8 byte structs cannot be returned in a register on ARM32
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
    return s == 8;
 | 
					    return s == 8;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -807,7 +812,7 @@ static int _call_function_pointer(int flags,
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cc = FFI_DEFAULT_ABI;
 | 
					    cc = FFI_DEFAULT_ABI;
 | 
				
			||||||
#if defined(MS_WIN32) && !defined(MS_WIN64) && !defined(_WIN32_WCE)
 | 
					#if defined(MS_WIN32) && !defined(MS_WIN64) && !defined(_WIN32_WCE) && !defined(_M_ARM)
 | 
				
			||||||
    if ((flags & FUNCFLAG_CDECL) == 0)
 | 
					    if ((flags & FUNCFLAG_CDECL) == 0)
 | 
				
			||||||
        cc = FFI_STDCALL;
 | 
					        cc = FFI_STDCALL;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -106,6 +106,11 @@ void *ffi_closure_alloc(size_t ignored, void** codeloc)
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
    item = free_list;
 | 
					    item = free_list;
 | 
				
			||||||
    free_list = item->next;
 | 
					    free_list = item->next;
 | 
				
			||||||
 | 
					#ifdef _M_ARM
 | 
				
			||||||
 | 
					    // set Thumb bit so that blx is called correctly
 | 
				
			||||||
 | 
					    *codeloc = (ITEM*)((uintptr_t)item | 1);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
    *codeloc = (void *)item;
 | 
					    *codeloc = (void *)item;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    return (void *)item;
 | 
					    return (void *)item;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -238,6 +238,7 @@ Global
 | 
				
			||||||
		{0E9791DB-593A-465F-98BC-681011311617}.Release|x64.ActiveCfg = Release|x64
 | 
							{0E9791DB-593A-465F-98BC-681011311617}.Release|x64.ActiveCfg = Release|x64
 | 
				
			||||||
		{0E9791DB-593A-465F-98BC-681011311617}.Release|x64.Build.0 = Release|x64
 | 
							{0E9791DB-593A-465F-98BC-681011311617}.Release|x64.Build.0 = Release|x64
 | 
				
			||||||
		{0E9791DB-593A-465F-98BC-681011311618}.Debug|ARM.ActiveCfg = Debug|ARM
 | 
							{0E9791DB-593A-465F-98BC-681011311618}.Debug|ARM.ActiveCfg = Debug|ARM
 | 
				
			||||||
 | 
							{0E9791DB-593A-465F-98BC-681011311618}.Debug|ARM.Build.0 = Debug|ARM
 | 
				
			||||||
		{0E9791DB-593A-465F-98BC-681011311618}.Debug|Win32.ActiveCfg = Debug|Win32
 | 
							{0E9791DB-593A-465F-98BC-681011311618}.Debug|Win32.ActiveCfg = Debug|Win32
 | 
				
			||||||
		{0E9791DB-593A-465F-98BC-681011311618}.Debug|Win32.Build.0 = Debug|Win32
 | 
							{0E9791DB-593A-465F-98BC-681011311618}.Debug|Win32.Build.0 = Debug|Win32
 | 
				
			||||||
		{0E9791DB-593A-465F-98BC-681011311618}.Debug|x64.ActiveCfg = Debug|x64
 | 
							{0E9791DB-593A-465F-98BC-681011311618}.Debug|x64.ActiveCfg = Debug|x64
 | 
				
			||||||
| 
						 | 
					@ -255,6 +256,7 @@ Global
 | 
				
			||||||
		{0E9791DB-593A-465F-98BC-681011311618}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
 | 
							{0E9791DB-593A-465F-98BC-681011311618}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
 | 
				
			||||||
		{0E9791DB-593A-465F-98BC-681011311618}.PGUpdate|x64.Build.0 = PGUpdate|x64
 | 
							{0E9791DB-593A-465F-98BC-681011311618}.PGUpdate|x64.Build.0 = PGUpdate|x64
 | 
				
			||||||
		{0E9791DB-593A-465F-98BC-681011311618}.Release|ARM.ActiveCfg = Release|ARM
 | 
							{0E9791DB-593A-465F-98BC-681011311618}.Release|ARM.ActiveCfg = Release|ARM
 | 
				
			||||||
 | 
							{0E9791DB-593A-465F-98BC-681011311618}.Release|ARM.Build.0 = Release|ARM
 | 
				
			||||||
		{0E9791DB-593A-465F-98BC-681011311618}.Release|Win32.ActiveCfg = Release|Win32
 | 
							{0E9791DB-593A-465F-98BC-681011311618}.Release|Win32.ActiveCfg = Release|Win32
 | 
				
			||||||
		{0E9791DB-593A-465F-98BC-681011311618}.Release|Win32.Build.0 = Release|Win32
 | 
							{0E9791DB-593A-465F-98BC-681011311618}.Release|Win32.Build.0 = Release|Win32
 | 
				
			||||||
		{0E9791DB-593A-465F-98BC-681011311618}.Release|x64.ActiveCfg = Release|x64
 | 
							{0E9791DB-593A-465F-98BC-681011311618}.Release|x64.ActiveCfg = Release|x64
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,6 +24,7 @@ echo.
 | 
				
			||||||
echo.Available flags:
 | 
					echo.Available flags:
 | 
				
			||||||
echo.  -x64    build for x64
 | 
					echo.  -x64    build for x64
 | 
				
			||||||
echo.  -x86    build for x86
 | 
					echo.  -x86    build for x86
 | 
				
			||||||
 | 
					echo.  -arm32  build for arm32
 | 
				
			||||||
echo.  -?      this help
 | 
					echo.  -?      this help
 | 
				
			||||||
echo.  --install-cygwin  install cygwin to c:\cygwin
 | 
					echo.  --install-cygwin  install cygwin to c:\cygwin
 | 
				
			||||||
exit /b 127
 | 
					exit /b 127
 | 
				
			||||||
| 
						 | 
					@ -32,12 +33,14 @@ exit /b 127
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set BUILD_X64=
 | 
					set BUILD_X64=
 | 
				
			||||||
set BUILD_X86=
 | 
					set BUILD_X86=
 | 
				
			||||||
 | 
					set BUILD_ARM32=
 | 
				
			||||||
set INSTALL_CYGWIN=
 | 
					set INSTALL_CYGWIN=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:CheckOpts
 | 
					:CheckOpts
 | 
				
			||||||
if "%1"=="" goto :CheckOptsDone
 | 
					if "%1"=="" goto :CheckOptsDone
 | 
				
			||||||
if /I "%1"=="-x64" (set BUILD_X64=1) & shift & goto :CheckOpts
 | 
					if /I "%1"=="-x64" (set BUILD_X64=1) & shift & goto :CheckOpts
 | 
				
			||||||
if /I "%1"=="-x86" (set BUILD_X86=1) & shift & goto :CheckOpts
 | 
					if /I "%1"=="-x86" (set BUILD_X86=1) & shift & goto :CheckOpts
 | 
				
			||||||
 | 
					if /I "%1"=="-arm32" (set BUILD_ARM32=1) & shift & goto :CheckOpts
 | 
				
			||||||
if /I "%1"=="-?" goto :Usage
 | 
					if /I "%1"=="-?" goto :Usage
 | 
				
			||||||
if /I "%1"=="--install-cygwin" (set INSTALL_CYGWIN=1) & shift & goto :CheckOpts
 | 
					if /I "%1"=="--install-cygwin" (set INSTALL_CYGWIN=1) & shift & goto :CheckOpts
 | 
				
			||||||
goto :Usage
 | 
					goto :Usage
 | 
				
			||||||
| 
						 | 
					@ -47,6 +50,7 @@ goto :Usage
 | 
				
			||||||
if NOT DEFINED BUILD_X64 if NOT DEFINED BUILD_X86 if NOT DEFINED BUILD_ARM32 (
 | 
					if NOT DEFINED BUILD_X64 if NOT DEFINED BUILD_X86 if NOT DEFINED BUILD_ARM32 (
 | 
				
			||||||
    set BUILD_X64=1
 | 
					    set BUILD_X64=1
 | 
				
			||||||
    set BUILD_X86=1
 | 
					    set BUILD_X86=1
 | 
				
			||||||
 | 
					    set BUILD_ARM32=1
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if "%INSTALL_CYGWIN%"=="1" call :InstallCygwin
 | 
					if "%INSTALL_CYGWIN%"=="1" call :InstallCygwin
 | 
				
			||||||
| 
						 | 
					@ -83,8 +87,9 @@ echo.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if not exist Makefile.in (%SH% -lc "(cd $LIBFFI_SOURCE; ./autogen.sh;)")
 | 
					if not exist Makefile.in (%SH% -lc "(cd $LIBFFI_SOURCE; ./autogen.sh;)")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
call :BuildOne x86 i686-pc-cygwin i686-pc-cygwin
 | 
					if "%BUILD_X64%"=="1" call :BuildOne x64 x86_64-w64-cygwin x86_64-w64-cygwin
 | 
				
			||||||
call :BuildOne x64 x86_64-w64-cygwin x86_64-w64-cygwin
 | 
					if "%BUILD_X86%"=="1" call :BuildOne x86 i686-pc-cygwin i686-pc-cygwin
 | 
				
			||||||
 | 
					if "%BUILD_ARM32%"=="1" call :BuildOne x86_arm i686-pc-cygwin arm-w32-cygwin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
popd
 | 
					popd
 | 
				
			||||||
endlocal
 | 
					endlocal
 | 
				
			||||||
| 
						 | 
					@ -118,6 +123,12 @@ if /I "%VCVARS_PLATFORM%" EQU "x86" (
 | 
				
			||||||
    set ASSEMBLER=
 | 
					    set ASSEMBLER=
 | 
				
			||||||
    set SRC_ARCHITECTURE=x86
 | 
					    set SRC_ARCHITECTURE=x86
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					if /I "%VCVARS_PLATFORM%" EQU "x86_arm" (
 | 
				
			||||||
 | 
					    set ARCH=arm32
 | 
				
			||||||
 | 
					    set ARTIFACTS=%LIBFFI_SOURCE%\arm-w32-cygwin
 | 
				
			||||||
 | 
					    set ASSEMBLER=-marm
 | 
				
			||||||
 | 
					    set SRC_ARCHITECTURE=ARM
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if NOT DEFINED LIBFFI_OUT set LIBFFI_OUT=%~dp0\..\externals\libffi
 | 
					if NOT DEFINED LIBFFI_OUT set LIBFFI_OUT=%~dp0\..\externals\libffi
 | 
				
			||||||
set _LIBFFI_OUT=%LIBFFI_OUT%\%ARCH%
 | 
					set _LIBFFI_OUT=%LIBFFI_OUT%\%ARCH%
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue