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 RkyvSerializableCompilation {
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 RkyvSerializableCompilation {
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)]
57#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
58#[allow(missing_docs)]
59#[rkyv(derive(Debug))]
60pub enum SerializableCompilation {
61 Rkyv(RkyvSerializableCompilation),
62 Elf(Vec<u8>),
63}
64
65#[derive(Archive, RkyvDeserialize, RkyvSerialize)]
67#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
68#[allow(missing_docs)]
69#[rkyv(derive(Debug))]
70pub struct SerializableModule {
71 pub compilation: SerializableCompilation,
73 pub compile_info: CompileModuleInfo,
75 pub data_initializers: Box<[OwnedDataInitializer]>,
77 pub cpu_features: u64,
79}
80
81impl SerializableModule {
82 pub fn serialize(&self) -> Result<Vec<u8>, SerializeError> {
86 rkyv::to_bytes::<rkyv::rancor::Error>(self)
87 .map(|v| v.into_vec())
88 .map_err(|e| SerializeError::Generic(e.to_string()))
89 }
90
91 pub unsafe fn deserialize_unchecked(metadata_slice: &[u8]) -> Result<Self, DeserializeError> {
103 unsafe {
104 let archived = Self::archive_from_slice(metadata_slice)?;
105 Self::deserialize_from_archive(archived)
106 }
107 }
108
109 pub unsafe fn deserialize(metadata_slice: &[u8]) -> Result<Self, DeserializeError> {
119 let archived = Self::archive_from_slice_checked(metadata_slice)?;
120 Self::deserialize_from_archive(archived)
121 }
122
123 pub unsafe fn archive_from_slice(
128 metadata_slice: &[u8],
129 ) -> Result<&ArchivedSerializableModule, DeserializeError> {
130 unsafe { Ok(rkyv::access_unchecked(metadata_slice)) }
131 }
132
133 pub fn archive_from_slice_checked(
138 metadata_slice: &[u8],
139 ) -> Result<&ArchivedSerializableModule, DeserializeError> {
140 rkyv::access::<_, rkyv::rancor::Error>(metadata_slice)
141 .map_err(|e| DeserializeError::CorruptedBinary(e.to_string()))
142 }
143
144 pub fn deserialize_from_archive(
146 archived: &ArchivedSerializableModule,
147 ) -> Result<Self, DeserializeError> {
148 rkyv::deserialize::<_, rkyv::rancor::Error>(archived)
149 .map_err(|e| DeserializeError::CorruptedBinary(e.to_string()))
150 }
151
152 pub fn create_module_info(&self) -> ModuleInfo {
154 self.compile_info.module.as_ref().clone()
155 }
156
157 pub fn module_info(&self) -> &ModuleInfo {
159 &self.compile_info.module
160 }
161
162 pub fn features(&self) -> &Features {
164 &self.compile_info.features
165 }
166
167 pub fn cpu_features(&self) -> EnumSet<CpuFeature> {
169 EnumSet::from_u64(self.cpu_features)
170 }
171
172 pub fn data_initializers(&self) -> &[OwnedDataInitializer] {
174 &self.data_initializers
175 }
176
177 pub fn memory_styles(&self) -> &PrimaryMap<MemoryIndex, MemoryStyle> {
179 &self.compile_info.memory_styles
180 }
181
182 pub fn table_styles(&self) -> &PrimaryMap<TableIndex, TableStyle> {
184 &self.compile_info.table_styles
185 }
186}