]> granicus.if.org Git - python/commitdiff
bpo-36071 Add support for Windows ARM32 in ctypes/libffi (GH-12059)
authorPaul Monson <paulmon@users.noreply.github.com>
Thu, 18 Apr 2019 01:09:16 +0000 (18:09 -0700)
committerSteve Dower <steve.dower@microsoft.com>
Thu, 18 Apr 2019 01:09:16 +0000 (18:09 -0700)
Include/pyport.h
Include/pythonrun.h
Modules/_ctypes/callbacks.c
Modules/_ctypes/callproc.c
Modules/_ctypes/malloc_closure.c
PCbuild/pcbuild.sln
PCbuild/prepare_libffi.bat

index 075b36028b8a06b0026ef9428e9842a622632a67..acbae5bafeb512a71a38ac0cbc9167cc0e40b22c 100644 (file)
@@ -427,7 +427,7 @@ extern "C" {
 #endif
 
 /* 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 _Py_SET_53BIT_PRECISION_HEADER \
     unsigned int old_387controlword, new_387controlword, out_387controlword
index 6f0c6fc6554379ceaabcd303dae913198c33b2d8..e83846add981cd7ec9190e4bcdf85c326b61c47e 100644 (file)
@@ -165,7 +165,7 @@ PyAPI_DATA(PyThreadState*) _PyOS_ReadlineTState;
    to an 8k margin. */
 #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 */
 #define USE_STACKCHECK
 #endif
index 2b7cb06ea8a95b8c0fa5d4f0e4cb4e0f09e53faf..9f793c2771bfb9ef4294b89345e31c016eb524e8 100644 (file)
@@ -380,7 +380,7 @@ CThunkObject *_ctypes_alloc_callback(PyObject *callable,
     }
 
     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)
         cc = FFI_STDCALL;
 #endif
index 5a943d3c37081efde2b023475116e2fdf23fb40f..1ad842eb3d4098ac8c2262dfc985361e32e77fd4 100644 (file)
@@ -737,12 +737,17 @@ of 1, 2, 4, 8, 16, 32, or 64 bits
 */
 int can_return_struct_as_int(size_t s)
 {
-  return s == 1 || s == 2 || s == 4;
+    return s == 1 || s == 2 || s == 4;
 }
 
 int can_return_struct_as_sint64(size_t s)
 {
-  return s == 8;
+#ifdef _M_ARM
+    // 8 byte structs cannot be returned in a register on ARM32
+    return 0;
+#else
+    return s == 8;
+#endif
 }
 #endif
 
@@ -807,7 +812,7 @@ static int _call_function_pointer(int flags,
     }
 
     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)
         cc = FFI_STDCALL;
 #endif
index 8ad76497c7b3f25aad00f24c21309fef082949d8..f9cdb336958c6f352fc003257578988bb98c39d0 100644 (file)
@@ -106,6 +106,11 @@ void *ffi_closure_alloc(size_t ignored, void** codeloc)
         return NULL;
     item = free_list;
     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;
+#endif
     return (void *)item;
 }
index 1bbfd180df14a0b039ff0a90502e70375ba32bfa..e9239365b5c1afa1d244a78c0ee3acb377e7e79f 100644 (file)
@@ -238,6 +238,7 @@ Global
                {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-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.Build.0 = Debug|Win32
                {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.Build.0 = PGUpdate|x64
                {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.Build.0 = Release|Win32
                {0E9791DB-593A-465F-98BC-681011311618}.Release|x64.ActiveCfg = Release|x64
index 3df85130f48adb530b5846f6cc6de79456d920ba..307739d874a2130bc6dd98509ab3c2cc21647463 100644 (file)
@@ -24,6 +24,7 @@ echo.
 echo.Available flags:
 echo.  -x64    build for x64
 echo.  -x86    build for x86
+echo.  -arm32  build for arm32
 echo.  -?      this help
 echo.  --install-cygwin  install cygwin to c:\cygwin
 exit /b 127
@@ -32,12 +33,14 @@ exit /b 127
 
 set BUILD_X64=
 set BUILD_X86=
+set BUILD_ARM32=
 set INSTALL_CYGWIN=
 
 :CheckOpts
 if "%1"=="" goto :CheckOptsDone
 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"=="-arm32" (set BUILD_ARM32=1) & shift & goto :CheckOpts
 if /I "%1"=="-?" goto :Usage
 if /I "%1"=="--install-cygwin" (set INSTALL_CYGWIN=1) & shift & goto :CheckOpts
 goto :Usage
@@ -47,6 +50,7 @@ goto :Usage
 if NOT DEFINED BUILD_X64 if NOT DEFINED BUILD_X86 if NOT DEFINED BUILD_ARM32 (
     set BUILD_X64=1
     set BUILD_X86=1
+    set BUILD_ARM32=1
 )
 
 if "%INSTALL_CYGWIN%"=="1" call :InstallCygwin
@@ -83,8 +87,9 @@ echo.
 
 if not exist Makefile.in (%SH% -lc "(cd $LIBFFI_SOURCE; ./autogen.sh;)")
 
-call :BuildOne x86 i686-pc-cygwin i686-pc-cygwin
-call :BuildOne x64 x86_64-w64-cygwin x86_64-w64-cygwin
+if "%BUILD_X64%"=="1" 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
 endlocal
@@ -118,6 +123,12 @@ if /I "%VCVARS_PLATFORM%" EQU "x86" (
     set ASSEMBLER=
     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
 set _LIBFFI_OUT=%LIBFFI_OUT%\%ARCH%