use crate::entity::PrimaryMap;
use crate::lib::std::vec::Vec;
use crate::{ArchivedCompiledFunctionUnwindInfo, TrapInformation};
use crate::{CompiledFunctionUnwindInfo, FunctionAddressMap};
use crate::{
CustomSection, FunctionIndex, LocalFunctionIndex, Relocation, SectionIndex, SignatureIndex,
};
use rkyv::option::ArchivedOption;
use rkyv::{Archive, Deserialize as RkyvDeserialize, Serialize as RkyvSerialize};
#[cfg(feature = "enable-serde")]
use serde::{Deserialize, Serialize};
use super::unwind::CompiledFunctionUnwindInfoLike;
#[cfg_attr(feature = "enable-serde", derive(Deserialize, Serialize))]
#[derive(RkyvSerialize, RkyvDeserialize, Archive, Debug, Clone, PartialEq, Eq, Default)]
#[archive_attr(derive(rkyv::CheckBytes))]
pub struct CompiledFunctionFrameInfo {
pub traps: Vec<TrapInformation>,
pub address_map: FunctionAddressMap,
}
#[cfg_attr(feature = "enable-serde", derive(Deserialize, Serialize))]
#[derive(RkyvSerialize, RkyvDeserialize, Archive, Debug, Clone, PartialEq, Eq)]
#[archive_attr(derive(rkyv::CheckBytes))]
pub struct FunctionBody {
#[cfg_attr(feature = "enable-serde", serde(with = "serde_bytes"))]
pub body: Vec<u8>,
pub unwind_info: Option<CompiledFunctionUnwindInfo>,
}
#[allow(missing_docs)]
pub trait FunctionBodyLike<'a> {
type UnwindInfo: CompiledFunctionUnwindInfoLike<'a>;
fn body(&'a self) -> &'a [u8];
fn unwind_info(&'a self) -> Option<&Self::UnwindInfo>;
}
impl<'a> FunctionBodyLike<'a> for FunctionBody {
type UnwindInfo = CompiledFunctionUnwindInfo;
fn body(&'a self) -> &'a [u8] {
self.body.as_ref()
}
fn unwind_info(&'a self) -> Option<&Self::UnwindInfo> {
self.unwind_info.as_ref()
}
}
impl<'a> FunctionBodyLike<'a> for ArchivedFunctionBody {
type UnwindInfo = ArchivedCompiledFunctionUnwindInfo;
fn body(&'a self) -> &'a [u8] {
self.body.as_ref()
}
fn unwind_info(&'a self) -> Option<&Self::UnwindInfo> {
match self.unwind_info {
ArchivedOption::Some(ref x) => Some(x),
ArchivedOption::None => None,
}
}
}
#[cfg_attr(feature = "enable-serde", derive(Deserialize, Serialize))]
#[derive(RkyvSerialize, RkyvDeserialize, Archive, Debug, Clone, PartialEq, Eq)]
#[archive_attr(derive(rkyv::CheckBytes))]
pub struct CompiledFunction {
pub body: FunctionBody,
pub relocations: Vec<Relocation>,
pub frame_info: CompiledFunctionFrameInfo,
}
pub type Functions = PrimaryMap<LocalFunctionIndex, CompiledFunction>;
pub type CustomSections = PrimaryMap<SectionIndex, CustomSection>;
#[cfg_attr(feature = "enable-serde", derive(Deserialize, Serialize))]
#[derive(
RkyvSerialize, RkyvDeserialize, Archive, rkyv::CheckBytes, Debug, PartialEq, Eq, Clone,
)]
#[archive(as = "Self")]
pub struct Dwarf {
pub eh_frame: SectionIndex,
}
impl Dwarf {
pub fn new(eh_frame: SectionIndex) -> Self {
Self { eh_frame }
}
}
#[cfg_attr(feature = "enable-serde", derive(Deserialize, Serialize))]
#[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>,
}