Improvements to Modules API (#307)
* test-no_std: use cargo +nightly assume folks have rustup set to use stable by default * cretonne-module, -faerie, -simplejit: use new ModuleError enum CtonError is not really appropriate for use in the module system. Instead, create a new enum ModuleError, which implements failure::Fail (works with no_std). Translate existing panics and unimplemented error cases to return ModuleErrors. * cretonne-faerie: export FaerieProduct * cretonne-module: expose FuncOrDataId, and Module::get_name to lookup This is helpful for looking up a name that has already been declared. Also, implement FuncOrDataId -> ExternalName conversion. * cretonne-faerie: depend on faerie 0.3.0 which has bugfix for data relocations * cretonne-module: change InvalidDefinition to InvalidImportDefinition per dan's code review. plus another typo fix * cretonne-faerie: add optional manifest of all traps from codegen * cretonne-module: provide more context in panics * cretonne-faerie: updates to docs * cretonne-faerie: return an Err instead of debug_assert when isa not pic
This commit is contained in:
64
lib/faerie/src/traps.rs
Normal file
64
lib/faerie/src/traps.rs
Normal file
@@ -0,0 +1,64 @@
|
||||
//! Faerie trap manifests record every `TrapCode` that cretonne outputs during code generation,
|
||||
//! for every function in the module. This data may be useful at runtime.
|
||||
|
||||
use cretonne_codegen::{ir, binemit};
|
||||
|
||||
/// Record of the arguments cretonne passes to `TrapSink::trap`
|
||||
pub struct FaerieTrapSite {
|
||||
/// Offset into function
|
||||
pub offset: binemit::CodeOffset,
|
||||
/// Source location given to cretonne
|
||||
pub srcloc: ir::SourceLoc,
|
||||
/// Trap code, as determined by cretonne
|
||||
pub code: ir::TrapCode,
|
||||
}
|
||||
|
||||
/// Record of the trap sites for a given function
|
||||
pub struct FaerieTrapSink {
|
||||
/// Name of function
|
||||
pub name: String,
|
||||
/// Total code size of function
|
||||
pub code_size: u32,
|
||||
/// All trap sites collected in function
|
||||
pub sites: Vec<FaerieTrapSite>,
|
||||
}
|
||||
|
||||
|
||||
impl FaerieTrapSink {
|
||||
/// Create an empty `FaerieTrapSink`
|
||||
pub fn new(name: &str, code_size: u32) -> Self {
|
||||
Self {
|
||||
sites: Vec::new(),
|
||||
name: name.to_owned(),
|
||||
code_size,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl binemit::TrapSink for FaerieTrapSink {
|
||||
fn trap(&mut self, offset: binemit::CodeOffset, srcloc: ir::SourceLoc, code: ir::TrapCode) {
|
||||
self.sites.push(FaerieTrapSite {
|
||||
offset,
|
||||
srcloc,
|
||||
code,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/// Collection of all `FaerieTrapSink`s for the module
|
||||
pub struct FaerieTrapManifest {
|
||||
/// All `FaerieTrapSink` for the module
|
||||
pub sinks: Vec<FaerieTrapSink>,
|
||||
}
|
||||
|
||||
impl FaerieTrapManifest {
|
||||
/// Create an empty `FaerieTrapManifest`
|
||||
pub fn new() -> Self {
|
||||
Self { sinks: Vec::new() }
|
||||
}
|
||||
|
||||
/// Put a `FaerieTrapSink` into manifest
|
||||
pub fn add_sink(&mut self, sink: FaerieTrapSink) {
|
||||
self.sinks.push(sink);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user