Commit 1ff80455 authored by Clemens Hammacher's avatar Clemens Hammacher Committed by Commit Bot

Reland "[wasm] Store compile errors in CompilationState"

This is a reland of bf3d7b9a

Original change's description:
> [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/1303720
> Reviewed-by: Michael Starzinger <mstarzinger@chromium.org>
> Commit-Queue: Clemens Hammacher <clemensh@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#57091}

Bug: v8:8343, v8:7921
Change-Id: Iaa5c89d224cb2bcfca2d12eba305413a9ad95618
Reviewed-on: https://chromium-review.googlesource.com/c/1304547
Commit-Queue: Clemens Hammacher <clemensh@chromium.org>
Reviewed-by: 's avatarMichael Starzinger <mstarzinger@chromium.org>
Cr-Commit-Position: refs/heads/master@{#57126}
parent c5c6b8bc
...@@ -5198,19 +5198,18 @@ TurbofanWasmCompilationUnit::TurbofanWasmCompilationUnit( ...@@ -5198,19 +5198,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,
...@@ -5220,9 +5219,9 @@ SourcePositionTable* TurbofanWasmCompilationUnit::BuildGraphForWasmFunction( ...@@ -5220,9 +5219,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();
...@@ -5243,7 +5242,7 @@ SourcePositionTable* TurbofanWasmCompilationUnit::BuildGraphForWasmFunction( ...@@ -5243,7 +5242,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 {
...@@ -5292,10 +5291,13 @@ void TurbofanWasmCompilationUnit::ExecuteCompilation( ...@@ -5292,10 +5291,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);
......
...@@ -88,6 +88,10 @@ class Result : public ResultBase { ...@@ -88,6 +88,10 @@ class Result : public ResultBase {
std::move(error_result).error_msg()); std::move(error_result).error_msg());
} }
static Result<T> ErrorFrom(const ResultBase& error_result) {
return Error(error_result.error_offset(), error_result.error_msg());
}
// Accessor for the value. Returns const reference if {this} is l-value or // Accessor for the value. Returns const reference if {this} is l-value or
// const, and returns r-value reference if {this} is r-value. This allows to // const, and returns r-value reference if {this} is r-value. This allows to
// extract non-copyable values like {std::unique_ptr} by using // extract non-copyable values like {std::unique_ptr} by using
...@@ -125,13 +129,17 @@ class V8_EXPORT_PRIVATE ErrorThrower { ...@@ -125,13 +129,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