koffi 1.1.1 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/CMakeLists.txt +13 -7
  2. package/README.md +15 -26
  3. package/build/qemu/1.1.4/koffi_darwin_x64.tar.gz +0 -0
  4. package/build/qemu/1.1.4/koffi_freebsd_arm64.tar.gz +0 -0
  5. package/build/qemu/1.1.4/koffi_freebsd_ia32.tar.gz +0 -0
  6. package/build/qemu/1.1.4/koffi_freebsd_x64.tar.gz +0 -0
  7. package/build/qemu/1.1.4/koffi_linux_arm.tar.gz +0 -0
  8. package/build/qemu/1.1.4/koffi_linux_arm64.tar.gz +0 -0
  9. package/build/qemu/1.1.4/koffi_linux_ia32.tar.gz +0 -0
  10. package/build/qemu/1.1.4/koffi_linux_riscv64.tar.gz +0 -0
  11. package/build/qemu/1.1.4/koffi_linux_x64.tar.gz +0 -0
  12. package/build/qemu/1.1.4/koffi_openbsd_ia32.tar.gz +0 -0
  13. package/build/qemu/1.1.4/koffi_openbsd_x64.tar.gz +0 -0
  14. package/build/qemu/1.1.4/koffi_win32_ia32.tar.gz +0 -0
  15. package/build/qemu/1.1.4/koffi_win32_x64.tar.gz +0 -0
  16. package/package.json +2 -2
  17. package/qemu/qemu.js +13 -10
  18. package/qemu/registry/machines.json +138 -3
  19. package/qemu/registry/sha256sum.txt +27 -12
  20. package/src/abi_arm32.cc +29 -16
  21. package/src/abi_arm64.cc +33 -17
  22. package/src/abi_riscv64.cc +468 -0
  23. package/src/abi_riscv64_fwd.S +129 -0
  24. package/src/abi_x64_sysv.cc +9 -10
  25. package/src/abi_x64_win.cc +5 -8
  26. package/src/abi_x86.cc +11 -6
  27. package/src/call.cc +24 -36
  28. package/src/call.hh +14 -24
  29. package/src/ffi.cc +75 -27
  30. package/src/ffi.hh +13 -5
  31. package/src/parser.cc +48 -26
  32. package/src/parser.hh +3 -1
  33. package/src/util.cc +26 -57
  34. package/src/util.hh +17 -1
  35. package/test/CMakeLists.txt +3 -0
  36. package/test/misc.c +34 -0
  37. package/vendor/_patches/glfw_001_fix_openbsd_xlib_soname.patch +145 -0
  38. package/vendor/libcc/libcc.cc +7 -7
  39. package/vendor/libcc/libcc.hh +8 -2
  40. package/vendor/raylib/src/external/glfw/src/egl_context.c +6 -0
  41. package/vendor/raylib/src/external/glfw/src/osmesa_context.c +2 -0
  42. package/vendor/raylib/src/external/glfw/src/vulkan.c +2 -0
  43. package/vendor/raylib/src/external/glfw/src/x11_init.c +20 -0
  44. package/build/qemu/1.1.1/koffi_darwin_x64.tar.gz +0 -0
  45. package/build/qemu/1.1.1/koffi_freebsd_arm64.tar.gz +0 -0
  46. package/build/qemu/1.1.1/koffi_freebsd_ia32.tar.gz +0 -0
  47. package/build/qemu/1.1.1/koffi_freebsd_x64.tar.gz +0 -0
  48. package/build/qemu/1.1.1/koffi_linux_arm.tar.gz +0 -0
  49. package/build/qemu/1.1.1/koffi_linux_arm64.tar.gz +0 -0
  50. package/build/qemu/1.1.1/koffi_linux_ia32.tar.gz +0 -0
  51. package/build/qemu/1.1.1/koffi_linux_x64.tar.gz +0 -0
  52. package/build/qemu/1.1.1/koffi_win32_ia32.tar.gz +0 -0
  53. package/build/qemu/1.1.1/koffi_win32_x64.tar.gz +0 -0
package/CMakeLists.txt CHANGED
@@ -23,6 +23,9 @@ if(MSVC)
23
23
  else()
24
24
  add_compile_options(-Wall -Wextra -Wno-missing-field-initializers
25
25
  -Wno-unused-parameter -Wno-class-memaccess)
26
+ if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
27
+ add_compile_options(-Wno-unknown-warning-option)
28
+ endif()
26
29
  endif()
27
30
 
28
31
  # ---- Koffi ----
