On 2024/03/07 10:28, Mark Kettenis wrote: > This version looks best to me. But I suspect arm64 needs more work in > this version too.
I tried to give it a spin with gnustep-based software, but no gnustep-base package is available for arm64 yet (I suspect because of the previous bugs in the libobjc2 port). If I try to build gnustep-base myself it fails with BTI SIGILL during autoconf when doing a test for libffi, so it looks like we're probably missing something in libffi (tobhe fixed some things last November). I'm not getting useful backtraces so not sure where in libffi it's needed. Test program from libobjc2's autoconf files attached: $ cc -I/usr/local/include -L/usr/local/lib config.ffi.c -lffi $ ktrace ./a.out a Illegal instruction (core dumped) $ kdump | tail 5909 a.out RET mmap 29349658624/0x6d5604000 5909 a.out CALL fcntl(1,F_ISATTY) 5909 a.out RET fcntl 1 5909 a.out CALL write(1,0x6d5604000,0x2) 5909 a.out GIO fd 1 wrote 2 bytes "a " 5909 a.out RET write 2 5909 a.out PSIG SIGILL SIG_DFL code=ILL_BTCFI addr=0x6e74fe010 trapno=905969666 5909 a.out NAMI "a.out.core" "make test" in libffi runs ok, but picking another consumber of libffi I tried "make test" in guile3, and that has SIGILLs too.
#include <stdio.h> #include <stdlib.h> #include <ffi.h> typedef struct cls_struct_combined { float a; float b; float c; float d; } cls_struct_combined; void cls_struct_combined_fn(struct cls_struct_combined arg) { /* printf("GOT %g %g %g %g, EXPECTED 4 5 1 8\n", arg.a, arg.b, arg.c, arg.d); fflush(stdout); */ if (arg.a != 4 || arg.b != 5 || arg.c != 1 || arg.d != 8) abort(); } static void cls_struct_combined_gn(ffi_cif* cif, void* resp, void** args, void* userdata) { struct cls_struct_combined a0; a0 = *(struct cls_struct_combined*)(args[0]); cls_struct_combined_fn(a0); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type* cls_struct_fields0[5]; ffi_type cls_struct_type0; ffi_type* dbl_arg_types[5]; struct cls_struct_combined g_dbl = {4.0, 5.0, 1.0, 8.0}; cls_struct_type0.size = 0; cls_struct_type0.alignment = 0; cls_struct_type0.type = FFI_TYPE_STRUCT; cls_struct_type0.elements = cls_struct_fields0; cls_struct_fields0[0] = &ffi_type_float; cls_struct_fields0[1] = &ffi_type_float; cls_struct_fields0[2] = &ffi_type_float; cls_struct_fields0[3] = &ffi_type_float; cls_struct_fields0[4] = NULL; dbl_arg_types[0] = &cls_struct_type0; dbl_arg_types[1] = NULL; if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_void, dbl_arg_types) != FFI_OK) abort(); if (ffi_prep_closure_loc(pcl, &cif, cls_struct_combined_gn, NULL, code) != FFI_OK) abort(); printf("a\n"); ((void(*)(cls_struct_combined)) (code))(g_dbl); printf("b\n"); exit(0); }