* Implement trap info in Lightbeam * Start using wasm-reader instead of wasmparser for parsing operators * Update to use wasm-reader, some reductions in allocation, support source location tracking for traps, start to support multi-value The only thing that still needs to be supported for multi-value is stack returns, but we need to make it compatible with Cranelift. * Error when running out of registers (although we'd hope it should be impossible) instead of panicking * WIP: Update Lightbeam to work with latest Wasmtime * WIP: Update Lightbeam to use current wasmtime * WIP: Migrate to new system for builtin functions * WIP: Update Lightbeam to work with latest Wasmtime * Remove multi_mut * Format * Fix some bugs around arguments, add debuginfo offset tracking * Complete integration with new Wasmtime * Remove commented code * Fix formatting * Fix warnings, remove unused dependencies * Fix `iter` if there are too many elements, fix compilation for latest wasmtime * Fix float arguments on stack * Remove wasm-reader and trap info work * Allocate stack space _before_ passing arguments, fail if we can't zero a xmm reg * Fix stack argument offset calculation * Fix stack arguments in Lightbeam * Re-add WASI because it somehow got removed during rebase * Workaround for apparent `type_alias_impl_trait`-related bug in rustdoc * Fix breakages caused by rebase, remove module offset info as it is unrelated to wasmtime integration PR and was broken by rebase * Add TODO comment explaining `lightbeam::ModuleContext` trait
124 lines
3.4 KiB
Rust
124 lines
3.4 KiB
Rust
use crate::backend::TranslatedCodeSection;
|
|
use crate::error::Error;
|
|
use crate::module::SimpleContext;
|
|
use cranelift_codegen::{binemit, ir};
|
|
use wasmparser::{
|
|
CodeSectionReader, DataSectionReader, ElementSectionReader, ExportSectionReader, FuncType,
|
|
FunctionSectionReader, GlobalSectionReader, ImportSectionReader, MemorySectionReader,
|
|
MemoryType, TableSectionReader, TableType, TypeSectionReader,
|
|
};
|
|
|
|
/// Parses the Type section of the wasm module.
|
|
pub fn type_(types_reader: TypeSectionReader) -> Result<Vec<FuncType>, Error> {
|
|
types_reader
|
|
.into_iter()
|
|
.map(|r| r.map_err(Into::into))
|
|
.collect()
|
|
}
|
|
|
|
/// Parses the Import section of the wasm module.
|
|
pub fn import(imports: ImportSectionReader) -> Result<(), Error> {
|
|
for entry in imports {
|
|
entry?; // TODO
|
|
}
|
|
Ok(())
|
|
}
|
|
|
|
/// Parses the Function section of the wasm module.
|
|
pub fn function(functions: FunctionSectionReader) -> Result<Vec<u32>, Error> {
|
|
functions
|
|
.into_iter()
|
|
.map(|r| r.map_err(Into::into))
|
|
.collect()
|
|
}
|
|
|
|
/// Parses the Table section of the wasm module.
|
|
pub fn table(tables: TableSectionReader) -> Result<Vec<TableType>, Error> {
|
|
tables.into_iter().map(|r| r.map_err(Into::into)).collect()
|
|
}
|
|
|
|
/// Parses the Memory section of the wasm module.
|
|
pub fn memory(memories: MemorySectionReader) -> Result<Vec<MemoryType>, Error> {
|
|
memories
|
|
.into_iter()
|
|
.map(|r| r.map_err(Into::into))
|
|
.collect()
|
|
}
|
|
|
|
/// Parses the Global section of the wasm module.
|
|
pub fn global(globals: GlobalSectionReader) -> Result<(), Error> {
|
|
for entry in globals {
|
|
entry?; // TODO
|
|
}
|
|
Ok(())
|
|
}
|
|
|
|
/// Parses the Export section of the wasm module.
|
|
pub fn export(exports: ExportSectionReader) -> Result<(), Error> {
|
|
for entry in exports {
|
|
entry?; // TODO
|
|
}
|
|
Ok(())
|
|
}
|
|
|
|
/// Parses the Start section of the wasm module.
|
|
pub fn start(_index: u32) -> Result<(), Error> {
|
|
// TODO
|
|
Ok(())
|
|
}
|
|
|
|
/// Parses the Element section of the wasm module.
|
|
pub fn element(elements: ElementSectionReader) -> Result<(), Error> {
|
|
for entry in elements {
|
|
entry?;
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
|
|
struct UnimplementedRelocSink;
|
|
|
|
impl binemit::RelocSink for UnimplementedRelocSink {
|
|
fn reloc_block(&mut self, _: binemit::CodeOffset, _: binemit::Reloc, _: binemit::CodeOffset) {
|
|
unimplemented!()
|
|
}
|
|
|
|
fn reloc_external(
|
|
&mut self,
|
|
_: binemit::CodeOffset,
|
|
_: ir::SourceLoc,
|
|
_: binemit::Reloc,
|
|
_: &ir::ExternalName,
|
|
_: binemit::Addend,
|
|
) {
|
|
unimplemented!()
|
|
}
|
|
|
|
fn reloc_constant(&mut self, _: binemit::CodeOffset, _: binemit::Reloc, _: ir::ConstantOffset) {
|
|
unimplemented!()
|
|
}
|
|
|
|
fn reloc_jt(&mut self, _: binemit::CodeOffset, _: binemit::Reloc, _: ir::JumpTable) {
|
|
unimplemented!()
|
|
}
|
|
}
|
|
|
|
/// Parses the Code section of the wasm module.
|
|
pub fn code(
|
|
_code: CodeSectionReader,
|
|
_translation_ctx: &SimpleContext,
|
|
) -> Result<TranslatedCodeSection, Error> {
|
|
// TODO: Remove the Lightbeam harness entirely, this is just to make this compile.
|
|
// We do all our testing through Wasmtime now, there's no reason to duplicate
|
|
// writing a WebAssembly environment in Lightbeam too.
|
|
unimplemented!("Incomplete migration to wasm-reader");
|
|
}
|
|
|
|
/// Parses the Data section of the wasm module.
|
|
pub fn data(data: DataSectionReader) -> Result<(), Error> {
|
|
for entry in data {
|
|
entry?; // TODO
|
|
}
|
|
Ok(())
|
|
}
|