@@ -31,6 +34,7 @@ set(KOFFI_SRC
31
34
  src/call.cc
32
35
  src/abi_arm32.cc
33
36
  src/abi_arm64.cc
37
+ src/abi_riscv64.cc
34
38
  src/abi_x64_sysv.cc
35
39
  src/abi_x64_win.cc
36
40
  src/abi_x86.cc
@@ -40,20 +44,22 @@ set(KOFFI_SRC
40
44
  vendor/libcc/libcc.cc
41
45
  )
42
46
  if(CMAKE_SIZEOF_VOID_P EQUAL 8)
43
- if(WIN32)
44
- list(APPEND KOFFI_SRC src/abi_x64_win_fwd.asm)
45
- elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|arm64")
47
+ if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch|arm")
46
48
  list(APPEND KOFFI_SRC src/abi_arm64_fwd.S)
49
+ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "riscv")
50
+ list(APPEND KOFFI_SRC src/abi_riscv64_fwd.S)
51
+ elseif(WIN32)
52
+ list(APPEND KOFFI_SRC src/abi_x64_win_fwd.asm)
47
53
  else()
48
54
  list(APPEND KOFFI_SRC src/abi_x64_sysv_fwd.S)
49
55
  endif()
50
56
  elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
51
- if(WIN32)
57
+ if(CMAKE_SYSTEM_PROCESSOR MATCHES "arm")
58
+ list(APPEND KOFFI_SRC src/abi_arm32_fwd.S)
59
+ elseif(WIN32)
52
60
  list(APPEND KOFFI_SRC src/abi_x86_fwd.asm)
53
- elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "i[3456]86|x86|AMD64")
61
+ else()
54
62
  list(APPEND KOFFI_SRC src/abi_x86_fwd.S)
55
- elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "armv[678]l")
56
- list(APPEND KOFFI_SRC src/abi_arm32_fwd.S)
57
63
  endif()
58
64
  endif()
59
65
 
