From 63b48a4f635c58217271977c835abe191b61a446 Mon Sep 17 00:00:00 2001 From: pavelsavara Date: Fri, 12 May 2023 18:04:32 +0200 Subject: [PATCH] remove wrap_trace_function --- .../sample/wasm/browser-advanced/index.html | 1 + src/mono/sample/wasm/browser-advanced/main.js | 31 ++++---- .../runtime/jiterpreter-trace-generator.ts | 4 +- src/mono/wasm/runtime/jiterpreter.ts | 79 ++++--------------- 4 files changed, 35 insertions(+), 80 deletions(-) diff --git a/src/mono/sample/wasm/browser-advanced/index.html b/src/mono/sample/wasm/browser-advanced/index.html index 3489dafc9474a..a2b14fc6517b5 100644 --- a/src/mono/sample/wasm/browser-advanced/index.html +++ b/src/mono/sample/wasm/browser-advanced/index.html @@ -7,6 +7,7 @@ Wasm Browser Advanced Sample + diff --git a/src/mono/sample/wasm/browser-advanced/main.js b/src/mono/sample/wasm/browser-advanced/main.js index b6e0ef0a8d1a9..3c69f8707bcfd 100644 --- a/src/mono/sample/wasm/browser-advanced/main.js +++ b/src/mono/sample/wasm/browser-advanced/main.js @@ -11,11 +11,25 @@ let testAbort = true; let testError = true; try { + const originalFetch = globalThis.fetch; + globalThis.fetch = (url, fetchArgs) => { + console.log("fetching " + url); + // we are testing that we can retry loading of the assembly + if (testAbort && url.indexOf('System.Private.CoreLib') != -1) { + testAbort = false; + return originalFetch(url + "?testAbort=true", fetchArgs); + } + if (testError && url.indexOf('System.Console') != -1) { + testError = false; + return originalFetch(url + "?testError=true", fetchArgs); + } + return originalFetch(url, fetchArgs); + }; const { runtimeBuildInfo, setModuleImports, getAssemblyExports, runMain, getConfig, Module } = await dotnet .withElementOnExit() // 'withModuleConfig' is internal lower level API // here we show how emscripten could be further configured - // It is prefered to use specific 'with***' methods instead in all other cases. + // It is preferred to use specific 'with***' methods instead in all other cases. .withModuleConfig({ configSrc: "./mono-config.json", onConfigLoaded: (config) => { @@ -25,21 +39,6 @@ try { config.environmentVariables["MONO_LOG_LEVEL"] = "debug"; config.browserProfilerOptions = {}; }, - imports: { - fetch: (url, fetchArgs) => { - console.log("fetching " + url); - // we are testing that we can retry loading of the assembly - if (testAbort && url.indexOf('System.Private.CoreLib') != -1) { - testAbort = false; - return fetch(url + "?testAbort=true", fetchArgs); - } - if (testError && url.indexOf('System.Console') != -1) { - testError = false; - return fetch(url + "?testError=true", fetchArgs); - } - return fetch(url, fetchArgs); - } - }, preInit: () => { console.log('user code Module.preInit'); }, preRun: () => { console.log('user code Module.preRun'); }, onRuntimeInitialized: () => { diff --git a/src/mono/wasm/runtime/jiterpreter-trace-generator.ts b/src/mono/wasm/runtime/jiterpreter-trace-generator.ts index 5243e11d61dc6..9731bf33d337c 100644 --- a/src/mono/wasm/runtime/jiterpreter-trace-generator.ts +++ b/src/mono/wasm/runtime/jiterpreter-trace-generator.ts @@ -29,7 +29,7 @@ import { sizeOfDataItem, sizeOfV128, sizeOfStackval, disabledOpcodes, countCallTargets, - callTargetCounts, trapTraceErrors, + callTargetCounts, trace, traceOnError, traceOnRuntimeError, emitPadding, traceBranchDisplacements, traceEip, nullCheckValidation, @@ -1262,7 +1262,7 @@ export function generateWasmBody( (opcode <= MintOpcode.MINT_RET_I8_IMM) ) ) { - if (isConditionallyExecuted || trapTraceErrors || builder.options.countBailouts) { + if (isConditionallyExecuted || builder.options.countBailouts) { // Not an exit, because returns are normal and we don't want to make them more expensive. // FIXME: Or do we want to record them? Early conditional returns might reduce the value of a trace, // but the main problem is more likely to be calls early in traces. Worth testing later. diff --git a/src/mono/wasm/runtime/jiterpreter.ts b/src/mono/wasm/runtime/jiterpreter.ts index 81fe2382d55c3..5fd241c43049f 100644 --- a/src/mono/wasm/runtime/jiterpreter.ts +++ b/src/mono/wasm/runtime/jiterpreter.ts @@ -44,9 +44,6 @@ export const traceTooSmall = false, // For instrumented methods, trace their exact IP during execution traceEip = false, - // Wraps traces in a JS function that will trap errors and log the trace responsible. - // Very expensive!!!! - trapTraceErrors = false, // When eliminating a null check, replace it with a runtime 'not null' assertion // that will print a diagnostic message if the value is actually null or if // the value does not match the value on the native interpreter stack in memory @@ -183,8 +180,6 @@ struct InterpMethod { export let traceBuilder: WasmBuilder; export let traceImports: Array<[string, string, Function]> | undefined; -export let _wrap_trace_function: Function; - const mathOps1d = [ "asin", @@ -319,45 +314,6 @@ function getTraceImports() { return traceImports; } -function wrap_trace_function( - f: Function, name: string, traceBuf: any, - base: MintOpcodePtr, instrumentedTraceId: number -) { - const tup = instrumentedTraces[instrumentedTraceId]; - if (instrumentedTraceId) - console.log(`instrumented ${tup.name}`); - - if (!_wrap_trace_function) { - // If we used a regular closure, the js console would print the entirety of - // dotnet.native.js when printing an error stack trace, which is... not helpful - const js = `return function trace_enter (locals) { - let threw = true; - try { - let result = trace(locals); - threw = false; - return result; - } finally { - if (threw) { - let msg = "Unhandled error in trace '" + name + "'"; - if (tup) { - msg += " at offset " + (tup.eip + base).toString(16); - msg += " with most recent operands " + tup.operand1.toString(16) + ", " + tup.operand2.toString(16); - } - console.error(msg); - if (traceBuf) { - for (let i = 0, l = traceBuf.length; i < l; i++) - console.log(traceBuf[i]); - } - } - } - };`; - _wrap_trace_function = new Function("trace", "name", "traceBuf", "tup", "base", js); - } - return _wrap_trace_function( - f, name, traceBuf, instrumentedTraces[instrumentedTraceId], base - ); -} - function initialize_builder(builder: WasmBuilder) { // Function type for compiled traces builder.defineType( @@ -379,7 +335,8 @@ function initialize_builder(builder: WasmBuilder) { WasmValtype.i32, true ); builder.defineType( - "copy_ptr", { + "copy_ptr", + { "dest": WasmValtype.i32, "src": WasmValtype.i32 }, @@ -696,25 +653,31 @@ function initialize_builder(builder: WasmBuilder) { WasmValtype.i32, true ); builder.defineType( - "simd_p_p", { + "simd_p_p", + { "arg0": WasmValtype.i32, "arg1": WasmValtype.i32, - }, WasmValtype.void, true + }, + WasmValtype.void, true ); builder.defineType( - "simd_p_pp", { + "simd_p_pp", + { "arg0": WasmValtype.i32, "arg1": WasmValtype.i32, "arg2": WasmValtype.i32, - }, WasmValtype.void, true + }, + WasmValtype.void, true ); builder.defineType( - "simd_p_ppp", { + "simd_p_ppp", + { "arg0": WasmValtype.i32, "arg1": WasmValtype.i32, "arg2": WasmValtype.i32, "arg3": WasmValtype.i32, - }, WasmValtype.void, true + }, + WasmValtype.void, true ); const traceImports = getTraceImports(); @@ -887,15 +850,7 @@ function generate_wasm( rejected = false; mono_assert(!runtimeHelpers.storeMemorySnapshotPending, "Attempting to set function into table during creation of memory snapshot"); - const idx = - trapTraceErrors - ? Module.addFunction( - wrap_trace_function( - fn, methodFullName || methodName, traceOnRuntimeError ? builder.traceBuf : undefined, - builder.base, instrumentedTraceId - ), "iii" - ) - : addWasmFunctionPointer(fn); + const idx = addWasmFunctionPointer(fn); if (!idx) throw new Error("add_function_pointer returned a 0 index"); else if (trace >= 2) @@ -1021,7 +976,7 @@ export function mono_interp_tier_prepare_jiterpreter( counters.traceCandidates++; let methodFullName: string | undefined; - if (trapTraceErrors || mostRecentOptions.estimateHeat || (instrumentedMethodNames.length > 0) || useFullNames) { + if (mostRecentOptions.estimateHeat || (instrumentedMethodNames.length > 0) || useFullNames) { const pMethodName = cwraps.mono_wasm_method_get_full_name(method); methodFullName = Module.UTF8ToString(pMethodName); Module._free(pMethodName); @@ -1218,7 +1173,7 @@ export function jiterpreter_dump_stats(b?: boolean, concise?: boolean) { for (const k in counters.simdFallback) console.log(`// simd ${k}: ${counters.simdFallback[k]} fallback insn(s)`); - if ((typeof(globalThis.setTimeout) === "function") && (b !== undefined)) + if ((typeof (globalThis.setTimeout) === "function") && (b !== undefined)) setTimeout( () => jiterpreter_dump_stats(b), 15000