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 = "artifact-size", derive(loupe::MemoryUsage))]
26#[cfg_attr(feature = "enable-serde", derive(Deserialize, Serialize))]
27#[derive(RkyvSerialize, RkyvDeserialize, Archive, Debug, Clone, PartialEq, Eq, Default)]
28#[archive_attr(derive(rkyv::CheckBytes, Debug))]
29pub struct CompiledFunctionFrameInfo {
30 pub traps: Vec<TrapInformation>,
34
35 pub address_map: FunctionAddressMap,
37}
38
39#[cfg_attr(feature = "enable-serde", derive(Deserialize, Serialize))]
41#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
42#[derive(RkyvSerialize, RkyvDeserialize, Archive, Debug, Clone, PartialEq, Eq)]
43#[archive_attr(derive(rkyv::CheckBytes, Debug))]
44pub struct FunctionBody {
45 #[cfg_attr(feature = "enable-serde", serde(with = "serde_bytes"))]
47 pub body: Vec<u8>,
48
49 pub unwind_info: Option<CompiledFunctionUnwindInfo>,
51}
52
53#[allow(missing_docs)]
55pub trait FunctionBodyLike<'a> {
56 type UnwindInfo: CompiledFunctionUnwindInfoLike<'a>;
57
58 fn body(&'a self) -> &'a [u8];
59 fn unwind_info(&'a self) -> Option<&Self::UnwindInfo>;
60}
61
62impl<'a> FunctionBodyLike<'a> for FunctionBody {
63 type UnwindInfo = CompiledFunctionUnwindInfo;
64
65 fn body(&'a self) -> &'a [u8] {
66 self.body.as_ref()
67 }
68
69 fn unwind_info(&'a self) -> Option<&Self::UnwindInfo> {
70 self.unwind_info.as_ref()
71 }
72}
73
74impl<'a> FunctionBodyLike<'a> for ArchivedFunctionBody {
75 type UnwindInfo = ArchivedCompiledFunctionUnwindInfo;
76
77 fn body(&'a self) -> &'a [u8] {
78 self.body.as_ref()
79 }
80
81 fn unwind_info(&'a self) -> Option<&Self::UnwindInfo> {
82 match self.unwind_info {
83 ArchivedOption::Some(ref x) => Some(x),
84 ArchivedOption::None => None,
85 }
86 }
87}
88
89#[cfg_attr(feature = "enable-serde", derive(Deserialize, Serialize))]
95#[derive(RkyvSerialize, RkyvDeserialize, Archive, Debug, Clone, PartialEq, Eq)]
96#[archive_attr(derive(rkyv::CheckBytes, Debug))]
97pub struct CompiledFunction {
98 pub body: FunctionBody,
100
101 pub relocations: Vec<Relocation>,
103
104 pub frame_info: CompiledFunctionFrameInfo,
106}
107
108pub type Functions = PrimaryMap<LocalFunctionIndex, CompiledFunction>;
110
111pub type CustomSections = PrimaryMap<SectionIndex, CustomSection>;
113
114#[cfg_attr(feature = "enable-serde", derive(Deserialize, Serialize))]
121#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
122#[derive(
123 RkyvSerialize, RkyvDeserialize, Archive, rkyv::CheckBytes, Debug, PartialEq, Eq, Clone,
124)]
125#[archive(as = "Self")]
126pub struct Dwarf {
127 pub eh_frame: SectionIndex,
131}
132
133impl Dwarf {
134 pub fn new(eh_frame: SectionIndex) -> Self {
136 Self { eh_frame }
137 }
138}
139
140#[cfg_attr(feature = "enable-serde", derive(Deserialize, Serialize))]
142#[derive(Debug, PartialEq, Eq)]
143pub struct Compilation {
144 pub functions: Functions,
146
147 pub custom_sections: CustomSections,
151
152 pub function_call_trampolines: PrimaryMap<SignatureIndex, FunctionBody>,
162
163 pub dynamic_function_trampolines: PrimaryMap<FunctionIndex, FunctionBody>,
183
184 pub debug: Option<Dwarf>,
186}