Skip to content

Commit 0926a50

Browse files
committed
Implement caching for parser refactor
1 parent 4770277 commit 0926a50

File tree

3 files changed

+73
-39
lines changed

3 files changed

+73
-39
lines changed

lib/llvm-backend/src/code.rs

+23-6
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@ use inkwell::{
1010
use smallvec::SmallVec;
1111
use std::sync::Arc;
1212
use wasmer_runtime_core::{
13-
backend::Backend,
13+
backend::{Backend, CacheGen, Token},
14+
cache::{Artifact, Error as CacheError},
1415
codegen::*,
1516
memory::MemoryType,
16-
module::ModuleInfo,
17+
module::{ModuleInfo, ModuleInner},
1718
structures::{Map, SliceMap, TypedIndex},
1819
types::{
1920
FuncIndex, FuncSig, GlobalIndex, LocalFuncIndex, LocalOrImport, MemoryIndex, SigIndex,
@@ -25,7 +26,7 @@ use wasmparser::{
2526
Type as WpType,
2627
};
2728

28-
use crate::backend::LLVMBackend;
29+
use crate::backend::{LLVMBackend, LLVMCache};
2930
use crate::intrinsics::{CtxType, GlobalCache, Intrinsics, MemoryCache};
3031
use crate::read_info::type_to_type;
3132
use crate::state::{ControlFrame, IfElseState, State};
@@ -4640,7 +4641,10 @@ impl ModuleCodeGenerator<LLVMFunctionCodeGenerator, LLVMBackend, CodegenError>
46404641
Ok(self.functions.last_mut().unwrap())
46414642
}
46424643

4643-
fn finalize(self, module_info: &ModuleInfo) -> Result<LLVMBackend, CodegenError> {
4644+
fn finalize(
4645+
self,
4646+
module_info: &ModuleInfo,
4647+
) -> Result<(LLVMBackend, Box<dyn CacheGen>), CodegenError> {
46444648
// self.module.print_to_stderr();
46454649

46464650
generate_trampolines(
@@ -4668,8 +4672,8 @@ impl ModuleCodeGenerator<LLVMFunctionCodeGenerator, LLVMBackend, CodegenError>
46684672

46694673
// self.module.print_to_stderr();
46704674

4671-
let (backend, _cache_gen) = LLVMBackend::new(self.module, self.intrinsics);
4672-
Ok(backend)
4675+
let (backend, cache_gen) = LLVMBackend::new(self.module, self.intrinsics);
4676+
Ok((backend, Box::new(cache_gen)))
46734677
}
46744678

46754679
fn feed_signatures(&mut self, signatures: Map<SigIndex, FuncSig>) -> Result<(), CodegenError> {
@@ -4693,4 +4697,17 @@ impl ModuleCodeGenerator<LLVMFunctionCodeGenerator, LLVMBackend, CodegenError>
46934697
self.func_import_count += 1;
46944698
Ok(())
46954699
}
4700+
4701+
unsafe fn from_cache(artifact: Artifact, _: Token) -> Result<ModuleInner, CacheError> {
4702+
let (info, _, memory) = artifact.consume();
4703+
let (backend, cache_gen) =
4704+
LLVMBackend::from_buffer(memory).map_err(CacheError::DeserializeError)?;
4705+
4706+
Ok(ModuleInner {
4707+
runnable_module: Box::new(backend),
4708+
cache_gen: Box::new(cache_gen),
4709+
4710+
info,
4711+
})
4712+
}
46964713
}

lib/runtime-core/src/codegen.rs

+16-21
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,16 @@ pub trait ModuleCodeGenerator<FCG: FunctionCodeGenerator<E>, RM: RunnableModule,
5050

5151
/// Creates a new function and returns the function-scope code generator for it.
5252
fn next_function(&mut self) -> Result<&mut FCG, E>;
53-
fn finalize(self, module_info: &ModuleInfo) -> Result<RM, E>;
53+
fn finalize(self, module_info: &ModuleInfo) -> Result<(RM, Box<dyn CacheGen>), E>;
5454
fn feed_signatures(&mut self, signatures: Map<SigIndex, FuncSig>) -> Result<(), E>;
5555

5656
/// Sets function signatures.
5757
fn feed_function_signatures(&mut self, assoc: Map<FuncIndex, SigIndex>) -> Result<(), E>;
5858

5959
/// Adds an import function.
6060
fn feed_import_function(&mut self) -> Result<(), E>;
61+
62+
unsafe fn from_cache(cache: Artifact, _: Token) -> Result<ModuleInner, CacheError>;
6163
}
6264

6365
pub struct StreamingCompiler<
@@ -131,15 +133,6 @@ impl<
131133
compiler_config: CompilerConfig,
132134
_: Token,
133135
) -> CompileResult<ModuleInner> {
134-
struct Placeholder;
135-
impl CacheGen for Placeholder {
136-
fn generate_cache(&self) -> Result<(Box<[u8]>, Memory), CacheError> {
137-
Err(CacheError::Unknown(
138-
"the streaming compiler API doesn't support caching yet".to_string(),
139-
))
140-
}
141-
}
142-
143136
let mut mcg = MCG::new();
144137
let mut chain = (self.middleware_chain_generator)();
145138
let info = crate::parse::read_module(
@@ -149,22 +142,24 @@ impl<
149142
&mut chain,
150143
&compiler_config,
151144
)?;
152-
let exec_context = mcg
153-
.finalize(&info)
154-
.map_err(|x| CompileError::InternalError {
155-
msg: format!("{:?}", x),
156-
})?;
145+
let (exec_context, cache_gen) =
146+
mcg.finalize(&info)
147+
.map_err(|x| CompileError::InternalError {
148+
msg: format!("{:?}", x),
149+
})?;
157150
Ok(ModuleInner {
158-
cache_gen: Box::new(Placeholder),
151+
cache_gen,
159152
runnable_module: Box::new(exec_context),
160-
info: info,
153+
info,
161154
})
162155
}
163156

164-
unsafe fn from_cache(&self, _artifact: Artifact, _: Token) -> Result<ModuleInner, CacheError> {
165-
Err(CacheError::Unknown(
166-
"the streaming compiler API doesn't support caching yet".to_string(),
167-
))
157+
unsafe fn from_cache(
158+
&self,
159+
artifact: Artifact,
160+
token: Token,
161+
) -> Result<ModuleInner, CacheError> {
162+
MCG::from_cache(artifact, token)
168163
}
169164
}
170165

lib/singlepass-backend/src/codegen_x64.rs

+34-12
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@ use smallvec::SmallVec;
1010
use std::ptr::NonNull;
1111
use std::{any::Any, collections::HashMap, sync::Arc};
1212
use wasmer_runtime_core::{
13-
backend::{Backend, RunnableModule},
13+
backend::{sys::Memory, Backend, CacheGen, RunnableModule, Token},
14+
cache::{Artifact, Error as CacheError},
1415
codegen::*,
1516
memory::MemoryType,
16-
module::ModuleInfo,
17+
module::{ModuleInfo, ModuleInner},
1718
structures::{Map, TypedIndex},
1819
typed_func::Wasm,
1920
types::{
@@ -349,7 +350,10 @@ impl ModuleCodeGenerator<X64FunctionCode, X64ExecutionContext, CodegenError>
349350
Ok(self.functions.last_mut().unwrap())
350351
}
351352

352-
fn finalize(mut self, _: &ModuleInfo) -> Result<X64ExecutionContext, CodegenError> {
353+
fn finalize(
354+
mut self,
355+
_: &ModuleInfo,
356+
) -> Result<(X64ExecutionContext, Box<dyn CacheGen>), CodegenError> {
353357
let (assembler, mut br_table_data, breakpoints) = match self.functions.last_mut() {
354358
Some(x) => (
355359
x.assembler.take().unwrap(),
@@ -404,15 +408,27 @@ impl ModuleCodeGenerator<X64FunctionCode, X64ExecutionContext, CodegenError>
404408
.collect(),
405409
);
406410

407-
Ok(X64ExecutionContext {
408-
code: output,
409-
functions: self.functions,
410-
signatures: self.signatures.as_ref().unwrap().clone(),
411-
_br_table_data: br_table_data,
412-
breakpoints: breakpoints,
413-
func_import_count: self.func_import_count,
414-
function_pointers: out_labels,
415-
})
411+
struct Placeholder;
412+
impl CacheGen for Placeholder {
413+
fn generate_cache(&self) -> Result<(Box<[u8]>, Memory), CacheError> {
414+
Err(CacheError::Unknown(
415+
"the singlepass backend doesn't support caching yet".to_string(),
416+
))
417+
}
418+
}
419+
420+
Ok((
421+
X64ExecutionContext {
422+
code: output,
423+
functions: self.functions,
424+
signatures: self.signatures.as_ref().unwrap().clone(),
425+
_br_table_data: br_table_data,
426+
breakpoints: breakpoints,
427+
func_import_count: self.func_import_count,
428+
function_pointers: out_labels,
429+
},
430+
Box::new(Placeholder),
431+
))
416432
}
417433

418434
fn feed_signatures(&mut self, signatures: Map<SigIndex, FuncSig>) -> Result<(), CodegenError> {
@@ -461,6 +477,12 @@ impl ModuleCodeGenerator<X64FunctionCode, X64ExecutionContext, CodegenError>
461477

462478
Ok(())
463479
}
480+
481+
unsafe fn from_cache(artifact: Artifact, _: Token) -> Result<ModuleInner, CacheError> {
482+
Err(CacheError::Unknown(
483+
"the singlepass compiler API doesn't support caching yet".to_string(),
484+
))
485+
}
464486
}
465487

466488
impl X64FunctionCode {

0 commit comments

Comments
 (0)