use crate::lib::std::vec::Vec;
use crate::section::{CustomSection, SectionIndex};
use crate::trap::TrapInformation;
use crate::{FunctionAddressMap, JumpTableOffsets, Relocation};
use unc_vm_types::entity::PrimaryMap;
use unc_vm_types::{FunctionIndex, LocalFunctionIndex, SignatureIndex};
#[derive(
rkyv::Serialize, rkyv::Deserialize, rkyv::Archive, Debug, Clone, PartialEq, Eq, Default,
)]
pub struct CompiledFunctionFrameInfo {
pub traps: Vec<TrapInformation>,
pub address_map: FunctionAddressMap,
}
#[derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive, Debug, Clone, PartialEq, Eq)]
pub struct FunctionBody {
pub body: Vec<u8>,
}
#[derive(Clone, Copy)]
pub struct FunctionBodyRef<'a> {
pub body: &'a [u8],
}
impl<'a> From<&'a FunctionBody> for FunctionBodyRef<'a> {
fn from(body: &'a FunctionBody) -> Self {
FunctionBodyRef { body: &*body.body }
}
}
impl<'a> From<&'a ArchivedFunctionBody> for FunctionBodyRef<'a> {
fn from(body: &'a ArchivedFunctionBody) -> Self {
FunctionBodyRef { body: &*body.body }
}
}
#[derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive, Debug, Clone, PartialEq, Eq)]
pub struct CompiledFunction {
pub body: FunctionBody,
pub relocations: Vec<Relocation>,
pub jt_offsets: JumpTableOffsets,
pub frame_info: CompiledFunctionFrameInfo,
}
pub type Functions = PrimaryMap<LocalFunctionIndex, CompiledFunction>;
pub type CustomSections = PrimaryMap<SectionIndex, CustomSection>;
#[derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive, Debug, PartialEq, Eq, Clone)]
pub struct Dwarf {
pub eh_frame: SectionIndex,
}
impl Dwarf {
pub fn new(eh_frame: SectionIndex) -> Self {
Self { eh_frame }
}
}
#[derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive, Debug, PartialEq, Eq, Clone)]
pub struct TrampolinesSection {
pub section_index: SectionIndex,
pub slots: usize,
pub size: usize,
}
impl TrampolinesSection {
pub fn new(section_index: SectionIndex, slots: usize, size: usize) -> Self {
Self { section_index, slots, size }
}
}
#[derive(Debug, PartialEq, Eq)]
pub struct Compilation {
pub functions: Functions,
pub custom_sections: CustomSections,
pub function_call_trampolines: PrimaryMap<SignatureIndex, FunctionBody>,
pub dynamic_function_trampolines: PrimaryMap<FunctionIndex, FunctionBody>,
pub debug: Option<Dwarf>,
pub trampolines: Option<TrampolinesSection>,
}