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);
}

Reply via email to