unity-dotnet P5 JIT: embed passes with virtual calls JITted (431 methods, 0 invalid)

The interpreter's vcall/PIC/AOT-vcall caches pack pointers into 32-bit
halves; on 64-bit they are off and the miss path resolves through
get_virtual_method_fast. Call args and the return register are coerced
to the callee's/function's type where a native-int vreg was widened to
i64. Adds CTTZ32/64 and LCONV_TO_[IU][12] (64-bit keeps them).
GEX_NO_SIGNAL_TRAPS=1 makes wasmtime use explicit bounds checks
(backtrace on a wild address).

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01PeRutwFgZ66XpxjasKrPn1
This commit is contained in:
velzieandClaude Opus 5.5 committed 2026-10-05 04:30:44 -04:00
1 parent 644d138287
commit 2df82f93d7
2 files changed
+830 -198

No files matched your search

+6
View File
@@ -658,6 +658,12 @@ pub fn engine() -> Result<Engine> {
config.wasm_memory64(true);
config.memory_reservation(gex_abi::LIMIT64);
}
// `GEX_NO_SIGNAL_TRAPS=1` (debugging): explicit bounds checks, so a wild address in generated code traps
// with a backtrace instead of faulting outside every guard region (which the signal handler cannot
// attribute and the process dies of).
if std::env::var_os("GEX_NO_SIGNAL_TRAPS").is_some() {
config.signals_based_traps(false);
}
// gex's output is already optimised; Cranelift only adds register
// allocation and peepholes, whose time dominates on a large program (half
// a minute to compile SQLite vs under two seconds to translate).
File diff suppressed because it is too large. Load diff