[foreign-memaccess+abi] RFR: 8287516: Implement fallback Linker [v3]

Jorn Vernee jvernee at openjdk.org
Thu Jan 19 12:27:34 UTC 2023


> Implement a [libffi](https://github.com/libffi/libffi) based fallback linker. The fallback linker comes with a native library that can be included in the jdk by configuring with `--enable-fallback-linker`. This requires the libffi library to be available as well. On the zero VM configuration the fallback linker is enabled by default.
> 
> CABI is refactored a bit. It now supports explicitly setting the CABI using the `jdk.internal.foreign.CABI` system property (which is very handy for testing). Instead of falling back to `null` when the platform is not supported, we instead fall back to checking if the fallback library is supported (`FALLBACK`), and if not, default to the new `UNSUPPORTED` enum constant, which is then mapped to an `UnsupportedOperationException` in the Linker::nativeLinker implementation.
> 
> Checking whether the a full port of the foreign linker is available is done through the new jdk.internal.vm.ForeignLinkerSupport class. This follows the precedent set by Loom's jdk.internal.vm.ContinuationSupport class. The implementation simply returns `true` on platforms where we have a port.
> 
> The system lookup is changed to be selected based on the platform, rather than CABI. This allows selecting the right library implementation when running on a zero VM configuration as well. The split is now just between Windows and non-Windows platforms.
> 
> Finally, I had to slightly modify `globalDefinitions_zero.hpp` to conditionally define `FFI_GO_CLOSURES`, since I was getting a redefinition error using GCC. The macro is also defined in `ffitarget.h` which is included by `ffi.h`. The define in globalDefinitions comes from this PR: https://github.com/openjdk/jdk/pull/8195 which indicates that the define is only needed on Mac Os X. So I switched out the guard to check for `__APPLE__` instead. (the check whether it is already defined doesn't really do anything, since `FFI_GO_CLOSURES` is defined by including `ffi.h`).
> 
> The Java implementation is found in the `jdk.internal.foreign.abi.fallback` package, and consists of the following classes:
> - `FallbackLinker`. The main entry point, an instance of `Linker`. Contains the code for arranging and executing calls.
> - `LibFallback`. A thin wrapper around the native `libfallback` library found in the java.base module, which acts as an interface to the libffi library.
> - `FFIType`. Contains code for creating native `ffi_type` struct instances from memory layouts.
> - The `TypeClass`, `FFIStatus`, and `FFIABI` supporting enums, which should be pretty self-explanatory.
> 
> I've ran the `jdk_foreign` tests in the following configurations:
> - Windows.
> - Linux with the fallback linker lib included, but not used.
> - Linux with fallback linker and running with `-Djdk.internal.foreign.CABI=FALLBACK` (this uses the fallback implementation).
> - Linux zero VM (uses `FALLBACK` as CABI by default, because we don't have a port for `zero`).

Jorn Vernee has updated the pull request incrementally with one additional commit since the last revision:

  clarify computeStructLayout

-------------

Changes:
  - all: https://git.openjdk.org/panama-foreign/pull/770/files
  - new: https://git.openjdk.org/panama-foreign/pull/770/files/55869293..a4dcce0d

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=panama-foreign&pr=770&range=02
 - incr: https://webrevs.openjdk.org/?repo=panama-foreign&pr=770&range=01-02

  Stats: 7 lines in 2 files changed: 5 ins; 0 del; 2 mod
  Patch: https://git.openjdk.org/panama-foreign/pull/770.diff
  Fetch: git fetch https://git.openjdk.org/panama-foreign pull/770/head:pull/770

PR: https://git.openjdk.org/panama-foreign/pull/770


More information about the panama-dev mailing list