package/README.md CHANGED
@@ -13,7 +13,7 @@
13
13
  * [Raylib results](#raylib-results)
14
14
  - [Tests](#tests)
15
15
  - [Compilation](#compilation)
16
- * [Windows](#windows)
16
+ * [Windows](#windows-1)
17
17
  * [Other platforms](#other-platforms)
18
18
 
19
19
  # Introduction
@@ -25,31 +25,20 @@ The following features are planned in the near future:
25
25
  * 1.2: C to JS callbacks
26
26
  * 1.3: Type parser
27
27
 
28
- The following platforms __are officially supported and tested__ at the moment:
29
-
30
- Platform | Architecture | Sync calls | Async calls | Callbacks | Pre-built binary
31
- --------- | -------------------------------- | ---------- | ----------- | --------- | ----------------
32
- Windows | x86 (cdecl, stdcall, fastcall) | 🟩 Yes | 🟩 Yes | 🟥 No | 🟩 Yes
33
- Windows | x86_64 | 🟩 Yes | 🟩 Yes | 🟥 No | 🟩 Yes
34
- Linux | x86 | 🟩 Yes | 🟩 Yes | 🟥 No | 🟩 Yes
35
- Linux | x86_64 | 🟩 Yes | 🟩 Yes | 🟥 No | 🟩 Yes
36
- Linux | ARM32+VFP Little Endian | 🟩 Yes | 🟩 Yes | 🟥 No | 🟩 Yes
37
- Linux | ARM64 Little Endian | 🟩 Yes | 🟩 Yes | 🟥 No | 🟩 Yes
38
- FreeBSD | x86 | 🟩 Yes | 🟩 Yes | 🟥 No | 🟩 Yes
39
- FreeBSD | x86_64 | 🟩 Yes | 🟩 Yes | 🟥 No | 🟩 Yes
40
- FreeBSD | ARM64 Little Endian | 🟩 Yes | 🟩 Yes | 🟥 No | 🟩 Yes
41
- macOS | x86_64 | 🟩 Yes | 🟩 Yes | 🟥 No | 🟩 Yes
42
- macOS | ARM64 (M1) Little Endian | 🟩 Yes | 🟩 Yes | 🟥 No | 🟥 No
43
- OpenBSD | x86_64 | 🟧 Maybe | 🟧 Maybe | 🟥 No | 🟥 No
44
- OpenBSD | x86 | 🟧 Maybe | 🟧 Maybe | 🟥 No | 🟥 No
45
- OpenBSD | ARM64 Little Endian | 🟧 Maybe | 🟧 Maybe | 🟥 No | 🟥 No
46
- NetBSD | x86_64 | 🟧 Maybe | 🟧 Maybe | 🟥 No | 🟥 No
47
- NetBSD | x86 | 🟧 Maybe | 🟧 Maybe | 🟥 No | 🟥 No
48
- NetBSD | ARM64 Little Endian | 🟧 Maybe | 🟧 Maybe | 🟥 No | 🟥 No
49
-
50
- 🟩 Tested, fully operational
51
- 🟧 May work, but not actively tested
52
- 🟥 Does not work yet
28
+ The following combinations of OS and architectures __are officially supported and tested__ at the moment:
29
+
30
+ ISA / OS | Windows | Linux | macOS | FreeBSD | OpenBSD
31
+ ------------------ | ----------- | -------- | ----------- | ----------- | --------
32
+ x86 (IA32) [^1] | 🟩 Yes | 🟩 Yes | ⬜️ *N/A* | 🟩 Yes | 🟩 Yes
33
+ x86_64 (AMD64) | 🟩 Yes | 🟩 Yes | 🟩 Yes | 🟩 Yes | 🟩 Yes
34
+ ARM32 LE [^2] | ⬜️ *N/A* | 🟩 Yes | ⬜️ *N/A* | 🟨 Probably | 🟨 Probably
35
+ ARM64 (AArch64) LE | 🟧 Maybe | 🟩 Yes | 🟩 Yes [^3] | 🟩 Yes | 🟨 Probably
36
+ RISC-V 64 [^4] | ⬜️ *N/A* | 🟩 Yes | ⬜️ *N/A* | 🟨 Probably | 🟨 Probably
37
+
38
+ [^1]: The following call conventions are supported: cdecl, stdcall, MS fastcall, thiscall.
39
+ [^2]: The prebuilt binary uses the hard float ABI and expects a VFP coprocessor. Build from source to use Koffi with a different ABI (softfp, soft).
40
+ [^3]: However, we don't provide prebuilt binaries for macOS on Apple M1.
41
+ [^4]: Only the LP64D (double-precision float) gets tested. The LP64 ABI is supported in theory (untested), the LP64F ABI is not supported.
53
42
 
54
43
  This is still in development, bugs are to be expected. More tests will come in the near future.
55
44
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "koffi",
3
- "version": "1.1.1",
3
+ "version": "1.1.4",
4
4
  "description": "Fast and simple FFI (foreign function interface) for Node.js",
5
5
  "keywords": [
6
6
  "foreign",
@@ -24,7 +24,7 @@
24
24
  },
25
25
  "license": "AGPL-3.0",
26
26
  "dependencies": {
27
- "cnoke": "^1.0.7"
27
+ "cnoke": "^1.0.9"
28
28
  },
29
29
  "devDependencies": {
30
30
  "chalk": "^4.1.2",
package/qemu/qemu.js CHANGED
@@ -124,13 +124,12 @@ async function main() {
124
124
  machine.started = false;
125
125
 
126
126
  machine.qemu.accelerate = null;
127
- if (accelerate) {
127
+ if (accelerate && (machine.qemu.binary == 'qemu-system-x86_64' ||
128
+ machine.qemu.binary == 'qemu-system-i386')) {
128
129
  if (process.platform == 'linux') {
129
- if (process.arch == 'x64' && (machine.info.arch == 'x64' || machine.info.arch == 'ia32'))
130
- machine.qemu.accelerate = 'kvm';
130
+ machine.qemu.accelerate = 'kvm';
131
131
  } else if (process.platform == 'win32') {
132
- if (process.arch == 'x64' && machine.info.arch == 'x64')
133
- machine.qemu.accelerate = 'whpx';
132
+ machine.qemu.accelerate = 'whpx';
134
133
  }
135
134
  }
136
135
  }
@@ -141,19 +140,23 @@ async function main() {
141
140
 
142
141
  for (let pattern of patterns) {
143
142
  let re = minimatch.makeRe(pattern);
143
+ let match = false;
144
144
 
145
145
  for (let name in machines_map) {
146
146
  let machine = machines_map[name];
147
147
 
148
- if (name.match(re) || machine.name.match(re))
148
+ if (name.match(re) || machine.name.match(re)) {
149
149
  machines.add(name);
150
+ match = true;
151
+ }
150
152
  }
151
- }
152
153
 
153
- if (!machines.size) {
154
- console.log('Could not match any machine');
155
- process.exit(1);
154
+ if (!match) {
155
+ console.log(`Pattern '${pattern}' does not match any machine`);
156
+ process.exit(1);
157
+ }
156
158
  }
159
+
157
160
  } else {
158
161
  machines = new Set(Object.keys(machines_map));
159
162
 
@@ -253,7 +253,7 @@
253
253
  },
254
254
 
255
255
  "info": {
256
- "version": 1,
256
+ "version": 2,
257
257
  "platform": "freebsd",
258
258
  "arch": "x64",
259
259
 
@@ -298,7 +298,7 @@
298
298
  },
299
299
 
300
300
  "info": {
301
- "version": 1,
301
+ "version": 2,
302
302
  "platform": "freebsd",
303
303
  "arch": "ia32",
304
304
 
@@ -343,7 +343,7 @@
343
343
  },
344
344
 
345
345
  "info": {
346
- "version": 1,
346
+ "version": 2,
347
347
  "platform": "freebsd",
348
348
  "arch": "arm64",
349
349
 
@@ -421,5 +421,140 @@
421
421
  }
422
422
  }
423
423
  }
424
+ },
425
+
426
+ "openbsd_x64": {
427
+ "name": "OpenBSD x64",
428
+
429
+ "qemu": {
430
+ "binary": "qemu-system-x86_64",
431
+ "arguments": ["-m", "1G", "-smp", 2, "-hda", "disk.qcow2", "-netdev", "user,id=mynet,hostfwd=tcp::22210-:22", "-device", "e1000,netdev=mynet", "-vnc", "127.0.0.1:20"]
432
+ },
433
+
434
+ "info": {
435
+ "version": 1,
436
+ "platform": "openbsd",
437
+ "arch": "x64",
438
+
439
+ "ssh_port": 22210,
440
+ "vnc_port": 5920,
441
+
442
+ "username": "openbsd",
443
+ "password": "openbsd",
444
+
445
+ "shutdown": "sudo shutdown -p now"
446
+ },
447
+
448
+ "builds": {
449
+ "OpenBSD x64": {
450
+ "directory": "/home/openbsd/luigi",
451
+ "build": "node ../cnoke/cnoke.js"
452
+ }
453
+ },
454
+
455
+ "tests": {
456
+ "OpenBSD x64": {
457
+ "directory": "/home/openbsd/luigi",
458
+ "build": {
459
+ "Build": "node ../cnoke/cnoke.js -C test"
460
+ },
461
+ "commands": {
462
+ "Test Sync": "node test/sync.js",
463
+ "Test Async": "node test/async.js",
464
+ "Test Raylib": "xvfb-run node test/raylib.js",
465
+ "Test SQLite": "node test/sqlite.js"
466
+ }
467
+ }
468
+ }
469
+ },
470
+
471
+ "openbsd_i386": {
472
+ "name": "OpenBSD i386",
473
+
474
+ "qemu": {
475
+ "binary": "qemu-system-x86_64",
476
+ "arguments": ["-m", "1G", "-smp", 2, "-hda", "disk.qcow2", "-netdev", "user,id=mynet,hostfwd=tcp::22211-:22", "-device", "e1000,netdev=mynet", "-vnc", "127.0.0.1:21"]
477
+ },
478
+
479
+ "info": {
480
+ "version": 1,
481
+ "platform": "openbsd",
482
+ "arch": "ia32",
483
+
484
+ "ssh_port": 22211,
485
+ "vnc_port": 5921,
486
+
487
+ "username": "openbsd",
488
+ "password": "openbsd",
489
+
490
+ "shutdown": "sudo shutdown -p now"
491
+ },
492
+
493
+ "builds": {
494
+ "OpenBSD i386": {
495
+ "directory": "/home/openbsd/luigi",
496
+ "build": "node ../cnoke/cnoke.js"
497
+ }
498
+ },
499
+
500
+ "tests": {
501
+ "OpenBSD i386": {
502
+ "directory": "/home/openbsd/luigi",
503
+ "build": {
504
+ "Build": "node ../cnoke/cnoke.js -C test"
505
+ },
506
+ "commands": {
507
+ "Test Sync": "node test/sync.js",
508
+ "Test Async": "node test/async.js",
509
+ "Test Raylib": "xvfb-run node test/raylib.js",
510
+ "Test SQLite": "node test/sqlite.js"
511
+ }
512
+ }
513
+ }
514
+ },
515
+
516
+ "debian_riscv64": {
517
+ "name": "Debian RISC-V 64",
518
+
519
+ "qemu": {
520
+ "binary": "qemu-system-riscv64",
521
+ "arguments": ["-machine", "virt", "-cpu", "rv64", "-m", "1G", "-smp", 2, "-device", "virtio-blk-device,drive=hd", "-drive", "file=disk.qcow2,if=none,id=hd", "-device", "virtio-net-device,netdev=net", "-netdev", "user,id=net,hostfwd=tcp::22212-:22", "-bios", "fw_jump.elf", "-kernel", "uboot.elf", "-append", "root=LABEL=rootfs console=ttyS0", "-vnc", "127.0.0.1:22"]
522
+ },
523
+
524
+ "info": {
525
+ "version": 1,
526
+ "platform": "linux",
527
+ "arch": "riscv64",
528
+
529
+ "ssh_port": 22212,
530
+ "vnc_port": 5912,
531
+
532
+ "username": "debian",
533
+ "password": "debian",
534
+
535
+ "shutdown": "sudo poweroff"
536
+ },
537
+
538
+ "builds": {
539
+ "Linux RISC-V 64": {
540
+ "directory": "/home/debian/luigi",
541
+ "build": "node ../cnoke/cnoke.js"
542
+ }
543
+ },
544
+
545
+ "tests": {
546
+ "Linux RISC-V 64": {
547
+ "directory": "/home/debian/luigi",
548
+ "build": {
549
+ "Build": "node ../cnoke/cnoke.js -C test"
550
+ },
551
+ "commands": {
552
+ "Test Sync": "node test/sync.js",
553
+ "Test Async": "node test/async.js",
554
+ "Test Raylib": "xvfb-run node test/raylib.js",
555
+ "Test SQLite": "node test/sqlite.js"
556
+ }
557
+ }
558
+ }
424
559
  }
425
560
  }
@@ -22,20 +22,20 @@ ed05b84b7759ec945bb5422305a3a3c5b61d89e231844656ea31e07d89451a20 *qemu/debian_i3
22
22
  292a61c415a99a9c63a9337f1e074bea6c5df594e16bc40ded76141963c67ea4 *qemu/debian_i386/install.sh
23
23
  8dc1360e1c23ea21931f5eb94461d15fac6bcec00cf42bf1e590b7fb937e80c1 *qemu/debian_i386/initrd.img-5.10.0-12-686-pae
24
24
  338602d969f953cd88c2df736b9f8f7ee53029d233c83c7398258ae5bcb4e286 *qemu/debian_i386/disk.qcow2
25
- 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b *qemu/freebsd_arm64/VERSION
26
- 5daea533330eb8d2f8df946561680e09f8dacc467fbf03d28caa2115d94386b5 *qemu/freebsd_arm64/QEMU_EFI.img
27
- a083e4e1f58f477e4a9e8ae30f75660e82275b88f77b5e2c7f5d6ee1deb43b41 *qemu/freebsd_arm64/varstore.img
25
+ e5d9d3e1e4a5c980fce4ef3aab5e29b9607b8e5da6e9fe58c3f396009e283cff *qemu/freebsd_arm64/disk.qcow2
28
26
  53a4dc48317e1c9de4a088cd45ba39a1810f0bafad75c7f810e18d4e3eb340e3 *qemu/freebsd_arm64/install.sh
29
- a19ad06aec7972f3b95a56fb9bb8ac8a6afcd61b586f398691d58c704e8c466e *qemu/freebsd_arm64/disk.qcow2
30
- 10f2bc603b171368cacda43485f8f72567af0a9a490b7e0fa0c14c983ae66f16 *qemu/freebsd_arm64/xvfb-run.sh
31
- 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b *qemu/freebsd_x64/VERSION
32
- 06eef544fe9c61d3905b0e588c306d1dedac7ee7d4c01df154ff6ed64e25ef77 *qemu/freebsd_x64/install.sh
33
- 060b66901313ddfcd434c20a7b13052b3e5126e43c4e44884b85191560bd99eb *qemu/freebsd_x64/disk.qcow2
34
- 10f2bc603b171368cacda43485f8f72567af0a9a490b7e0fa0c14c983ae66f16 *qemu/freebsd_x64/xvfb-run.sh
35
- 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b *qemu/freebsd_i386/VERSION
27
+ 5daea533330eb8d2f8df946561680e09f8dacc467fbf03d28caa2115d94386b5 *qemu/freebsd_arm64/QEMU_EFI.img
28
+ 8ac20d46117a5a15761bf3070e365141b96ee3283250824f113029e106c62a50 *qemu/freebsd_arm64/varstore.img
29
+ d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35 *qemu/freebsd_arm64/VERSION
30
+ 73837b3991eae13f6c346955ea4aa419c8c168cadf70e0a38446db60cf47b0e9 *qemu/freebsd_arm64/xvfb-run.sh
31
+ fd0e51c43d7848564a81ddcb3eecf49103251bffcf25315ef87db01350ad4ac5 *qemu/freebsd_i386/disk.qcow2
36
32
  bdeac2cca1d22d70c2d388a50709d5cba3069bbd4bd1bcb102955b0ee12ca3e9 *qemu/freebsd_i386/install.sh
37
- 8191cea63d738cdca6df0b2d2d6953675e1dd33cac4d98fff88ba4367b182b64 *qemu/freebsd_i386/disk.qcow2
38
- 10f2bc603b171368cacda43485f8f72567af0a9a490b7e0fa0c14c983ae66f16 *qemu/freebsd_i386/xvfb-run.sh
33
+ d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35 *qemu/freebsd_i386/VERSION
34
+ 73837b3991eae13f6c346955ea4aa419c8c168cadf70e0a38446db60cf47b0e9 *qemu/freebsd_i386/xvfb-run.sh
35
+ 41649d2f5959388e1c5d8ee89bb084795470a8b9e68d87861b4e95e4102b62cf *qemu/freebsd_x64/disk.qcow2
36
+ 06eef544fe9c61d3905b0e588c306d1dedac7ee7d4c01df154ff6ed64e25ef77 *qemu/freebsd_x64/install.sh
37
+ d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35 *qemu/freebsd_x64/VERSION
38
+ 73837b3991eae13f6c346955ea4aa419c8c168cadf70e0a38446db60cf47b0e9 *qemu/freebsd_x64/xvfb-run.sh
39
39
  16a4f09b3e70b97f5cfb1cf9b913d67d0ec45c4342d202cc9a2b2cfee852a8de *qemu/macos_x64/ESP.qcow2
40
40
  5d2ac383371b408398accee7ec27c8c09ea5b74a0de0ceea6513388b15be5d1e *qemu/macos_x64/OVMF_VARS.fd
41
41
  d79538ac489f1948b04b65f12c5618c28e4a5de0be062f5cf1d73e422a091a37 *qemu/macos_x64/install.txt
@@ -43,3 +43,18 @@ d79538ac489f1948b04b65f12c5618c28e4a5de0be062f5cf1d73e422a091a37 *qemu/macos_x64
43
43
  5cc2d42949c7e4e763db0abeb88299972bafef991d87dbf744a5108ef9190f6f *qemu/macos_x64/OVMF_VARS-1024x768.fd
44
44
  53c234e5e8472b6ac51c1ae1cab3fe06fad053beb8ebfd8977b010655bfdd3c3 *qemu/macos_x64/VERSION
45
45
  2a247500e8ad9aa479994097ba5976bd881fde4de1516abd14491f3dba9fe060 *qemu/macos_x64/OVMF_CODE.fd
46
+ 3a3395f70240d8e3137dfe06ef7dd76255dc597626e087d33abdcc65710f3dff *qemu/openbsd_x64/disk.qcow2
47
+ 9dcdabfc12ad2ba2da1b9c3d95dc46311a12d6e3190f1bfd0c9b184ac1577c94 *qemu/openbsd_x64/install.sh
48
+ 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b *qemu/openbsd_x64/VERSION
49
+ 7b66bdf8b77fd1c6256ffdab623e37ce099797ad657dcd25af5df0486fadce37 *qemu/openbsd_x64/xvfb-run.sh
50
+ 570bc6da16ca3b2b068963e7960e76fd23df3ada54398dfc6b6ddf97348ef5d7 *qemu/openbsd_i386/disk.qcow2
51
+ b82c940781ee678499851e1d2aa4868b7154a16ecc4f01c6c56940276c02748f *qemu/openbsd_i386/install.sh
52
+ 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b *qemu/openbsd_i386/VERSION
53
+ 7b66bdf8b77fd1c6256ffdab623e37ce099797ad657dcd25af5df0486fadce37 *qemu/openbsd_i386/xvfb-run.sh
54
+ 64048432020bda960f397b5a138ea98aa6bbd42db02e8bb34ff3b9320763e36d *qemu/debian_riscv64/uboot.elf
55
+ 0bdd93879f87c338d62422a65fdcba4d8c834848f2305f31b916539cb523e9e8 *qemu/debian_riscv64/readme.txt
56
+ 76a5819cdacc8fe284370f441820620e911877122068a3b391fa064b7e9eb180 *qemu/debian_riscv64/initrd
57
+ 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b *qemu/debian_riscv64/VERSION
58
+ 7b6a36b0c2cdd85f3bbee4156de6c65a6f9b01b6bdf95eeb327b6182807ef111 *qemu/debian_riscv64/disk.qcow2
59
+ 45755dd1fec10b7d5d67156bf806d3069a9285d18c5b16f06050e5115cc93f18 *qemu/debian_riscv64/kernel
60
+ 16a1077672903239e2e4451e6898f9d813b369f9ceede30da8937a1361a050d7 *qemu/debian_riscv64/fw_jump.elf
package/src/abi_arm32.cc CHANGED
@@ -11,7 +11,7 @@
11
11
  // You should have received a copy of the GNU Affero General Public License
12
12
  // along with this program. If not, see https://www.gnu.org/licenses/.
13
13
 
14
- #if defined(__arm__)
14
+ #if defined(__arm__) || (defined(__M_ARM) && !defined(_M_ARM64))
15
15
 
16
16
  #include "vendor/libcc/libcc.hh"
17
17
  #include "ffi.hh"
@@ -19,6 +19,8 @@
19
19
  #include "util.hh"
20
20
 
21
21
  #include <napi.h>
22
+ #include <signal.h>
23
+ #include <setjmp.h>
22
24
 
23
25
  namespace RG {
24
26
 
@@ -37,11 +39,19 @@ extern "C" uint64_t ForwardCallXGG(const void *func, uint8_t *sp);
37
39
  extern "C" float ForwardCallXF(const void *func, uint8_t *sp);
38
40
  extern "C" HfaRet ForwardCallXDDDD(const void *func, uint8_t *sp);
39
41
 
42
+ static inline int IsHFA(const TypeInfo *type)
43
+ {
44
+ #ifdef __ARM_PCS_VFP
45
+ return IsHFA(type, 1, 4);
46
+ #else
47
+ return false;
48
+ #endif
49
+ }
50
+
40
51
  bool AnalyseFunction(InstanceData *, FunctionInfo *func)
41
52
  {
42
- if (IsHFA(func->ret.type, 1, 4)) {
43
- func->ret.vec_count = func->ret.type->members.len *
44
- (func->ret.type->members[0].type->size / 4);
53
+ if (int hfa = IsHFA(func->ret.type); hfa) {
54
+ func->ret.vec_count = hfa;
45
55
  } else if (func->ret.type->primitive != PrimitiveKind::Record ||
46
56
  func->ret.type->size <= 4) {
47
57
  func->ret.gpr_count = (func->ret.type->size > 4) ? 2 : 1;
@@ -84,13 +94,12 @@ bool AnalyseFunction(InstanceData *, FunctionInfo *func)
84
94
  }
85
95
  } break;
86
96
  case PrimitiveKind::Record: {
87
- if (IsHFA(param.type, 1, 4)) {
88
- int vec_count = (int)(param.type->members.len *
89
- param.type->members[0].type->size / 4);
97
+ int hfa = IsHFA(param.type);
90
98
 
91
- if (vec_count <= vec_avail) {
92
- param.vec_count = vec_count;
93
- vec_avail -= vec_count;
99
+ if (hfa) {
100
+ if (hfa <= vec_avail) {
101
+ param.vec_count = hfa;
102
+ vec_avail -= hfa;
94
103
  } else {
95
104
  vec_avail = 0;
96
105
  started_stack = true;
@@ -112,8 +121,13 @@ bool AnalyseFunction(InstanceData *, FunctionInfo *func)
112
121
  case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
113
122
  case PrimitiveKind::Float32:
114
123
  case PrimitiveKind::Float64: {
115
- Size need = param.type->size / 4;
124
+ #ifdef __ARM_PCS_VFP
116
125
  bool vfp = !param.variadic;
126
+ #else
127
+ bool vfp = false;
128
+ #endif
129
+
130
+ Size need = param.type->size / 4;
117
131
 
118
132
  if (vfp) {
119
133
  if (need <= vec_avail) {
@@ -374,8 +388,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
374
388
  }
375
389
  }
376
390
 
377
- stack = MakeSpan(mem->stack.end(), old_stack_mem.end() - mem->stack.end());
378
- heap = MakeSpan(old_heap_mem.ptr, mem->heap.ptr - old_heap_mem.ptr);
391
+ sp = mem->stack.end();
379
392
 
380
393
  return true;
381
394
  }
@@ -384,8 +397,8 @@ void CallData::Execute()
384
397
  {
385
398
  #define PERFORM_CALL(Suffix) \
386
399
  ([&]() { \
387
- auto ret = (func->forward_fp ? ForwardCallX ## Suffix(func->func, stack.ptr) \
388
- : ForwardCall ## Suffix(func->func, stack.ptr)); \
400
+ auto ret = (func->forward_fp ? ForwardCallX ## Suffix(func->func, sp) \
401
+ : ForwardCall ## Suffix(func->func, sp)); \
389
402
  return ret; \
390
403
  })()
391
404
 
@@ -407,7 +420,7 @@ void CallData::Execute()
407
420
  case PrimitiveKind::Record: {
408
421
  if (func->ret.vec_count) {
409
422
  HfaRet ret = PERFORM_CALL(DDDD);
410
- memcpy_safe(&result.buf, &ret, RG_SIZE(ret));
423
+ memcpy(&result.buf, &ret, RG_SIZE(ret));
411
424
  } else {
412
425
  result.u64 = PERFORM_CALL(GG);
413
426
  }
package/src/abi_arm64.cc CHANGED
@@ -11,7 +11,7 @@
11
11
  // You should have received a copy of the GNU Affero General Public License
12
12
  // along with this program. If not, see https://www.gnu.org/licenses/.
13
13
 
14
- #if defined(__aarch64__)
14
+ #if defined(__aarch64__) || defined(_M_ARM64)
15
15
 
16
16
  #include "vendor/libcc/libcc.hh"
17
17
  #include "ffi.hh"
@@ -41,10 +41,15 @@ extern "C" X0X1Ret ForwardCallXGG(const void *func, uint8_t *sp);
41
41
  extern "C" float ForwardCallXF(const void *func, uint8_t *sp);
42
42
  extern "C" HfaRet ForwardCallXDDDD(const void *func, uint8_t *sp);
43
43
 
44
+ static inline int IsHFA(const TypeInfo *type)
45
+ {
46
+ return IsHFA(type, 1, 4);
47
+ }
48
+
44
49
  bool AnalyseFunction(InstanceData *, FunctionInfo *func)
45
50
  {
46
- if (IsHFA(func->ret.type, 1, 4)) {
47
- func->ret.vec_count = func->ret.type->members.len;
51
+ if (int hfa = IsHFA(func->ret.type); hfa) {
52
+ func->ret.vec_count = hfa;
48
53
  } else if (func->ret.type->size <= 16) {
49
54
  func->ret.gpr_count = (func->ret.type->size + 7) / 8;
50
55
  } else {
@@ -81,19 +86,23 @@ bool AnalyseFunction(InstanceData *, FunctionInfo *func)
81
86
  }
82
87
  } break;
83
88
  case PrimitiveKind::Record: {
84
- #ifdef __APPLE__
89
+ int hfa = IsHFA(param.type);
90
+
91
+ #if defined(_WIN32)
92
+ if (!param.variadic) {
93
+ hfa = 0;
94
+ }
95
+ #elif defined(__APPLE__)
85
96
  if (param.variadic) {
86
97
  param.use_memory = (param.type->size > 16);
87
98
  break;
88
99
  }
89
100
  #endif
90
101
 
91
- if (IsHFA(param.type, 1, 4)) {
92
- int vec_count = (int)param.type->members.len;
93
-
94
- if (vec_count <= vec_avail) {
95
- param.vec_count = vec_count;
96
- vec_avail -= vec_count;
102
+ if (hfa) {
103
+ if (hfa <= vec_avail) {
104
+ param.vec_count = hfa;
105
+ vec_avail -= hfa;
97
106
  } else {
98
107
  vec_avail = 0;
99
108
  }
@@ -118,7 +127,15 @@ bool AnalyseFunction(InstanceData *, FunctionInfo *func)
118
127
  case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
119
128
  case PrimitiveKind::Float32:
120
129
  case PrimitiveKind::Float64: {
121
- #ifdef __APPLE__
130
+ #if defined(_WIN32)
131
+ if (param.variadic) {
132
+ if (gpr_avail) {
133
+ param.gpr_count = 1;
134
+ gpr_avail--;
135
+ }
136
+ break;
137
+ }
138
+ #elif defined(__APPLE__)
122
139
  if (param.variadic)
123
140
  break;
124
141
  #endif
@@ -378,8 +395,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
378
395
  }
379
396
  }
380
397
 
381
- stack = MakeSpan(mem->stack.end(), old_stack_mem.end() - mem->stack.end());
382
- heap = MakeSpan(old_heap_mem.ptr, mem->heap.ptr - old_heap_mem.ptr);
398
+ sp = mem->stack.end();
383
399
 
384
400
  return true;
385
401
  }
@@ -388,8 +404,8 @@ void CallData::Execute()
388
404
  {
389
405
  #define PERFORM_CALL(Suffix) \
390
406
  ([&]() { \
391
- auto ret = (func->forward_fp ? ForwardCallX ## Suffix(func->func, stack.ptr) \
392
- : ForwardCall ## Suffix(func->func, stack.ptr)); \
407
+ auto ret = (func->forward_fp ? ForwardCallX ## Suffix(func->func, sp) \
408
+ : ForwardCall ## Suffix(func->func, sp)); \
393
409
  return ret; \
394
410
  })()
395
411
 
@@ -411,10 +427,10 @@ void CallData::Execute()
411
427
  case PrimitiveKind::Record: {
412
428
  if (func->ret.gpr_count) {
413
429
  X0X1Ret ret = PERFORM_CALL(GG);
414
- memcpy_safe(&result.buf, &ret, RG_SIZE(ret));
430
+ memcpy(&result.buf, &ret, RG_SIZE(ret));
415
431
  } else if (func->ret.vec_count) {
416
432
  HfaRet ret = PERFORM_CALL(DDDD);
417
- memcpy_safe(&result.buf, &ret, RG_SIZE(ret));
433
+ memcpy(&result.buf, &ret, RG_SIZE(ret));
418
434
  } else {
419
435
  PERFORM_CALL(GG);
420
436
  }