From 9ffec43d2bdeebd8a2c9d2c13b0ee8d83314bc52 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Fri, 6 Sep 2024 10:23:31 -0500 Subject: [PATCH] Fix endianess issues on s390x architecture. Endianess code should use memcpy instead of unions. This apparently is more correct on old, optimizing compilers. Technically, this is compilers being really stupid but we work with what we got. That said, this endianess code is more complicated than needed. --- src/core/buffer.c | 64 ++++++++++++++++++++--------------------------- src/core/os.c | 6 +++++ 2 files changed, 33 insertions(+), 37 deletions(-) diff --git a/src/core/buffer.c b/src/core/buffer.c index 2983a0fc..085133ef 100644 --- a/src/core/buffer.c +++ b/src/core/buffer.c @@ -371,17 +371,15 @@ JANET_CORE_FN(cfun_buffer_push_uint16, janet_fixarity(argc, 3); JanetBuffer *buffer = janet_getbuffer(argv, 0); int reverse = should_reverse_bytes(argv, 1); - union { - uint16_t data; - uint8_t bytes[2]; - } u; - u.data = janet_getuinteger16(argv, 2); + uint16_t data = janet_getuinteger16(argv, 2); + uint8_t bytes[sizeof(data)]; + memcpy(bytes, &data, sizeof(bytes)); if (reverse) { - uint8_t temp = u.bytes[1]; - u.bytes[1] = u.bytes[0]; - u.bytes[0] = temp; + uint8_t temp = bytes[1]; + bytes[1] = bytes[0]; + bytes[0] = temp; } - janet_buffer_push_u16(buffer, *(uint16_t *) u.bytes); + janet_buffer_push_bytes(buffer, bytes, sizeof(bytes)); return argv[0]; } @@ -392,14 +390,12 @@ JANET_CORE_FN(cfun_buffer_push_uint32, janet_fixarity(argc, 3); JanetBuffer *buffer = janet_getbuffer(argv, 0); int reverse = should_reverse_bytes(argv, 1); - union { - uint32_t data; - uint8_t bytes[4]; - } u; - u.data = janet_getuinteger(argv, 2); + uint32_t data = janet_getuinteger(argv, 2); + uint8_t bytes[sizeof(data)]; + memcpy(bytes, &data, sizeof(bytes)); if (reverse) - reverse_u32(u.bytes); - janet_buffer_push_u32(buffer, *(uint32_t *) u.bytes); + reverse_u32(bytes); + janet_buffer_push_bytes(buffer, bytes, sizeof(bytes)); return argv[0]; } @@ -410,14 +406,12 @@ JANET_CORE_FN(cfun_buffer_push_uint64, janet_fixarity(argc, 3); JanetBuffer *buffer = janet_getbuffer(argv, 0); int reverse = should_reverse_bytes(argv, 1); - union { - uint64_t data; - uint8_t bytes[8]; - } u; - u.data = janet_getuinteger64(argv, 2); + uint64_t data = janet_getuinteger64(argv, 2); + uint8_t bytes[sizeof(data)]; + memcpy(bytes, &data, sizeof(bytes)); if (reverse) - reverse_u64(u.bytes); - janet_buffer_push_u64(buffer, *(uint64_t *) u.bytes); + reverse_u64(bytes); + janet_buffer_push_bytes(buffer, bytes, sizeof(bytes)); return argv[0]; } @@ -428,14 +422,12 @@ JANET_CORE_FN(cfun_buffer_push_float32, janet_fixarity(argc, 3); JanetBuffer *buffer = janet_getbuffer(argv, 0); int reverse = should_reverse_bytes(argv, 1); - union { - float data; - uint8_t bytes[4]; - } u; - u.data = (float) janet_getnumber(argv, 2); + float data = (float) janet_getnumber(argv, 2); + uint8_t bytes[sizeof(data)]; + memcpy(bytes, &data, sizeof(bytes)); if (reverse) - reverse_u32(u.bytes); - janet_buffer_push_u32(buffer, *(uint32_t *) u.bytes); + reverse_u32(bytes); + janet_buffer_push_bytes(buffer, bytes, sizeof(bytes)); return argv[0]; } @@ -446,14 +438,12 @@ JANET_CORE_FN(cfun_buffer_push_float64, janet_fixarity(argc, 3); JanetBuffer *buffer = janet_getbuffer(argv, 0); int reverse = should_reverse_bytes(argv, 1); - union { - double data; - uint8_t bytes[8]; - } u; - u.data = janet_getnumber(argv, 2); + double data = janet_getnumber(argv, 2); + uint8_t bytes[sizeof(data)]; + memcpy(bytes, &data, sizeof(bytes)); if (reverse) - reverse_u64(u.bytes); - janet_buffer_push_u64(buffer, *(uint64_t *) u.bytes); + reverse_u64(bytes); + janet_buffer_push_bytes(buffer, bytes, sizeof(bytes)); return argv[0]; } diff --git a/src/core/os.c b/src/core/os.c index 18e01b15..d7ffe6da 100644 --- a/src/core/os.c +++ b/src/core/os.c @@ -174,6 +174,8 @@ JANET_CORE_FN(os_arch, "* :riscv64\n\n" "* :sparc\n\n" "* :wasm\n\n" + "* :s390\n\n" + "* :s390x\n\n" "* :unknown\n") { janet_fixarity(argc, 0); (void) argv; @@ -200,6 +202,10 @@ JANET_CORE_FN(os_arch, return janet_ckeywordv("ppc"); #elif (defined(__ppc64__) || defined(_ARCH_PPC64) || defined(_M_PPC)) return janet_ckeywordv("ppc64"); +#elif (defined(__s390x__)) + return janet_ckeywordv("s390x"); +#elif (defined(__s390__)) + return janet_ckeywordv("s390"); #else return janet_ckeywordv("unknown"); #endif