Improve error messages received from Cranelift (#583)
As discussed in https://github.com/bytecodealliance/cranelift/pull/1226, the context of Cranelift errors is lost after exiting the scope containing the Cranelift function. `CodegenError` then only contains something like `inst2: arg 0 (v4) has type i16x8, expected i8x16`, which is rarely enough information for investigating a codegen failure. This change uses Cranelift's `pretty_error` function to improve the error messages wrapped in `CompileError`; `CompileError` has lost the reference to `CodegenError` due to `pretty_error` taking ownership but this seems preferable since no backtrace is attached and losing the pretty-printed context would be worse (if `CodegenError` gains a `Backtrace` or implements `Clone` we can revisit this).
This commit is contained in:
@@ -7,6 +7,7 @@ use alloc::{boxed::Box, rc::Rc, string::ToString, vec::Vec};
|
|||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use core::cmp;
|
use core::cmp;
|
||||||
use cranelift_codegen::ir::{types, InstBuilder, StackSlotData, StackSlotKind, TrapCode};
|
use cranelift_codegen::ir::{types, InstBuilder, StackSlotData, StackSlotKind, TrapCode};
|
||||||
|
use cranelift_codegen::print_errors::pretty_error;
|
||||||
use cranelift_codegen::{binemit, ir, isa, Context};
|
use cranelift_codegen::{binemit, ir, isa, Context};
|
||||||
use cranelift_entity::{EntityRef, PrimaryMap};
|
use cranelift_entity::{EntityRef, PrimaryMap};
|
||||||
use cranelift_frontend::{FunctionBuilder, FunctionBuilderContext};
|
use cranelift_frontend::{FunctionBuilder, FunctionBuilderContext};
|
||||||
@@ -174,6 +175,7 @@ fn make_trampoline(
|
|||||||
&mut trap_sink,
|
&mut trap_sink,
|
||||||
&mut stackmap_sink,
|
&mut stackmap_sink,
|
||||||
)
|
)
|
||||||
|
.map_err(|error| pretty_error(&context.func, Some(isa), error))
|
||||||
.expect("compile_and_emit");
|
.expect("compile_and_emit");
|
||||||
|
|
||||||
let mut unwind_info = Vec::new();
|
let mut unwind_info = Vec::new();
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ use crate::address_map::{ModuleAddressMap, ValueLabelsRanges};
|
|||||||
use crate::module;
|
use crate::module;
|
||||||
use crate::module_environ::FunctionBodyData;
|
use crate::module_environ::FunctionBodyData;
|
||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
use cranelift_codegen::{binemit, ir, isa, CodegenError};
|
use cranelift_codegen::{binemit, ir, isa};
|
||||||
use cranelift_entity::PrimaryMap;
|
use cranelift_entity::PrimaryMap;
|
||||||
use cranelift_wasm::{DefinedFuncIndex, FuncIndex, ModuleTranslationState, WasmError};
|
use cranelift_wasm::{DefinedFuncIndex, FuncIndex, ModuleTranslationState, WasmError};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
@@ -156,8 +156,8 @@ pub enum CompileError {
|
|||||||
Wasm(#[from] WasmError),
|
Wasm(#[from] WasmError),
|
||||||
|
|
||||||
/// A compilation error occured.
|
/// A compilation error occured.
|
||||||
#[error("Compilation error")]
|
#[error("Compilation error: {0}")]
|
||||||
Codegen(#[from] CodegenError),
|
Codegen(String),
|
||||||
|
|
||||||
/// A compilation error occured.
|
/// A compilation error occured.
|
||||||
#[error("Debug info is not supported with this configuration")]
|
#[error("Debug info is not supported with this configuration")]
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ use cranelift_codegen::binemit;
|
|||||||
use cranelift_codegen::ir;
|
use cranelift_codegen::ir;
|
||||||
use cranelift_codegen::ir::ExternalName;
|
use cranelift_codegen::ir::ExternalName;
|
||||||
use cranelift_codegen::isa;
|
use cranelift_codegen::isa;
|
||||||
|
use cranelift_codegen::print_errors::pretty_error;
|
||||||
use cranelift_codegen::Context;
|
use cranelift_codegen::Context;
|
||||||
use cranelift_entity::PrimaryMap;
|
use cranelift_entity::PrimaryMap;
|
||||||
use cranelift_wasm::{DefinedFuncIndex, FuncIndex, FuncTranslator, ModuleTranslationState};
|
use cranelift_wasm::{DefinedFuncIndex, FuncIndex, FuncTranslator, ModuleTranslationState};
|
||||||
@@ -239,13 +240,21 @@ impl crate::compilation::Compiler for Cranelift {
|
|||||||
let mut reloc_sink = RelocSink::new(func_index);
|
let mut reloc_sink = RelocSink::new(func_index);
|
||||||
let mut trap_sink = TrapSink::new();
|
let mut trap_sink = TrapSink::new();
|
||||||
let mut stackmap_sink = binemit::NullStackmapSink {};
|
let mut stackmap_sink = binemit::NullStackmapSink {};
|
||||||
context.compile_and_emit(
|
context
|
||||||
|
.compile_and_emit(
|
||||||
isa,
|
isa,
|
||||||
&mut code_buf,
|
&mut code_buf,
|
||||||
&mut reloc_sink,
|
&mut reloc_sink,
|
||||||
&mut trap_sink,
|
&mut trap_sink,
|
||||||
&mut stackmap_sink,
|
&mut stackmap_sink,
|
||||||
)?;
|
)
|
||||||
|
.map_err(|error| {
|
||||||
|
CompileError::Codegen(pretty_error(
|
||||||
|
&context.func,
|
||||||
|
Some(isa),
|
||||||
|
error,
|
||||||
|
))
|
||||||
|
})?;
|
||||||
|
|
||||||
context.emit_unwind_info(isa, &mut unwind_info);
|
context.emit_unwind_info(isa, &mut unwind_info);
|
||||||
|
|
||||||
@@ -257,7 +266,15 @@ impl crate::compilation::Compiler for Cranelift {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let ranges = if generate_debug_info {
|
let ranges = if generate_debug_info {
|
||||||
Some(context.build_value_labels_ranges(isa)?)
|
let ranges =
|
||||||
|
context.build_value_labels_ranges(isa).map_err(|error| {
|
||||||
|
CompileError::Codegen(pretty_error(
|
||||||
|
&context.func,
|
||||||
|
Some(isa),
|
||||||
|
error,
|
||||||
|
))
|
||||||
|
})?;
|
||||||
|
Some(ranges)
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ use alloc::vec::Vec;
|
|||||||
use core::convert::TryFrom;
|
use core::convert::TryFrom;
|
||||||
use cranelift_codegen::ir::InstBuilder;
|
use cranelift_codegen::ir::InstBuilder;
|
||||||
use cranelift_codegen::isa::{TargetFrontendConfig, TargetIsa};
|
use cranelift_codegen::isa::{TargetFrontendConfig, TargetIsa};
|
||||||
|
use cranelift_codegen::print_errors::pretty_error;
|
||||||
use cranelift_codegen::Context;
|
use cranelift_codegen::Context;
|
||||||
use cranelift_codegen::{binemit, ir};
|
use cranelift_codegen::{binemit, ir};
|
||||||
use cranelift_entity::{EntityRef, PrimaryMap};
|
use cranelift_entity::{EntityRef, PrimaryMap};
|
||||||
@@ -336,7 +337,13 @@ fn make_trampoline(
|
|||||||
&mut trap_sink,
|
&mut trap_sink,
|
||||||
&mut stackmap_sink,
|
&mut stackmap_sink,
|
||||||
)
|
)
|
||||||
.map_err(|error| SetupError::Compile(CompileError::Codegen(error)))?;
|
.map_err(|error| {
|
||||||
|
SetupError::Compile(CompileError::Codegen(pretty_error(
|
||||||
|
&context.func,
|
||||||
|
Some(isa),
|
||||||
|
error,
|
||||||
|
)))
|
||||||
|
})?;
|
||||||
|
|
||||||
context.emit_unwind_info(isa, &mut unwind_info);
|
context.emit_unwind_info(isa, &mut unwind_info);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user