hc_wasmer_types/compilation/
function.rs1use crate::entity::PrimaryMap;
8use crate::lib::std::vec::Vec;
9use crate::{ArchivedCompiledFunctionUnwindInfo, TrapInformation};
10use crate::{CompiledFunctionUnwindInfo, FunctionAddressMap};
11use crate::{
12 CustomSection, FunctionIndex, LocalFunctionIndex, Relocation, SectionIndex, SignatureIndex,
13};
14use rkyv::option::ArchivedOption;
15use rkyv::{Archive, Deserialize as RkyvDeserialize, Serialize as RkyvSerialize};
16#[cfg(feature = "enable-serde")]
17use serde::{Deserialize, Serialize};
18
19use super::unwind::CompiledFunctionUnwindInfoLike;
20
21#[cfg_attr(feature = "enable-serde", derive(Deserialize, Serialize))]
26#[derive(RkyvSerialize, RkyvDeserialize, Archive, Debug, Clone, PartialEq, Eq, Default)]
27#[archive_attr(derive(rkyv::CheckBytes, Debug))]
28pub struct CompiledFunctionFrameInfo {
29 pub traps: Vec<TrapInformation>,
33
34 pub address_map: FunctionAddressMap,
36}
37
38#[cfg_attr(feature = "enable-serde", derive(Deserialize, Serialize))]
40#[derive(RkyvSerialize, RkyvDeserialize, Archive, Debug, Clone, PartialEq, Eq)]
41#[archive_attr(derive(rkyv::CheckBytes, Debug))]
42pub struct FunctionBody {
43 #[cfg_attr(feature = "enable-serde", serde(with = "serde_bytes"))]
45 pub body: Vec<u8>,
46
47 pub unwind_info: Option<CompiledFunctionUnwindInfo>,
49}
50
51#[allow(missing_docs)]
53pub trait FunctionBodyLike<'a> {
54 type UnwindInfo: CompiledFunctionUnwindInfoLike<'a>;
55
56 fn body(&'a self) -> &'a [u8];
57 fn unwind_info(&'a self) -> Option<&Self::UnwindInfo>;
58}
59
60impl<'a> FunctionBodyLike<'a> for FunctionBody {
61 type UnwindInfo = CompiledFunctionUnwindInfo;
62
63 fn body(&'a self) -> &'a [u8] {
64 self.body.as_ref()
65 }
66
67 fn unwind_info(&'a self) -> Option<&Self::UnwindInfo> {
68 self.unwind_info.as_ref()
69 }
70}
71
72impl<'a> FunctionBodyLike<'a> for ArchivedFunctionBody {
73 type UnwindInfo = ArchivedCompiledFunctionUnwindInfo;
74
75 fn body(&'a self) -> &'a [u8] {
76 self.body.as_ref()
77 }
78
79 fn unwind_info(&'a self) -> Option<&Self::UnwindInfo> {
80 match self.unwind_info {
81 ArchivedOption::Some(ref x) => Some(x),
82 ArchivedOption::None => None,
83 }
84 }
85}
86
87#[cfg_attr(feature = "enable-serde", derive(Deserialize, Serialize))]
93#[derive(RkyvSerialize, RkyvDeserialize, Archive, Debug, Clone, PartialEq, Eq)]
94#[archive_attr(derive(rkyv::CheckBytes, Debug))]
95pub struct CompiledFunction {
96 pub body: FunctionBody,
98
99 pub relocations: Vec<Relocation>,
101
102 pub frame_info: CompiledFunctionFrameInfo,
104}
105
106pub type Functions = PrimaryMap<LocalFunctionIndex, CompiledFunction>;
108
109pub type CustomSections = PrimaryMap<SectionIndex, CustomSection>;
111
112#[cfg_attr(feature = "enable-serde", derive(Deserialize, Serialize))]
119#[derive(
120 RkyvSerialize, RkyvDeserialize, Archive, rkyv::CheckBytes, Debug, PartialEq, Eq, Clone,
121)]
122#[archive(as = "Self")]
123pub struct Dwarf {
124 pub eh_frame: SectionIndex,
128}
129
130impl Dwarf {
131 pub fn new(eh_frame: SectionIndex) -> Self {
133 Self { eh_frame }
134 }
135}
136
137#[cfg_attr(feature = "enable-serde", derive(Deserialize, Serialize))]
139#[derive(Debug, PartialEq, Eq)]
140pub struct Compilation {
141 pub functions: Functions,
143
144 pub custom_sections: CustomSections,
148
149 pub function_call_trampolines: PrimaryMap<SignatureIndex, FunctionBody>,
159
160 pub dynamic_function_trampolines: PrimaryMap<FunctionIndex, FunctionBody>,
180
181 pub debug: Option<Dwarf>,
183}