This is an automated email from the git hooks/post-receive script.
pierov pushed a commit to branch geckoview-99.0.1-11.0-1 in repository tor-browser.
commit ca062c9e8d8f95d792bbf7f058572593d71192ef Author: Ryan Hunt rhunt@eqrion.net AuthorDate: Wed Mar 16 19:52:45 2022 +0000
Bug 1757733 - wasm: Don't report warnings from AsmJS compilation, which may be off-main-thread. r=yury a=dmeehan
AsmJS compilation may be off the main thread, so we cannot report warnings to JSContext. wasm::Log may do this if the right pref is on. CompileArgs:: build() uses wasm::Log. AsmJS uses CompileArgs::build(). This commit adds a separate version of CompileArgs::build() which will not log or report errors. AsmJS then asserts that only an OOM may be possible here, as we should ensure a wasm compiler is available before compiling.
Differential Revision: https://phabricator.services.mozilla.com/D141007 --- js/src/fuzz-tests/testWasm.cpp | 2 +- js/src/wasm/AsmJS.cpp | 6 +++++- js/src/wasm/WasmCompile.cpp | 39 ++++++++++++++++++++++++++++++++------- js/src/wasm/WasmCompileArgs.h | 19 +++++++++++++++---- js/src/wasm/WasmIntrinsic.cpp | 2 +- js/src/wasm/WasmJS.cpp | 4 ++-- 6 files changed, 56 insertions(+), 16 deletions(-)
diff --git a/js/src/fuzz-tests/testWasm.cpp b/js/src/fuzz-tests/testWasm.cpp index d86c79d2d5675..3bd268c85ee22 100644 --- a/js/src/fuzz-tests/testWasm.cpp +++ b/js/src/fuzz-tests/testWasm.cpp @@ -255,7 +255,7 @@ static int testWasmFuzz(const uint8_t* buf, size_t size) { ScriptedCaller scriptedCaller; FeatureOptions options; SharedCompileArgs compileArgs = - CompileArgs::build(gCx, std::move(scriptedCaller), options); + CompileArgs::buildAndReport(gCx, std::move(scriptedCaller), options); if (!compileArgs) { return 0; } diff --git a/js/src/wasm/AsmJS.cpp b/js/src/wasm/AsmJS.cpp index 910a5adcb016e..41935c517f069 100644 --- a/js/src/wasm/AsmJS.cpp +++ b/js/src/wasm/AsmJS.cpp @@ -2153,9 +2153,13 @@ class MOZ_STACK_CLASS ModuleValidator : public ModuleValidatorShared {
// The default options are fine for asm.js FeatureOptions options; + CompileArgsError error; SharedCompileArgs args = - CompileArgs::build(cx_, std::move(scriptedCaller), options); + CompileArgs::build(cx_, std::move(scriptedCaller), options, &error); if (!args) { + // EstablishPreconditions will ensure that a compiler is available by + // this point + MOZ_RELEASE_ASSERT(error == CompileArgsError::OutOfMemory); return nullptr; }
diff --git a/js/src/wasm/WasmCompile.cpp b/js/src/wasm/WasmCompile.cpp index 1ae629929844b..cfa42b39749fd 100644 --- a/js/src/wasm/WasmCompile.cpp +++ b/js/src/wasm/WasmCompile.cpp @@ -107,7 +107,8 @@ FeatureArgs FeatureArgs::build(JSContext* cx, const FeatureOptions& options) {
SharedCompileArgs CompileArgs::build(JSContext* cx, ScriptedCaller&& scriptedCaller, - const FeatureOptions& options) { + const FeatureOptions& options, + CompileArgsError* error) { bool baseline = BaselineAvailable(cx); bool ion = IonAvailable(cx); bool cranelift = CraneliftAvailable(cx); @@ -128,7 +129,7 @@ SharedCompileArgs CompileArgs::build(JSContext* cx, // when we're fuzzing we allow inconsistent switches and the check may thus // fail. Let it go to a run-time error instead of crashing. if (debug && (ion || cranelift)) { - JS_ReportErrorASCII(cx, "no WebAssembly compiler available"); + *error = CompileArgsError::NoCompiler; return nullptr; }
@@ -140,12 +141,13 @@ SharedCompileArgs CompileArgs::build(JSContext* cx, }
if (!(baseline || ion || cranelift)) { - JS_ReportErrorASCII(cx, "no WebAssembly compiler available"); + *error = CompileArgsError::NoCompiler; return nullptr; }
CompileArgs* target = cx->new_<CompileArgs>(std::move(scriptedCaller)); if (!target) { + *error = CompileArgsError::OutOfMemory; return nullptr; }
@@ -156,13 +158,36 @@ SharedCompileArgs CompileArgs::build(JSContext* cx, target->forceTiering = forceTiering; target->features = FeatureArgs::build(cx, options);
- Log(cx, "available wasm compilers: tier1=%s tier2=%s", - baseline ? "baseline" : "none", - ion ? "ion" : (cranelift ? "cranelift" : "none")); - return target; }
+SharedCompileArgs CompileArgs::buildAndReport(JSContext* cx, + ScriptedCaller&& scriptedCaller, + const FeatureOptions& options) { + CompileArgsError error; + SharedCompileArgs args = + CompileArgs::build(cx, std::move(scriptedCaller), options, &error); + if (args) { + Log(cx, "available wasm compilers: tier1=%s tier2=%s", + args->baselineEnabled ? "baseline" : "none", + args->ionEnabled ? "ion" + : (args->craneliftEnabled ? "cranelift" : "none")); + return args; + } + + switch (error) { + case CompileArgsError::NoCompiler: { + JS_ReportErrorASCII(cx, "no WebAssembly compiler available"); + break; + } + case CompileArgsError::OutOfMemory: { + // Intentionally do not report the OOM, as callers expect this behavior + break; + } + } + return nullptr; +} + /* * [SMDOC] Tiered wasm compilation. * diff --git a/js/src/wasm/WasmCompileArgs.h b/js/src/wasm/WasmCompileArgs.h index a45660e43cc71..9d408ed3f285f 100644 --- a/js/src/wasm/WasmCompileArgs.h +++ b/js/src/wasm/WasmCompileArgs.h @@ -118,6 +118,13 @@ struct ScriptedCaller { ScriptedCaller() : filenameIsURL(false), line(0) {} };
+// Describes the reasons we cannot compute compile args + +enum class CompileArgsError { + OutOfMemory, + NoCompiler, +}; + // Describes all the parameters that control wasm compilation.
struct CompileArgs; @@ -136,17 +143,21 @@ struct CompileArgs : ShareableBase<CompileArgs> {
FeatureArgs features;
- // CompileArgs has two constructors: + // CompileArgs has three constructors: // - // - one through a factory function `build`, which checks that flags are - // consistent with each other. + // - two through a factory function `build`, which checks that flags are + // consistent with each other, and optionally reports any errors. // - one that gives complete access to underlying fields. // // You should use the first one in general, unless you have a very good // reason (i.e. no JSContext around and you know which flags have been used).
static SharedCompileArgs build(JSContext* cx, ScriptedCaller&& scriptedCaller, - const FeatureOptions& options); + const FeatureOptions& options, + CompileArgsError* error); + static SharedCompileArgs buildAndReport(JSContext* cx, + ScriptedCaller&& scriptedCaller, + const FeatureOptions& options);
explicit CompileArgs(ScriptedCaller&& scriptedCaller) : scriptedCaller(std::move(scriptedCaller)), diff --git a/js/src/wasm/WasmIntrinsic.cpp b/js/src/wasm/WasmIntrinsic.cpp index b0c596139a7f7..d4ebb2345dbe4 100644 --- a/js/src/wasm/WasmIntrinsic.cpp +++ b/js/src/wasm/WasmIntrinsic.cpp @@ -99,7 +99,7 @@ bool wasm::CompileIntrinsicModule(JSContext* cx,
// Initialize the compiler environment, choosing the best tier possible SharedCompileArgs compileArgs = - CompileArgs::build(cx, ScriptedCaller(), featureOptions); + CompileArgs::buildAndReport(cx, ScriptedCaller(), featureOptions); if (!compileArgs) { return false; } diff --git a/js/src/wasm/WasmJS.cpp b/js/src/wasm/WasmJS.cpp index 3b7a2a5d9413a..7ac9f92de8842 100644 --- a/js/src/wasm/WasmJS.cpp +++ b/js/src/wasm/WasmJS.cpp @@ -702,7 +702,7 @@ static SharedCompileArgs InitCompileArgs(JSContext* cx, if (!ParseCompileOptions(cx, maybeOptions, &options)) { return nullptr; } - return CompileArgs::build(cx, std::move(scriptedCaller), options); + return CompileArgs::buildAndReport(cx, std::move(scriptedCaller), options); }
// ============================================================================ @@ -4286,7 +4286,7 @@ JSFunction* WasmFunctionCreate(JSContext* cx, HandleFunction func, FeatureOptions options; ScriptedCaller scriptedCaller; SharedCompileArgs compileArgs = - CompileArgs::build(cx, std::move(scriptedCaller), options); + CompileArgs::buildAndReport(cx, std::move(scriptedCaller), options); if (!compileArgs) { return nullptr; }