Commit bf3d7b9a authored by Clemens Hammacher's avatar Clemens Hammacher Committed by Commit Bot

[wasm] Store compile errors in CompilationState

We are currently storing compilation errors in the individual
compilation units and pass it to the ErrorThrower during finishing.
This CL changes that to store errors on the CompilationState directly.
From there, it is propagated to the ErrorThrower in the compilation
state callback.
This removes more work from the finisher task and slims down the
WasmCompilationUnits.

R=mstarzinger@chromium.org

Bug: v8:8343, v8:7921
Change-Id: Id332add43d4219d2a30fee653ed4e53a9b2698d9
Reviewed-on: https://chromium-review.googlesource.com/c/1303720Reviewed-by: 's avatarMichael Starzinger <mstarzinger@chromium.org>
Commit-Queue: Clemens Hammacher <clemensh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#57091}
parent bb389dc7
...@@ -5200,19 +5200,18 @@ TurbofanWasmCompilationUnit::TurbofanWasmCompilationUnit( ...@@ -5200,19 +5200,18 @@ TurbofanWasmCompilationUnit::TurbofanWasmCompilationUnit(
// Clears unique_ptrs, but (part of) the type is forward declared in the header. // Clears unique_ptrs, but (part of) the type is forward declared in the header.
TurbofanWasmCompilationUnit::~TurbofanWasmCompilationUnit() = default; TurbofanWasmCompilationUnit::~TurbofanWasmCompilationUnit() = default;
SourcePositionTable* TurbofanWasmCompilationUnit::BuildGraphForWasmFunction( bool TurbofanWasmCompilationUnit::BuildGraphForWasmFunction(
wasm::CompilationEnv* env, wasm::WasmFeatures* detected, double* decode_ms, wasm::CompilationEnv* env, wasm::WasmFeatures* detected, double* decode_ms,
MachineGraph* mcgraph, NodeOriginTable* node_origins) { MachineGraph* mcgraph, NodeOriginTable* node_origins,
SourcePositionTable* source_positions) {
base::ElapsedTimer decode_timer; base::ElapsedTimer decode_timer;
if (FLAG_trace_wasm_decode_time) { if (FLAG_trace_wasm_decode_time) {
decode_timer.Start(); decode_timer.Start();
} }
// Create a TF graph during decoding. // Create a TF graph during decoding.
SourcePositionTable* source_position_table =
new (mcgraph->zone()) SourcePositionTable(mcgraph->graph());
WasmGraphBuilder builder(env, mcgraph->zone(), mcgraph, WasmGraphBuilder builder(env, mcgraph->zone(), mcgraph,
wasm_unit_->func_body_.sig, source_position_table); wasm_unit_->func_body_.sig, source_positions);
wasm::VoidResult graph_construction_result = wasm::BuildTFGraph( wasm::VoidResult graph_construction_result = wasm::BuildTFGraph(
wasm_unit_->wasm_engine_->allocator(), wasm_unit_->wasm_engine_->allocator(),
wasm_unit_->native_module_->enabled_features(), env->module, &builder, wasm_unit_->native_module_->enabled_features(), env->module, &builder,
...@@ -5222,9 +5221,9 @@ SourcePositionTable* TurbofanWasmCompilationUnit::BuildGraphForWasmFunction( ...@@ -5222,9 +5221,9 @@ SourcePositionTable* TurbofanWasmCompilationUnit::BuildGraphForWasmFunction(
StdoutStream{} << "Compilation failed: " StdoutStream{} << "Compilation failed: "
<< graph_construction_result.error_msg() << std::endl; << graph_construction_result.error_msg() << std::endl;
} }
wasm_unit_->result_ = wasm::Result<wasm::WasmCode*>::ErrorFrom( wasm_unit_->native_module()->compilation_state()->SetError(
std::move(graph_construction_result)); wasm_unit_->func_index_, std::move(graph_construction_result));
return nullptr; return false;
} }
builder.LowerInt64(); builder.LowerInt64();
...@@ -5245,7 +5244,7 @@ SourcePositionTable* TurbofanWasmCompilationUnit::BuildGraphForWasmFunction( ...@@ -5245,7 +5244,7 @@ SourcePositionTable* TurbofanWasmCompilationUnit::BuildGraphForWasmFunction(
if (FLAG_trace_wasm_decode_time) { if (FLAG_trace_wasm_decode_time) {
*decode_ms = decode_timer.Elapsed().InMillisecondsF(); *decode_ms = decode_timer.Elapsed().InMillisecondsF();
} }
return source_position_table; return true;
} }
namespace { namespace {
...@@ -5294,10 +5293,13 @@ void TurbofanWasmCompilationUnit::ExecuteCompilation( ...@@ -5294,10 +5293,13 @@ void TurbofanWasmCompilationUnit::ExecuteCompilation(
? new (&zone) ? new (&zone)
NodeOriginTable(mcgraph->graph()) NodeOriginTable(mcgraph->graph())
: nullptr; : nullptr;
SourcePositionTable* source_positions = BuildGraphForWasmFunction( SourcePositionTable* source_positions =
env, detected, &decode_ms, mcgraph, node_origins); new (mcgraph->zone()) SourcePositionTable(mcgraph->graph());
if (!BuildGraphForWasmFunction(env, detected, &decode_ms, mcgraph,
if (wasm_unit_->failed()) return; node_origins, source_positions)) {
// Compilation failed.
return;
}
if (node_origins) { if (node_origins) {
node_origins->AddDecorator(); node_origins->AddDecorator();
......
...@@ -50,11 +50,11 @@ class TurbofanWasmCompilationUnit { ...@@ -50,11 +50,11 @@ class TurbofanWasmCompilationUnit {
explicit TurbofanWasmCompilationUnit(wasm::WasmCompilationUnit* wasm_unit); explicit TurbofanWasmCompilationUnit(wasm::WasmCompilationUnit* wasm_unit);
~TurbofanWasmCompilationUnit(); ~TurbofanWasmCompilationUnit();
SourcePositionTable* BuildGraphForWasmFunction(wasm::CompilationEnv* env, bool BuildGraphForWasmFunction(wasm::CompilationEnv* env,
wasm::WasmFeatures* detected, wasm::WasmFeatures* detected,
double* decode_ms, double* decode_ms, MachineGraph* mcgraph,
MachineGraph* mcgraph, NodeOriginTable* node_origins,
NodeOriginTable* node_origins); SourcePositionTable* source_positions);
void ExecuteCompilation(wasm::CompilationEnv*, Counters*, void ExecuteCompilation(wasm::CompilationEnv*, Counters*,
wasm::WasmFeatures* detected); wasm::WasmFeatures* detected);
......
...@@ -13,6 +13,7 @@ namespace internal { ...@@ -13,6 +13,7 @@ namespace internal {
namespace wasm { namespace wasm {
class NativeModule; class NativeModule;
class ResultBase;
enum RuntimeExceptionSupport : bool { enum RuntimeExceptionSupport : bool {
kRuntimeExceptionSupport = true, kRuntimeExceptionSupport = true,
...@@ -71,6 +72,8 @@ class CompilationState { ...@@ -71,6 +72,8 @@ class CompilationState {
void CancelAndWait(); void CancelAndWait();
void SetError(uint32_t func_index, const ResultBase& error_result);
private: private:
friend class NativeModule; friend class NativeModule;
CompilationState() = delete; CompilationState() = delete;
......
...@@ -93,25 +93,6 @@ void WasmCompilationUnit::ExecuteCompilation(CompilationEnv* env, ...@@ -93,25 +93,6 @@ void WasmCompilationUnit::ExecuteCompilation(CompilationEnv* env,
} }
} }
void WasmCompilationUnit::ReportError(ErrorThrower* thrower) const {
DCHECK(result_.failed());
// Add the function as another context for the exception. This is
// user-visible, so use official format.
EmbeddedVector<char, 128> message;
wasm::ModuleWireBytes wire_bytes(native_module()->wire_bytes());
wasm::WireBytesRef name_ref =
native_module()->module()->LookupFunctionName(wire_bytes, func_index_);
if (name_ref.is_set()) {
wasm::WasmName name = wire_bytes.GetNameOrNull(name_ref);
SNPrintF(message, "Compiling wasm function \"%.*s\" failed", name.length(),
name.start());
} else {
SNPrintF(message, "Compiling wasm function \"wasm-function[%d]\" failed",
func_index_);
}
thrower->CompileFailed(message.start(), result_);
}
void WasmCompilationUnit::SwitchMode(ExecutionTier new_mode) { void WasmCompilationUnit::SwitchMode(ExecutionTier new_mode) {
// This method is being called in the constructor, where neither // This method is being called in the constructor, where neither
// {liftoff_unit_} nor {turbofan_unit_} are set, or to switch mode from // {liftoff_unit_} nor {turbofan_unit_} are set, or to switch mode from
...@@ -135,9 +116,11 @@ void WasmCompilationUnit::SwitchMode(ExecutionTier new_mode) { ...@@ -135,9 +116,11 @@ void WasmCompilationUnit::SwitchMode(ExecutionTier new_mode) {
} }
// static // static
bool WasmCompilationUnit::CompileWasmFunction( bool WasmCompilationUnit::CompileWasmFunction(Isolate* isolate,
Isolate* isolate, NativeModule* native_module, WasmFeatures* detected, NativeModule* native_module,
ErrorThrower* thrower, const WasmFunction* function, ExecutionTier mode) { WasmFeatures* detected,
const WasmFunction* function,
ExecutionTier mode) {
ModuleWireBytes wire_bytes(native_module->wire_bytes()); ModuleWireBytes wire_bytes(native_module->wire_bytes());
FunctionBody function_body{function->sig, function->code.offset(), FunctionBody function_body{function->sig, function->code.offset(),
wire_bytes.start() + function->code.offset(), wire_bytes.start() + function->code.offset(),
...@@ -147,17 +130,12 @@ bool WasmCompilationUnit::CompileWasmFunction( ...@@ -147,17 +130,12 @@ bool WasmCompilationUnit::CompileWasmFunction(
function->func_index, mode); function->func_index, mode);
CompilationEnv env = native_module->CreateCompilationEnv(); CompilationEnv env = native_module->CreateCompilationEnv();
unit.ExecuteCompilation(&env, isolate->counters(), detected); unit.ExecuteCompilation(&env, isolate->counters(), detected);
if (unit.failed()) { return !unit.failed();
unit.ReportError(thrower);
return false;
}
return true;
} }
void WasmCompilationUnit::SetResult(WasmCode* code, Counters* counters) { void WasmCompilationUnit::SetResult(WasmCode* code, Counters* counters) {
DCHECK(!result_.failed()); DCHECK_NULL(result_);
DCHECK_NULL(result_.value()); result_ = code;
result_ = Result<WasmCode*>(code);
native_module()->PublishCode(code); native_module()->PublishCode(code);
counters->wasm_generated_code_size()->Increment( counters->wasm_generated_code_size()->Increment(
......
...@@ -46,17 +46,11 @@ class WasmCompilationUnit final { ...@@ -46,17 +46,11 @@ class WasmCompilationUnit final {
NativeModule* native_module() const { return native_module_; } NativeModule* native_module() const { return native_module_; }
ExecutionTier mode() const { return mode_; } ExecutionTier mode() const { return mode_; }
bool failed() const { return result_.failed(); } bool failed() const { return result_ == nullptr; } // TODO(clemensh): Remove.
WasmCode* result() const { WasmCode* result() const { return result_; }
DCHECK(!failed());
DCHECK_NOT_NULL(result_.value());
return result_.value();
}
void ReportError(ErrorThrower* thrower) const;
static bool CompileWasmFunction(Isolate* isolate, NativeModule* native_module, static bool CompileWasmFunction(Isolate* isolate, NativeModule* native_module,
WasmFeatures* detected, ErrorThrower* thrower, WasmFeatures* detected,
const WasmFunction* function, const WasmFunction* function,
ExecutionTier = GetDefaultExecutionTier()); ExecutionTier = GetDefaultExecutionTier());
...@@ -69,7 +63,7 @@ class WasmCompilationUnit final { ...@@ -69,7 +63,7 @@ class WasmCompilationUnit final {
int func_index_; int func_index_;
NativeModule* native_module_; NativeModule* native_module_;
ExecutionTier mode_; ExecutionTier mode_;
wasm::Result<WasmCode*> result_; WasmCode* result_ = nullptr;
// LiftoffCompilationUnit, set if {mode_ == kLiftoff}. // LiftoffCompilationUnit, set if {mode_ == kLiftoff}.
std::unique_ptr<LiftoffCompilationUnit> liftoff_unit_; std::unique_ptr<LiftoffCompilationUnit> liftoff_unit_;
......
This diff is collapsed.
...@@ -173,11 +173,10 @@ std::shared_ptr<StreamingDecoder> WasmEngine::StartStreamingCompilation( ...@@ -173,11 +173,10 @@ std::shared_ptr<StreamingDecoder> WasmEngine::StartStreamingCompilation(
bool WasmEngine::CompileFunction(Isolate* isolate, NativeModule* native_module, bool WasmEngine::CompileFunction(Isolate* isolate, NativeModule* native_module,
uint32_t function_index, ExecutionTier tier) { uint32_t function_index, ExecutionTier tier) {
ErrorThrower thrower(isolate, "Manually requested tier up");
// Note we assume that "one-off" compilations can discard detected features. // Note we assume that "one-off" compilations can discard detected features.
WasmFeatures detected = kNoWasmFeatures; WasmFeatures detected = kNoWasmFeatures;
return WasmCompilationUnit::CompileWasmFunction( return WasmCompilationUnit::CompileWasmFunction(
isolate, native_module, &detected, &thrower, isolate, native_module, &detected,
&native_module->module()->functions[function_index], tier); &native_module->module()->functions[function_index], tier);
} }
......
...@@ -95,8 +95,8 @@ class V8_EXPORT_PRIVATE WasmEngine { ...@@ -95,8 +95,8 @@ class V8_EXPORT_PRIVATE WasmEngine {
std::shared_ptr<CompilationResultResolver> resolver); std::shared_ptr<CompilationResultResolver> resolver);
// Compiles the function with the given index at a specific compilation tier // Compiles the function with the given index at a specific compilation tier
// and returns true on success, false (and pending exception) otherwise. This // and returns true on success, false otherwise. This is mostly used for
// is mostly used for testing to force a function into a specific tier. // testing to force a function into a specific tier.
bool CompileFunction(Isolate* isolate, NativeModule* native_module, bool CompileFunction(Isolate* isolate, NativeModule* native_module,
uint32_t function_index, ExecutionTier tier); uint32_t function_index, ExecutionTier tier);
......
...@@ -125,13 +125,17 @@ class V8_EXPORT_PRIVATE ErrorThrower { ...@@ -125,13 +125,17 @@ class V8_EXPORT_PRIVATE ErrorThrower {
PRINTF_FORMAT(2, 3) void LinkError(const char* fmt, ...); PRINTF_FORMAT(2, 3) void LinkError(const char* fmt, ...);
PRINTF_FORMAT(2, 3) void RuntimeError(const char* fmt, ...); PRINTF_FORMAT(2, 3) void RuntimeError(const char* fmt, ...);
template <typename T> void CompileFailed(const char* error, const ResultBase& result) {
void CompileFailed(const char* error, const Result<T>& result) {
DCHECK(result.failed()); DCHECK(result.failed());
CompileError("%s: %s @+%u", error, result.error_msg().c_str(), CompileError("%s: %s @+%u", error, result.error_msg().c_str(),
result.error_offset()); result.error_offset());
} }
void CompileFailed(const ResultBase& result) {
DCHECK(result.failed());
CompileError("%s @+%u", result.error_msg().c_str(), result.error_offset());
}
// Create and return exception object. // Create and return exception object.
V8_WARN_UNUSED_RESULT Handle<Object> Reify(); V8_WARN_UNUSED_RESULT Handle<Object> Reify();
......
...@@ -350,10 +350,9 @@ TEST(SharedEngineRunThreadedTierUp) { ...@@ -350,10 +350,9 @@ TEST(SharedEngineRunThreadedTierUp) {
threads.emplace_back(&engine, [module](SharedEngineIsolate& isolate) { threads.emplace_back(&engine, [module](SharedEngineIsolate& isolate) {
HandleScope scope(isolate.isolate()); HandleScope scope(isolate.isolate());
Handle<WasmInstanceObject> instance = isolate.ImportInstance(module); Handle<WasmInstanceObject> instance = isolate.ImportInstance(module);
ErrorThrower thrower(isolate.isolate(), "Forced Tier Up");
WasmFeatures detected = kNoWasmFeatures; WasmFeatures detected = kNoWasmFeatures;
WasmCompilationUnit::CompileWasmFunction( WasmCompilationUnit::CompileWasmFunction(
isolate.isolate(), module.get(), &detected, &thrower, isolate.isolate(), module.get(), &detected,
&module->module()->functions[0], ExecutionTier::kOptimized); &module->module()->functions[0], ExecutionTier::kOptimized);
CHECK_EQ(23, isolate.Run(instance)); CHECK_EQ(23, isolate.Run(instance));
}); });
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment