mirror of
https://github.com/fluencelabs/wasmer
synced 2025-06-23 05:31:32 +00:00
Fixing lifetime issues in clif codegen refactor
This commit is contained in:
@ -13,7 +13,7 @@ use crate::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
use cranelift_codegen::entity::EntityRef;
|
use cranelift_codegen::entity::EntityRef;
|
||||||
use cranelift_codegen::ir::{self, Ebb, InstBuilder, ValueLabel};
|
use cranelift_codegen::ir::{self, Ebb, Function, InstBuilder, ValueLabel};
|
||||||
use cranelift_codegen::timing;
|
use cranelift_codegen::timing;
|
||||||
use cranelift_codegen::{cursor::FuncCursor, isa};
|
use cranelift_codegen::{cursor::FuncCursor, isa};
|
||||||
use cranelift_frontend::{FunctionBuilder, FunctionBuilderContext, Variable};
|
use cranelift_frontend::{FunctionBuilder, FunctionBuilderContext, Variable};
|
||||||
@ -105,17 +105,23 @@ impl ModuleCodeGenerator<CraneliftFunctionCodeGenerator, Caller, CodegenError>
|
|||||||
|
|
||||||
let mut func_env = CraneliftFunctionCodeGenerator {
|
let mut func_env = CraneliftFunctionCodeGenerator {
|
||||||
builder: None,
|
builder: None,
|
||||||
func_body: func,
|
|
||||||
func_translator,
|
func_translator,
|
||||||
next_local: 0,
|
next_local: 0,
|
||||||
clif_signatures: self.clif_signatures.clone(),
|
clif_signatures: self.clif_signatures.clone(),
|
||||||
module_info: Arc::clone(&module_info),
|
module_info: Arc::clone(&module_info),
|
||||||
target_config: self.isa.frontend_config().clone(),
|
target_config: self.isa.frontend_config().clone(),
|
||||||
};
|
};
|
||||||
let builder = FunctionBuilder::new(
|
|
||||||
&mut func_env.func_body,
|
// Coercing lifetime to accommodate FunctionBuilder new
|
||||||
&mut func_env.func_translator.func_ctx,
|
let func_ref =
|
||||||
);
|
unsafe { ::std::mem::transmute::<&mut Function, &'static mut Function>(&mut func) };
|
||||||
|
let func_ctx = unsafe {
|
||||||
|
::std::mem::transmute::<&mut FunctionBuilderContext, &'static mut FunctionBuilderContext>(
|
||||||
|
&mut func_env.func_translator.func_ctx,
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
let builder = FunctionBuilder::new(func_ref, func_ctx);
|
||||||
func_env.builder = Some(builder);
|
func_env.builder = Some(builder);
|
||||||
|
|
||||||
let mut builder = func_env.builder.as_mut().unwrap();
|
let mut builder = func_env.builder.as_mut().unwrap();
|
||||||
@ -137,7 +143,8 @@ impl ModuleCodeGenerator<CraneliftFunctionCodeGenerator, Caller, CodegenError>
|
|||||||
// function and its return values.
|
// function and its return values.
|
||||||
let exit_block = builder.create_ebb();
|
let exit_block = builder.create_ebb();
|
||||||
builder.append_ebb_params_for_function_returns(exit_block);
|
builder.append_ebb_params_for_function_returns(exit_block);
|
||||||
func_translator
|
func_env
|
||||||
|
.func_translator
|
||||||
.state
|
.state
|
||||||
.initialize(&builder.func.signature, exit_block);
|
.initialize(&builder.func.signature, exit_block);
|
||||||
|
|
||||||
@ -368,7 +375,6 @@ impl From<CompileError> for CodegenError {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub struct CraneliftFunctionCodeGenerator {
|
pub struct CraneliftFunctionCodeGenerator {
|
||||||
func_body: ir::Function,
|
|
||||||
builder: Option<FunctionBuilder<'static>>,
|
builder: Option<FunctionBuilder<'static>>,
|
||||||
func_translator: FuncTranslator,
|
func_translator: FuncTranslator,
|
||||||
next_local: usize,
|
next_local: usize,
|
||||||
@ -377,7 +383,13 @@ pub struct CraneliftFunctionCodeGenerator {
|
|||||||
target_config: isa::TargetFrontendConfig,
|
target_config: isa::TargetFrontendConfig,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FuncEnvironment for CraneliftFunctionCodeGenerator {
|
pub struct FunctionEnvironment {
|
||||||
|
module_info: Arc<ModuleInfo>,
|
||||||
|
target_config: isa::TargetFrontendConfig,
|
||||||
|
clif_signatures: Map<SigIndex, ir::Signature>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FuncEnvironment for FunctionEnvironment {
|
||||||
/// Gets configuration information needed for compiling functions
|
/// Gets configuration information needed for compiling functions
|
||||||
fn target_config(&self) -> isa::TargetFrontendConfig {
|
fn target_config(&self) -> isa::TargetFrontendConfig {
|
||||||
self.target_config
|
self.target_config
|
||||||
@ -1034,7 +1046,15 @@ impl FuncEnvironment for CraneliftFunctionCodeGenerator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CraneliftFunctionCodeGenerator {
|
impl FunctionEnvironment {
|
||||||
|
pub fn get_func_type(
|
||||||
|
&self,
|
||||||
|
func_index: cranelift_wasm::FuncIndex,
|
||||||
|
) -> cranelift_wasm::SignatureIndex {
|
||||||
|
let sig_index: SigIndex = self.module_info.func_assoc[Converter(func_index).into()];
|
||||||
|
Converter(sig_index).into()
|
||||||
|
}
|
||||||
|
|
||||||
/// Creates a signature with VMContext as the last param
|
/// Creates a signature with VMContext as the last param
|
||||||
pub fn generate_signature(
|
pub fn generate_signature(
|
||||||
&self,
|
&self,
|
||||||
@ -1088,8 +1108,18 @@ impl FunctionCodeGenerator<CodegenError> for CraneliftFunctionCodeGenerator {
|
|||||||
let builder = self.builder.as_mut().unwrap();
|
let builder = self.builder.as_mut().unwrap();
|
||||||
//let func_environment = FuncEnv::new();
|
//let func_environment = FuncEnv::new();
|
||||||
//let state = TranslationState::new();
|
//let state = TranslationState::new();
|
||||||
|
let mut function_environment = FunctionEnvironment {
|
||||||
|
module_info: Arc::clone(&self.module_info),
|
||||||
|
target_config: self.target_config.clone(),
|
||||||
|
clif_signatures: self.clif_signatures.clone(),
|
||||||
|
};
|
||||||
let opp = Operator::Unreachable; // Placeholder
|
let opp = Operator::Unreachable; // Placeholder
|
||||||
translate_operator(opp, builder, &mut self.func_translator.state, self);
|
translate_operator(
|
||||||
|
opp,
|
||||||
|
builder,
|
||||||
|
&mut self.func_translator.state,
|
||||||
|
&mut function_environment,
|
||||||
|
);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1143,14 +1173,6 @@ impl CraneliftFunctionCodeGenerator {
|
|||||||
pub fn return_mode(&self) -> ReturnMode {
|
pub fn return_mode(&self) -> ReturnMode {
|
||||||
ReturnMode::NormalReturns
|
ReturnMode::NormalReturns
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_func_type(
|
|
||||||
&self,
|
|
||||||
func_index: cranelift_wasm::FuncIndex,
|
|
||||||
) -> cranelift_wasm::SignatureIndex {
|
|
||||||
let sig_index: SigIndex = self.module_info.func_assoc[Converter(func_index).into()];
|
|
||||||
Converter(sig_index).into()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates a signature with VMContext as the last param
|
/// Creates a signature with VMContext as the last param
|
||||||
|
Reference in New Issue
Block a user