From f92aac14aa711d0635c66b3bf40edd99a1ecdc6a Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Wed, 8 Jun 2022 09:50:31 -0500 Subject: [PATCH] Only enable FFI on x86-64, non-windows OSes. --- ffitest/so.c | 22 +++++++++++----------- src/core/ffi.c | 24 ++++++++++++------------ src/include/janet.h | 5 ++++- 3 files changed, 27 insertions(+), 24 deletions(-) diff --git a/ffitest/so.c b/ffitest/so.c index a38c03d1..9c18b50a 100644 --- a/ffitest/so.c +++ b/ffitest/so.c @@ -19,17 +19,17 @@ double double_many(double x, double y, double z, double w, double a, double b) { } double double_lots( - double a, - double b, - double c, - double d, - double e, - double f, - double g, - double h, - double i, - double j) { - return i + j; + double a, + double b, + double c, + double d, + double e, + double f, + double g, + double h, + double i, + double j) { + return i + j; } double float_fn(float x, float y, float z) { diff --git a/src/core/ffi.c b/src/core/ffi.c index 37a8c789..89230ab9 100644 --- a/src/core/ffi.c +++ b/src/core/ffi.c @@ -162,9 +162,9 @@ static int is_fp_type(JanetFFIPrimType prim) { } JANET_CORE_FN(cfun_ffi_signature, - "(native-signature calling-convention ret-type & arg-types)", - "Create a function signature object that can be used to make calls " - "with raw function pointers.") { + "(native-signature calling-convention ret-type & arg-types)", + "Create a function signature object that can be used to make calls " + "with raw function pointers.") { janet_arity(argc, 2, -1); uint32_t frame_size = 0; uint32_t reg_count = 0; @@ -214,7 +214,7 @@ JANET_CORE_FN(cfun_ffi_signature, frame_size += janet_ffi_type_info[ptype].size; } } - + /* Create signature abstract value */ JanetFFISignature *abst = janet_abstract(&janet_signature_type, sizeof(JanetFFISignature)); abst->frame_size = frame_size; @@ -232,7 +232,7 @@ JANET_CORE_FN(cfun_ffi_signature, } static void *janet_ffi_getpointer(const Janet *argv, int32_t n) { - switch(janet_type(argv[n])) { + switch (janet_type(argv[n])) { default: janet_panicf("bad slot #%d, expected pointer convertable type, got %v", argv[n]); case JANET_POINTER: @@ -343,7 +343,7 @@ static Janet janet_ffi_sysv64(JanetFFISignature *signature, void *function_point } uint64_t *stack = alloca(sizeof(uint64_t) * signature->stack_count); for (uint32_t i = 0; i < signature->stack_count; i++) { - stack[signature->stack_count - 1 - i] = janet_ffi_reg64(argv, signature->stack[i]); + stack[signature->stack_count - 1 - i] = janet_ffi_reg64(argv, signature->stack[i]); } /* !!ACHTUNG!! */ @@ -383,9 +383,9 @@ static Janet janet_ffi_sysv64(JanetFFISignature *signature, void *function_point switch (signature->variant) { default: - /* fallthrough */ + /* fallthrough */ case 0: - __asm__( FFI_ASM_PRELUDE + __asm__(FFI_ASM_PRELUDE "call *%2\n\t" "mov %%rax, %0\n\t" "mov %%rdx, %1" @@ -394,7 +394,7 @@ static Janet janet_ffi_sysv64(JanetFFISignature *signature, void *function_point : "rax", "rdi", "rsi", "rdx", "rcx", "r8", "r9", "r10", "r11"); return janet_ffi_from64(ret, signature->ret_type); case 1: - __asm__( FFI_ASM_PRELUDE + __asm__(FFI_ASM_PRELUDE "call *%2\n\t" "movq %%xmm0, %0\n\t" "movq %%xmm1, %1" @@ -412,9 +412,9 @@ static Janet janet_ffi_sysv64(JanetFFISignature *signature, void *function_point } JANET_CORE_FN(cfun_ffi_call, - "(native-call pointer signature & args)", - "Call a raw pointer as a function pointer. The function signature specifies " - "how Janet values in `args` are converted to native machine types.") { + "(native-call pointer signature & args)", + "Call a raw pointer as a function pointer. The function signature specifies " + "how Janet values in `args` are converted to native machine types.") { janet_arity(argc, 2, -1); void *function_pointer = janet_getpointer(argv, 0); JanetFFISignature *signature = janet_getabstract(argv, 1, &janet_signature_type); diff --git a/src/include/janet.h b/src/include/janet.h index b24493b6..9f93ddb5 100644 --- a/src/include/janet.h +++ b/src/include/janet.h @@ -163,10 +163,13 @@ extern "C" { #define JANET_DYNAMIC_MODULES #endif -/* Enable or disable the FFI library. */ +/* Enable or disable the FFI library. Currently, FFI only enabled on + * x86-64, non-windows operating systems. */ #ifndef JANET_NO_FFI +#if !defined(JANET_WINDOWS) && (defined(__x86_64__) || defined(_M_X64)) #define JANET_FFI #endif +#endif /* Enable or disable the assembler. Enabled by default. */ #ifndef JANET_NO_ASSEMBLER