fix mingw build and crashing bugs for Python Windows ARM64 (#496)

* fix mingw build and crashing bugs for Python Windows ARM64

* Fix issues found in PR review
This commit is contained in:
Paul Monson
2019-08-07 14:57:45 -04:00
committed by Anthony Green
parent e0b4f84fb7
commit c2a6859012
9 changed files with 53 additions and 15 deletions
+9 -3
View File
@@ -666,7 +666,7 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *orig_rvalue,
{
int elems = 4 - (h & 3);
#ifdef _M_ARM64 /* for handling armasm calling convention */
if (cif->isVariadic)
if (cif->is_variadic)
{
if (state.ngrn + elems <= N_X_ARG_REG)
{
@@ -808,7 +808,13 @@ ffi_prep_closure_loc (ffi_closure *closure,
ffi_clear_cache(tramp, tramp + FFI_TRAMPOLINE_SIZE);
/* Also flush the cache for code mapping. */
#ifdef _M_ARM64
// Not using dlmalloc.c for Windows ARM64 builds
// so calling ffi_data_to_code_pointer() isn't necessary
unsigned char *tramp_code = tramp;
#else
unsigned char *tramp_code = ffi_data_to_code_pointer (tramp);
#endif
ffi_clear_cache (tramp_code, tramp_code + FFI_TRAMPOLINE_SIZE);
#endif
@@ -909,7 +915,7 @@ ffi_closure_SYSV_inner (ffi_cif *cif,
{
n = 4 - (h & 3);
#ifdef _M_ARM64 /* for handling armasm calling convention */
if (cif->isVariadic)
if (cif->is_variadic)
{
if (state.ngrn + n <= N_X_ARG_REG)
{
@@ -948,7 +954,7 @@ ffi_closure_SYSV_inner (ffi_cif *cif,
avalue[i] = allocate_to_stack(&state, stack,
ty->alignment, s);
}
#ifdef _M_ARM64 /* for handling armasm calling convention */
#ifdef _M_ARM64 /* for handling armasm calling convention */
}
#endif /* for handling armasm calling convention */
}
+4
View File
@@ -69,6 +69,10 @@ typedef enum ffi_abi
#define FFI_TRAMPOLINE_CLOSURE_OFFSET FFI_TRAMPOLINE_SIZE
#endif
#ifdef _M_ARM64
#define FFI_EXTRA_CIF_FIELDS unsigned is_variadic
#endif
/* ---- Internal ---- */
#if defined (__APPLE__)
+10 -8
View File
@@ -57,12 +57,14 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
x5 closure
*/
NESTED_ENTRY ffi_call_SYSV
/* Use a stack frame allocated by our caller. */
PROLOG_NOP stp x29, x30, [x1, #32]
/* For unwind information, Windows has to store fp and lr */
NESTED_ENTRY ffi_call_SYSV_fake
/* For unwind information, Windows has to store fp and lr */
PROLOG_SAVE_REG_PAIR x29, x30, #-32!
ALTERNATE_ENTRY ffi_call_SYSV
/* Use a stack frame allocated by our caller. */
stp x29, x30, [x1]
mov x29, x1
mov sp, x0
@@ -97,8 +99,8 @@ ffi_call_SYSV_L1
/* Partially deconstruct the stack frame. */
mov sp, x29
ldp x29, x30, [x29, #32]
ldp x29, x30, [x29]
/* Save the return value as directed. */
adr x5, ffi_call_SYSV_return
and w4, w4, #AARCH64_RET_MASK
@@ -177,7 +179,7 @@ ffi_call_SYSV_return
nop
NESTED_END ffi_call_SYSV
NESTED_END ffi_call_SYSV_fake
/* ffi_closure_SYSV
+2 -2
View File
@@ -129,8 +129,8 @@ ffi_status FFI_HIDDEN ffi_prep_cif_core(ffi_cif *cif, ffi_abi abi,
cif->rtype = rtype;
cif->flags = 0;
#ifdef _M_ARM64
cif->isVariadic = isvariadic;
#ifdef _M_ARM64
cif->is_variadic = isvariadic;
#endif
#if HAVE_LONG_DOUBLE_VARIANT
ffi_prep_types (abi);