Commit 11efd790 authored by Paul Monson's avatar Paul Monson Committed by Steve Dower

bpo-36071 Add support for Windows ARM32 in ctypes/libffi (GH-12059)

parent 264a0b40
...@@ -427,7 +427,7 @@ extern "C" { ...@@ -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; ...@@ -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, ...@@ -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) ...@@ -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, ...@@ -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) ...@@ -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 ...@@ -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 ...@@ -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. ...@@ -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 ...@@ -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 ...@@ -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. ...@@ -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" ( ...@@ -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%
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment