use crate::FuncPtr;
use crate::ir::{Config, Event, ProtoStatement};
use std::sync::Arc;
#[cfg(not(target_family = "wasm"))]
pub mod aot_c;
#[cfg(not(target_family = "wasm"))]
pub mod cranelift;
pub mod inst;
pub mod registry;
pub mod validate;
#[cfg(not(target_family = "wasm"))]
pub use aot_c::AotCBackend;
#[cfg(not(target_family = "wasm"))]
pub use cranelift::CraneliftBackend;
pub use registry::{BackendRegistry, ChunkOutput};
pub trait Backend: Send {
fn name(&self) -> &str;
fn supports_4state(&self) -> bool {
false
}
fn supports_stmt(&self, _stmt: &ProtoStatement) -> bool {
false
}
fn compile_chunk(
&mut self,
_ctx: &CompileCtx,
_stmts: &[ProtoStatement],
) -> Option<Arc<ChunkArtifact>> {
None
}
fn compile_whole_comb(
&mut self,
_ctx: &CompileCtx,
_stmts: &[ProtoStatement],
) -> Option<Arc<dyn CompiledWhole>> {
None
}
fn compile_whole_event(
&mut self,
_ctx: &CompileCtx,
_event: &Event,
_stmts: &[ProtoStatement],
) -> Option<Arc<dyn CompiledWhole>> {
None
}
fn diagnose_whole_comb_fallback(&self, _stmts: &[ProtoStatement]) -> Option<String> {
None
}
}
pub trait CompiledWhole: Send + Sync {
fn try_dispatch(&self, ff: *const u8, comb: *mut u8, log: *mut u8) -> DispatchOutcome;
}
#[must_use]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DispatchOutcome {
Done,
NotReady,
}
pub struct ChunkArtifact {
pub func: FuncPtr,
pub keepalive: Option<Box<dyn Send + Sync>>,
}
impl std::fmt::Debug for ChunkArtifact {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ChunkArtifact")
.field("func", &(self.func as *const ()))
.field("keepalive", &self.keepalive.is_some())
.finish()
}
}
pub struct CompileCtx<'a> {
pub config: &'a Config,
pub use_4state: bool,
pub contains_compiled_block: bool,
}