Skip to content

Commit

Permalink
remove wrap_trace_function (#86158)
Browse files Browse the repository at this point in the history
  • Loading branch information
pavelsavara committed May 12, 2023
1 parent 6e49147 commit 99bb1b8
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 80 deletions.
1 change: 1 addition & 0 deletions src/mono/sample/wasm/browser-advanced/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
<title>Wasm Browser Advanced Sample</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'wasm-unsafe-eval';" />
<script type='module' src="./main.js"></script>
<script type='module' src="./dotnet.js"></script>
<link rel="preload" href="./_framework/blazor.boot.json" as="fetch" crossorigin="anonymous">
Expand Down
31 changes: 15 additions & 16 deletions src/mono/sample/wasm/browser-advanced/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -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: "./_framework/blazor.boot.json",
onConfigLoaded: (config) => {
Expand All @@ -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: () => {
Expand Down
4 changes: 2 additions & 2 deletions src/mono/wasm/runtime/jiterpreter-trace-generator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import {
sizeOfDataItem, sizeOfV128, sizeOfStackval,

disabledOpcodes, countCallTargets,
callTargetCounts, trapTraceErrors,
callTargetCounts,
trace, traceOnError, traceOnRuntimeError,
emitPadding, traceBranchDisplacements,
traceEip, nullCheckValidation,
Expand Down Expand Up @@ -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.
Expand Down
79 changes: 17 additions & 62 deletions src/mono/wasm/runtime/jiterpreter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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(
Expand All @@ -379,7 +335,8 @@ function initialize_builder(builder: WasmBuilder) {
WasmValtype.i32, true
);
builder.defineType(
"copy_ptr", {
"copy_ptr",
{
"dest": WasmValtype.i32,
"src": WasmValtype.i32
},
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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(
<any>fn, methodFullName || methodName, traceOnRuntimeError ? builder.traceBuf : undefined,
builder.base, instrumentedTraceId
), "iii"
)
: addWasmFunctionPointer(<any>fn);
const idx = addWasmFunctionPointer(<any>fn);
if (!idx)
throw new Error("add_function_pointer returned a 0 index");
else if (trace >= 2)
Expand Down Expand Up @@ -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(<any>pMethodName);
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 99bb1b8

Please sign in to comment.