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}
44
45impl SerializableCompilation {
46 pub fn serialize(&self) -> Result<Vec<u8>, SerializeError> {
50 rkyv::to_bytes::<rkyv::rancor::Error>(self)
51 .map(|v| v.into_vec())
52 .map_err(|e| SerializeError::Generic(e.to_string()))
53 }
54}
55
56#[derive(Archive, RkyvDeserialize, RkyvSerialize)]
58#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
59#[allow(missing_docs)]
60#[rkyv(derive(Debug))]
61pub struct SerializableModule {
62 pub compilation: SerializableCompilation,
64 pub compile_info: CompileModuleInfo,
66 pub data_initializers: Box<[OwnedDataInitializer]>,
68 pub cpu_features: u64,
70}
71
72impl SerializableModule {
73 pub fn serialize(&self) -> Result<Vec<u8>, SerializeError> {
77 rkyv::to_bytes::<rkyv::rancor::Error>(self)
78 .map(|v| v.into_vec())
79 .map_err(|e| SerializeError::Generic(e.to_string()))
80 }
81
82 pub unsafe fn deserialize_unchecked(metadata_slice: &[u8]) -> Result<Self, DeserializeError> {
94 unsafe {
95 let archived = Self::archive_from_slice(metadata_slice)?;
96 Self::deserialize_from_archive(archived)
97 }
98 }
99
100 pub unsafe fn deserialize(metadata_slice: &[u8]) -> Result<Self, DeserializeError> {
110 let archived = Self::archive_from_slice_checked(metadata_slice)?;
111 Self::deserialize_from_archive(archived)
112 }
113
114 pub unsafe fn archive_from_slice(
119 metadata_slice: &[u8],
120 ) -> Result<&ArchivedSerializableModule, DeserializeError> {
121 unsafe { Ok(rkyv::access_unchecked(metadata_slice)) }
122 }
123
124 pub fn archive_from_slice_checked(
129 metadata_slice: &[u8],
130 ) -> Result<&ArchivedSerializableModule, DeserializeError> {
131 rkyv::access::<_, rkyv::rancor::Error>(metadata_slice)
132 .map_err(|e| DeserializeError::CorruptedBinary(e.to_string()))
133 }
134
135 pub fn deserialize_from_archive(
137 archived: &ArchivedSerializableModule,
138 ) -> Result<Self, DeserializeError> {
139 rkyv::deserialize::<_, rkyv::rancor::Error>(archived)
140 .map_err(|e| DeserializeError::CorruptedBinary(e.to_string()))
141 }
142
143 pub fn create_module_info(&self) -> ModuleInfo {
145 self.compile_info.module.as_ref().clone()
146 }
147
148 pub fn module_info(&self) -> &ModuleInfo {
150 &self.compile_info.module
151 }
152
153 pub fn features(&self) -> &Features {
155 &self.compile_info.features
156 }
157
158 pub fn cpu_features(&self) -> EnumSet<CpuFeature> {
160 EnumSet::from_u64(self.cpu_features)
161 }
162
163 pub fn data_initializers(&self) -> &[OwnedDataInitializer] {
165 &self.data_initializers
166 }
167
168 pub fn memory_styles(&self) -> &PrimaryMap<MemoryIndex, MemoryStyle> {
170 &self.compile_info.memory_styles
171 }
172
173 pub fn table_styles(&self) -> &PrimaryMap<TableIndex, TableStyle> {
175 &self.compile_info.table_styles
176 }
177}