Make some things more consistent between define_function and define_function_bytes

This commit is contained in:
bjorn3
2020-11-09 10:07:18 +01:00
parent 2ca2255a4a
commit 856f799ade
3 changed files with 22 additions and 25 deletions

View File

@@ -162,9 +162,6 @@ pub enum ModuleError {
/// Indicates an identifier was defined, but was declared as an import /// Indicates an identifier was defined, but was declared as an import
#[error("Invalid to define identifier declared as an import: {0}")] #[error("Invalid to define identifier declared as an import: {0}")]
InvalidImportDefinition(String), InvalidImportDefinition(String),
/// Indicates a too-long function was defined
#[error("Function {0} exceeds the maximum function size")]
FunctionTooLarge(String),
/// Wraps a `cranelift-codegen` error /// Wraps a `cranelift-codegen` error
#[error("Compilation error: {0}")] #[error("Compilation error: {0}")]
Compilation(#[from] CodegenError), Compilation(#[from] CodegenError),

View File

@@ -1,12 +1,13 @@
//! Defines `ObjectModule`. //! Defines `ObjectModule`.
use anyhow::anyhow; use anyhow::anyhow;
use cranelift_codegen::binemit::{
Addend, CodeInfo, CodeOffset, NullStackMapSink, Reloc, RelocSink, TrapSink,
};
use cranelift_codegen::entity::SecondaryMap; use cranelift_codegen::entity::SecondaryMap;
use cranelift_codegen::isa::TargetIsa; use cranelift_codegen::isa::TargetIsa;
use cranelift_codegen::{self, ir}; use cranelift_codegen::{self, ir};
use cranelift_codegen::{
binemit::{Addend, CodeInfo, CodeOffset, NullStackMapSink, Reloc, RelocSink, TrapSink},
CodegenError,
};
use cranelift_module::{ use cranelift_module::{
DataContext, DataDescription, DataId, FuncId, Init, Linkage, Module, ModuleCompiledFunction, DataContext, DataDescription, DataId, FuncId, Init, Linkage, Module, ModuleCompiledFunction,
ModuleDeclarations, ModuleError, ModuleResult, RelocRecord, ModuleDeclarations, ModuleError, ModuleResult, RelocRecord,
@@ -268,17 +269,16 @@ impl Module for ObjectModule {
relocs: &[RelocRecord], relocs: &[RelocRecord],
) -> ModuleResult<ModuleCompiledFunction> { ) -> ModuleResult<ModuleCompiledFunction> {
info!("defining function {} with bytes", func_id); info!("defining function {} with bytes", func_id);
let total_size: u32 = match bytes.len().try_into() {
Ok(total_size) => total_size,
_ => Err(CodegenError::CodeTooLarge)?,
};
let decl = self.declarations.get_function_decl(func_id); let decl = self.declarations.get_function_decl(func_id);
if !decl.linkage.is_definable() { if !decl.linkage.is_definable() {
return Err(ModuleError::InvalidImportDefinition(decl.name.clone())); return Err(ModuleError::InvalidImportDefinition(decl.name.clone()));
} }
let total_size: u32 = match bytes.len().try_into() {
Ok(total_size) => total_size,
_ => Err(ModuleError::FunctionTooLarge(decl.name.clone()))?,
};
let &mut (symbol, ref mut defined) = self.functions[func_id].as_mut().unwrap(); let &mut (symbol, ref mut defined) = self.functions[func_id].as_mut().unwrap();
if *defined { if *defined {
return Err(ModuleError::DuplicateDefinition(decl.name.clone())); return Err(ModuleError::DuplicateDefinition(decl.name.clone()));

View File

@@ -1,12 +1,13 @@
//! Defines `SimpleJITModule`. //! Defines `SimpleJITModule`.
use crate::{compiled_blob::CompiledBlob, memory::Memory}; use crate::{compiled_blob::CompiledBlob, memory::Memory};
use cranelift_codegen::binemit::{
Addend, CodeInfo, CodeOffset, Reloc, RelocSink, StackMap, StackMapSink, TrapSink,
};
use cranelift_codegen::isa::TargetIsa; use cranelift_codegen::isa::TargetIsa;
use cranelift_codegen::settings::Configurable; use cranelift_codegen::settings::Configurable;
use cranelift_codegen::{self, ir, settings}; use cranelift_codegen::{self, ir, settings};
use cranelift_codegen::{
binemit::{Addend, CodeInfo, CodeOffset, Reloc, RelocSink, StackMap, StackMapSink, TrapSink},
CodegenError,
};
use cranelift_entity::SecondaryMap; use cranelift_entity::SecondaryMap;
use cranelift_module::{ use cranelift_module::{
DataContext, DataDescription, DataId, FuncId, FuncOrDataId, Init, Linkage, Module, DataContext, DataDescription, DataId, FuncId, FuncOrDataId, Init, Linkage, Module,
@@ -394,7 +395,6 @@ impl<'simple_jit_backend> Module for SimpleJITModule {
return Err(ModuleError::DuplicateDefinition(decl.name.to_owned())); return Err(ModuleError::DuplicateDefinition(decl.name.to_owned()));
} }
self.functions_to_finalize.push(id);
let size = code_size as usize; let size = code_size as usize;
let ptr = self let ptr = self
.memory .memory
@@ -402,8 +402,6 @@ impl<'simple_jit_backend> Module for SimpleJITModule {
.allocate(size, EXECUTABLE_DATA_ALIGNMENT) .allocate(size, EXECUTABLE_DATA_ALIGNMENT)
.expect("TODO: handle OOM etc."); .expect("TODO: handle OOM etc.");
self.record_function_for_perf(ptr, size, &decl.name);
let mut reloc_sink = SimpleJITRelocSink::default(); let mut reloc_sink = SimpleJITRelocSink::default();
let mut stack_map_sink = SimpleJITStackMapSink::default(); let mut stack_map_sink = SimpleJITStackMapSink::default();
unsafe { unsafe {
@@ -416,11 +414,13 @@ impl<'simple_jit_backend> Module for SimpleJITModule {
) )
}; };
self.record_function_for_perf(ptr, size, &decl.name);
self.functions[id] = Some(CompiledBlob { self.functions[id] = Some(CompiledBlob {
ptr, ptr,
size, size,
relocs: reloc_sink.relocs, relocs: reloc_sink.relocs,
}); });
self.functions_to_finalize.push(id);
Ok(ModuleCompiledFunction { size: code_size }) Ok(ModuleCompiledFunction { size: code_size })
} }
@@ -431,21 +431,21 @@ impl<'simple_jit_backend> Module for SimpleJITModule {
bytes: &[u8], bytes: &[u8],
relocs: &[RelocRecord], relocs: &[RelocRecord],
) -> ModuleResult<ModuleCompiledFunction> { ) -> ModuleResult<ModuleCompiledFunction> {
info!("defining function {} with bytes", id);
let total_size: u32 = match bytes.len().try_into() {
Ok(total_size) => total_size,
_ => Err(CodegenError::CodeTooLarge)?,
};
let decl = self.declarations.get_function_decl(id); let decl = self.declarations.get_function_decl(id);
if !decl.linkage.is_definable() { if !decl.linkage.is_definable() {
return Err(ModuleError::InvalidImportDefinition(decl.name.clone())); return Err(ModuleError::InvalidImportDefinition(decl.name.clone()));
} }
let total_size: u32 = match bytes.len().try_into() {
Ok(total_size) => total_size,
_ => Err(ModuleError::FunctionTooLarge(decl.name.clone()))?,
};
if !self.functions[id].is_none() { if !self.functions[id].is_none() {
return Err(ModuleError::DuplicateDefinition(decl.name.to_owned())); return Err(ModuleError::DuplicateDefinition(decl.name.to_owned()));
} }
self.functions_to_finalize.push(id);
let size = bytes.len(); let size = bytes.len();
let ptr = self let ptr = self
.memory .memory
@@ -453,17 +453,17 @@ impl<'simple_jit_backend> Module for SimpleJITModule {
.allocate(size, EXECUTABLE_DATA_ALIGNMENT) .allocate(size, EXECUTABLE_DATA_ALIGNMENT)
.expect("TODO: handle OOM etc."); .expect("TODO: handle OOM etc.");
self.record_function_for_perf(ptr, size, &decl.name);
unsafe { unsafe {
ptr::copy_nonoverlapping(bytes.as_ptr(), ptr, size); ptr::copy_nonoverlapping(bytes.as_ptr(), ptr, size);
} }
self.record_function_for_perf(ptr, size, &decl.name);
self.functions[id] = Some(CompiledBlob { self.functions[id] = Some(CompiledBlob {
ptr, ptr,
size, size,
relocs: relocs.to_vec(), relocs: relocs.to_vec(),
}); });
self.functions_to_finalize.push(id);
Ok(ModuleCompiledFunction { size: total_size }) Ok(ModuleCompiledFunction { size: total_size })
} }