* wasmtime: Pass around more contexts instead of fields This commit refactors some wasmtime internals to pass around more context-style structures rather than individual fields of each structure. The intention here is to make the addition of fields to a structure easier to plumb throughout the internals of wasmtime. Currently you need to edit lots of functions to pass lots of parameters, but ideally after this you'll only need to edit one or two struct fields and then relevant locations have access to the information already. Updates in this commit are: * `debug_info` configuration is now folded into `Tunables`. Additionally a `wasmtime::Config` now holds a `Tunables` directly and is passed into an internal `Compiler`. Eventually this should allow for direct configuration of the `Tunables` attributes from the `wasmtime` API, but no new configuration is exposed at this time. * `ModuleTranslation` is now passed around as a whole rather than passing individual components to allow access to all the fields, including `Tunables`. This was motivated by investigating what it would take to optionally allow loops and such to get interrupted, but that sort of codegen setting was currently relatively difficult to plumb all the way through and now it's hoped to be largely just an addition to `Tunables`. * Fix lightbeam compile
71 lines
2.8 KiB
Rust
71 lines
2.8 KiB
Rust
//! Support for compiling with Lightbeam.
|
|
|
|
use crate::cache::ModuleCacheDataTupleType;
|
|
use crate::compilation::{Compilation, CompileError, Traps};
|
|
use crate::func_environ::FuncEnvironment;
|
|
use crate::ModuleTranslation;
|
|
// TODO: Put this in `compilation`
|
|
use crate::address_map::{ModuleAddressMap, ValueLabelsRanges};
|
|
use crate::cranelift::RelocSink;
|
|
use crate::CacheConfig;
|
|
use cranelift_codegen::isa;
|
|
use cranelift_entity::{PrimaryMap, SecondaryMap};
|
|
|
|
/// A compiler that compiles a WebAssembly module with Lightbeam, directly translating the Wasm file.
|
|
pub struct Lightbeam;
|
|
|
|
impl crate::compilation::Compiler for Lightbeam {
|
|
/// Compile the module using Lightbeam, producing a compilation result with
|
|
/// associated relocations.
|
|
fn compile_module(
|
|
translation: &ModuleTranslation,
|
|
isa: &dyn isa::TargetIsa,
|
|
_cache_config: &CacheConfig,
|
|
) -> Result<ModuleCacheDataTupleType, CompileError> {
|
|
if translation.tunables.debug_info {
|
|
return Err(CompileError::DebugInfoNotSupported);
|
|
}
|
|
|
|
let env = FuncEnvironment::new(isa.frontend_config(), &translation.module.local);
|
|
let mut relocations = PrimaryMap::new();
|
|
let mut codegen_session: lightbeam::CodeGenSession<_> =
|
|
lightbeam::CodeGenSession::new(translation.function_body_inputs.len() as u32, &env);
|
|
|
|
for (i, function_body) in &translation.function_body_inputs {
|
|
let func_index = translation.module.local.func_index(i);
|
|
let mut reloc_sink = RelocSink::new(func_index);
|
|
|
|
lightbeam::translate_function(
|
|
&mut codegen_session,
|
|
&mut reloc_sink,
|
|
i.as_u32(),
|
|
&wasmparser::FunctionBody::new(0, function_body.data),
|
|
)
|
|
.map_err(|e| CompileError::Codegen(format!("Failed to translate function: {}", e)))?;
|
|
relocations.push(reloc_sink.func_relocs);
|
|
}
|
|
|
|
let code_section = codegen_session
|
|
.into_translated_code_section()
|
|
.map_err(|e| CompileError::Codegen(format!("Failed to generate output code: {}", e)))?;
|
|
|
|
// TODO pass jump table offsets to Compilation::from_buffer() when they
|
|
// are implemented in lightbeam -- using empty set of offsets for now.
|
|
// TODO: pass an empty range for the unwind information until lightbeam emits it
|
|
let code_section_ranges_and_jt = code_section
|
|
.funcs()
|
|
.into_iter()
|
|
.map(|r| (r, SecondaryMap::new(), 0..0));
|
|
|
|
Ok((
|
|
Compilation::from_buffer(code_section.buffer().to_vec(), code_section_ranges_and_jt),
|
|
relocations,
|
|
ModuleAddressMap::new(),
|
|
ValueLabelsRanges::new(),
|
|
PrimaryMap::new(),
|
|
Traps::new(),
|
|
PrimaryMap::new(),
|
|
))
|
|
}
|
|
}
|