wasmer_compiler/
serialize.rs1#![allow(missing_docs)]
6
7use crate::types::{
8 function::{CompiledFunctionFrameInfo, FunctionBody, GOT, UnwindInfo},
9 module::CompileModuleInfo,
10 relocation::Relocation,
11 section::{CustomSection, SectionIndex},
12};
13use enumset::EnumSet;
14use rkyv::{Archive, Deserialize as RkyvDeserialize, Serialize as RkyvSerialize};
15use wasmer_types::{
16 DeserializeError, Features, FunctionIndex, LocalFunctionIndex, MemoryIndex, MemoryStyle,
17 ModuleInfo, OwnedDataInitializer, SerializeError, SignatureIndex, TableIndex, TableStyle,
18 entity::PrimaryMap, target::CpuFeature,
19};
20
21pub use wasmer_types::MetadataHeader;
22
23#[derive(Archive, Default, RkyvDeserialize, RkyvSerialize)]
25#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
26#[allow(missing_docs)]
27#[rkyv(derive(Debug))]
28pub struct SerializableCompilation {
29 pub function_bodies: PrimaryMap<LocalFunctionIndex, FunctionBody>,
30 pub function_relocations: PrimaryMap<LocalFunctionIndex, Vec<Relocation>>,
31 pub function_frame_info: PrimaryMap<LocalFunctionIndex, CompiledFunctionFrameInfo>,
32 pub function_call_trampolines: PrimaryMap<SignatureIndex, FunctionBody>,
33 pub dynamic_function_trampolines: PrimaryMap<FunctionIndex, FunctionBody>,
34 pub custom_sections: PrimaryMap<SectionIndex, CustomSection>,
35 pub custom_section_relocations: PrimaryMap<SectionIndex, Vec<Relocation>>,
36 pub unwind_info: UnwindInfo,
38 pub got: GOT,
39 pub libcall_trampolines: SectionIndex,
41 pub libcall_trampoline_len: u32,
43 pub function_max_stack_usage: PrimaryMap<LocalFunctionIndex, Option<usize>>,
45}
46
47impl SerializableCompilation {
48 pub fn serialize(&self) -> Result<Vec<u8>, SerializeError> {
52 rkyv::to_bytes::<rkyv::rancor::Error>(self)
53 .map(|v| v.into_vec())
54 .map_err(|e| SerializeError::Generic(e.to_string()))
55 }
56}
57
58#[derive(Archive, RkyvDeserialize, RkyvSerialize)]
60#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
61#[allow(missing_docs)]
62#[rkyv(derive(Debug))]
63pub struct SerializableModule {
64 pub compilation: SerializableCompilation,
66 pub compile_info: CompileModuleInfo,
68 pub data_initializers: Box<[OwnedDataInitializer]>,
70 pub cpu_features: u64,
72}
73
74impl SerializableModule {
75 pub fn serialize(&self) -> Result<Vec<u8>, SerializeError> {
79 rkyv::to_bytes::<rkyv::rancor::Error>(self)
80 .map(|v| v.into_vec())
81 .map_err(|e| SerializeError::Generic(e.to_string()))
82 }
83
84 pub unsafe fn deserialize_unchecked(metadata_slice: &[u8]) -> Result<Self, DeserializeError> {
96 unsafe {
97 let archived = Self::archive_from_slice(metadata_slice)?;
98 Self::deserialize_from_archive(archived)
99 }
100 }
101
102 pub unsafe fn deserialize(metadata_slice: &[u8]) -> Result<Self, DeserializeError> {
112 let archived = Self::archive_from_slice_checked(metadata_slice)?;
113 Self::deserialize_from_archive(archived)
114 }
115
116 pub unsafe fn archive_from_slice(
121 metadata_slice: &[u8],
122 ) -> Result<&ArchivedSerializableModule, DeserializeError> {
123 unsafe { Ok(rkyv::access_unchecked(metadata_slice)) }
124 }
125
126 pub fn archive_from_slice_checked(
131 metadata_slice: &[u8],
132 ) -> Result<&ArchivedSerializableModule, DeserializeError> {
133 rkyv::access::<_, rkyv::rancor::Error>(metadata_slice)
134 .map_err(|e| DeserializeError::CorruptedBinary(e.to_string()))
135 }
136
137 pub fn deserialize_from_archive(
139 archived: &ArchivedSerializableModule,
140 ) -> Result<Self, DeserializeError> {
141 rkyv::deserialize::<_, rkyv::rancor::Error>(archived)
142 .map_err(|e| DeserializeError::CorruptedBinary(e.to_string()))
143 }
144
145 pub fn create_module_info(&self) -> ModuleInfo {
147 self.compile_info.module.as_ref().clone()
148 }
149
150 pub fn module_info(&self) -> &ModuleInfo {
152 &self.compile_info.module
153 }
154
155 pub fn features(&self) -> &Features {
157 &self.compile_info.features
158 }
159
160 pub fn cpu_features(&self) -> EnumSet<CpuFeature> {
162 EnumSet::from_u64(self.cpu_features)
163 }
164
165 pub fn data_initializers(&self) -> &[OwnedDataInitializer] {
167 &self.data_initializers
168 }
169
170 pub fn memory_styles(&self) -> &PrimaryMap<MemoryIndex, MemoryStyle> {
172 &self.compile_info.memory_styles
173 }
174
175 pub fn table_styles(&self) -> &PrimaryMap<TableIndex, TableStyle> {
177 &self.compile_info.table_styles
178 }
179}