From 20a8f4f7ec2f691e2381a150ac6e246df9c58077 Mon Sep 17 00:00:00 2001 From: Damien George Date: Sat, 5 Jun 2021 22:28:05 +1000 Subject: [PATCH] tests/unix: Add ffi test for integer types. Signed-off-by: Damien George --- tests/unix/ffi_lib.c | 33 +++++++++ tests/unix/ffi_types.py | 51 ++++++++++++++ tests/unix/ffi_types.py.exp | 136 ++++++++++++++++++++++++++++++++++++ tools/ci.sh | 10 +++ 4 files changed, 230 insertions(+) create mode 100644 tests/unix/ffi_lib.c create mode 100644 tests/unix/ffi_types.py create mode 100644 tests/unix/ffi_types.py.exp diff --git a/tests/unix/ffi_lib.c b/tests/unix/ffi_lib.c new file mode 100644 index 000000000..35340536a --- /dev/null +++ b/tests/unix/ffi_lib.c @@ -0,0 +1,33 @@ +#include + +int8_t f8i(int8_t x) { + return x ^ 1; +} + +uint8_t f8u(uint8_t x) { + return x ^ 1; +} + +int16_t f16i(int16_t x) { + return x ^ 1; +} + +uint16_t f16u(uint16_t x) { + return x ^ 1; +} + +int32_t f32i(int32_t x) { + return x ^ 1; +} + +uint32_t f32u(uint32_t x) { + return x ^ 1; +} + +int64_t f64i(int64_t x) { + return x ^ 1; +} + +uint64_t f64u(uint64_t x) { + return x ^ 1; +} diff --git a/tests/unix/ffi_types.py b/tests/unix/ffi_types.py new file mode 100644 index 000000000..fd94c509d --- /dev/null +++ b/tests/unix/ffi_types.py @@ -0,0 +1,51 @@ +# test 8/16/32/64 bit signed/unsigned integer arguments and return types for ffi functions +# requires ffi_lib.c to be compiled as: $(CC) -shared -o ffi_lib.so ffi_lib.c + +import uos, usys + +try: + import ffi +except ImportError: + print("SKIP") + raise SystemExit + +ffi_lib_filename = "./" + usys.argv[0].rsplit("/", 1)[0] + "/ffi_lib.so" +try: + uos.stat(ffi_lib_filename) +except OSError: + print("SKIP") + raise SystemExit + +ffi_lib = ffi.open(ffi_lib_filename) + +f8i = ffi_lib.func("b", "f8i", "b") +f8u = ffi_lib.func("B", "f8u", "B") +f16i = ffi_lib.func("h", "f16i", "h") +f16u = ffi_lib.func("H", "f16u", "H") +f32i = ffi_lib.func("i", "f32i", "i") +f32u = ffi_lib.func("I", "f32u", "I") +f64i = ffi_lib.func("q", "f64i", "q") +f64u = ffi_lib.func("Q", "f64u", "Q") + +for func_name in ("f8i", "f8u", "f16i", "f16u", "f32i", "f32u", "f64i", "f64u"): + func = globals()[func_name] + for val in ( + 0, + 0x7F, + 0x80, + 0xFF, + 0x100, + 0x7FFF, + 0x8000, + 0xFFFF, + 0x10000, + 0x7FFFFFFF, + 0x80000000, + 0xFFFFFFFF, + 0x100000000, + 0x7FFF_FFFF_FFFF_FFFF, + 0x8000_0000_0000_0000, + 0xFFFF_FFFF_FFFF_FFFF, + 0x1_0000_0000_0000_0000, + ): + print("{}({:x}) = {:x}".format(func_name, val, func(val))) diff --git a/tests/unix/ffi_types.py.exp b/tests/unix/ffi_types.py.exp new file mode 100644 index 000000000..d6324477d --- /dev/null +++ b/tests/unix/ffi_types.py.exp @@ -0,0 +1,136 @@ +f8i(0) = 1 +f8i(7f) = 7e +f8i(80) = -7f +f8i(ff) = -2 +f8i(100) = 1 +f8i(7fff) = -2 +f8i(8000) = 1 +f8i(ffff) = -2 +f8i(10000) = 1 +f8i(7fffffff) = -2 +f8i(80000000) = 1 +f8i(ffffffff) = -2 +f8i(100000000) = 1 +f8i(7fffffffffffffff) = -2 +f8i(8000000000000000) = 1 +f8i(ffffffffffffffff) = -2 +f8i(10000000000000000) = 1 +f8u(0) = 1 +f8u(7f) = 7e +f8u(80) = 81 +f8u(ff) = fe +f8u(100) = 1 +f8u(7fff) = fe +f8u(8000) = 1 +f8u(ffff) = fe +f8u(10000) = 1 +f8u(7fffffff) = fe +f8u(80000000) = 1 +f8u(ffffffff) = fe +f8u(100000000) = 1 +f8u(7fffffffffffffff) = fe +f8u(8000000000000000) = 1 +f8u(ffffffffffffffff) = fe +f8u(10000000000000000) = 1 +f16i(0) = 1 +f16i(7f) = 7e +f16i(80) = 81 +f16i(ff) = fe +f16i(100) = 101 +f16i(7fff) = 7ffe +f16i(8000) = -7fff +f16i(ffff) = -2 +f16i(10000) = 1 +f16i(7fffffff) = -2 +f16i(80000000) = 1 +f16i(ffffffff) = -2 +f16i(100000000) = 1 +f16i(7fffffffffffffff) = -2 +f16i(8000000000000000) = 1 +f16i(ffffffffffffffff) = -2 +f16i(10000000000000000) = 1 +f16u(0) = 1 +f16u(7f) = 7e +f16u(80) = 81 +f16u(ff) = fe +f16u(100) = 101 +f16u(7fff) = 7ffe +f16u(8000) = 8001 +f16u(ffff) = fffe +f16u(10000) = 1 +f16u(7fffffff) = fffe +f16u(80000000) = 1 +f16u(ffffffff) = fffe +f16u(100000000) = 1 +f16u(7fffffffffffffff) = fffe +f16u(8000000000000000) = 1 +f16u(ffffffffffffffff) = fffe +f16u(10000000000000000) = 1 +f32i(0) = 1 +f32i(7f) = 7e +f32i(80) = 81 +f32i(ff) = fe +f32i(100) = 101 +f32i(7fff) = 7ffe +f32i(8000) = 8001 +f32i(ffff) = fffe +f32i(10000) = 10001 +f32i(7fffffff) = 7ffffffe +f32i(80000000) = -7fffffff +f32i(ffffffff) = -2 +f32i(100000000) = 1 +f32i(7fffffffffffffff) = -2 +f32i(8000000000000000) = 1 +f32i(ffffffffffffffff) = -2 +f32i(10000000000000000) = 1 +f32u(0) = 1 +f32u(7f) = 7e +f32u(80) = 81 +f32u(ff) = fe +f32u(100) = 101 +f32u(7fff) = 7ffe +f32u(8000) = 8001 +f32u(ffff) = fffe +f32u(10000) = 10001 +f32u(7fffffff) = 7ffffffe +f32u(80000000) = 80000001 +f32u(ffffffff) = fffffffe +f32u(100000000) = 1 +f32u(7fffffffffffffff) = fffffffe +f32u(8000000000000000) = 1 +f32u(ffffffffffffffff) = fffffffe +f32u(10000000000000000) = 1 +f64i(0) = 1 +f64i(7f) = 7e +f64i(80) = 81 +f64i(ff) = fe +f64i(100) = 101 +f64i(7fff) = 7ffe +f64i(8000) = 8001 +f64i(ffff) = fffe +f64i(10000) = 10001 +f64i(7fffffff) = 7ffffffe +f64i(80000000) = 80000001 +f64i(ffffffff) = fffffffe +f64i(100000000) = 100000001 +f64i(7fffffffffffffff) = 7ffffffffffffffe +f64i(8000000000000000) = -7fffffffffffffff +f64i(ffffffffffffffff) = -2 +f64i(10000000000000000) = 1 +f64u(0) = 1 +f64u(7f) = 7e +f64u(80) = 81 +f64u(ff) = fe +f64u(100) = 101 +f64u(7fff) = 7ffe +f64u(8000) = 8001 +f64u(ffff) = fffe +f64u(10000) = 10001 +f64u(7fffffff) = 7ffffffe +f64u(80000000) = 80000001 +f64u(ffffffff) = fffffffe +f64u(100000000) = 100000001 +f64u(7fffffffffffffff) = 7ffffffffffffffe +f64u(8000000000000000) = 8000000000000001 +f64u(ffffffffffffffff) = fffffffffffffffe +f64u(10000000000000000) = 1 diff --git a/tools/ci.sh b/tools/ci.sh index 96c1bf89a..303957332 100755 --- a/tools/ci.sh +++ b/tools/ci.sh @@ -313,6 +313,10 @@ function ci_unix_build_helper { make ${MAKEOPTS} -C ports/unix "$@" } +function ci_unix_build_ffi_lib_helper { + $1 $2 -shared -o tests/unix/ffi_lib.so tests/unix/ffi_lib.c +} + function ci_unix_run_tests_helper { make -C ports/unix "$@" test } @@ -359,6 +363,7 @@ function ci_unix_minimal_run_tests { function ci_unix_standard_build { ci_unix_build_helper VARIANT=standard + ci_unix_build_ffi_lib_helper gcc } function ci_unix_standard_run_tests { @@ -379,6 +384,7 @@ function ci_unix_coverage_setup { function ci_unix_coverage_build { ci_unix_build_helper VARIANT=coverage + ci_unix_build_ffi_lib_helper gcc } function ci_unix_coverage_run_tests { @@ -403,6 +409,7 @@ function ci_unix_32bit_setup { function ci_unix_coverage_32bit_build { ci_unix_build_helper VARIANT=coverage MICROPY_FORCE_32BIT=1 + ci_unix_build_ffi_lib_helper gcc -m32 } function ci_unix_coverage_32bit_run_tests { @@ -416,6 +423,7 @@ function ci_unix_coverage_32bit_run_native_mpy_tests { function ci_unix_nanbox_build { # Use Python 2 to check that it can run the build scripts ci_unix_build_helper PYTHON=python2 VARIANT=nanbox + ci_unix_build_ffi_lib_helper gcc -m32 } function ci_unix_nanbox_run_tests { @@ -424,6 +432,7 @@ function ci_unix_nanbox_run_tests { function ci_unix_float_build { ci_unix_build_helper VARIANT=standard CFLAGS_EXTRA="-DMICROPY_FLOAT_IMPL=MICROPY_FLOAT_IMPL_FLOAT" + ci_unix_build_ffi_lib_helper gcc } function ci_unix_float_run_tests { @@ -521,6 +530,7 @@ function ci_unix_qemu_arm_setup { function ci_unix_qemu_arm_build { ci_unix_build_helper "${CI_UNIX_OPTS_QEMU_ARM[@]}" + ci_unix_build_ffi_lib_helper arm-linux-gnueabi-gcc } function ci_unix_qemu_arm_run_tests {