wasmer_compiler/types/
symbols.rs1#![allow(missing_docs)]
6
7use rkyv::{Archive, Deserialize as RkyvDeserialize, Serialize as RkyvSerialize};
9#[cfg(feature = "enable-serde")]
10use serde::{Deserialize, Serialize};
11use wasmer_types::{
12 DeserializeError, FunctionIndex, LocalFunctionIndex, OwnedDataInitializer, SerializeError,
13 SignatureIndex,
14 entity::{EntityRef, PrimaryMap},
15};
16
17use super::{module::CompileModuleInfo, section::SectionIndex};
18
19#[derive(
21 RkyvSerialize, RkyvDeserialize, Archive, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Debug,
22)]
23#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
24#[rkyv(derive(Debug), compare(PartialEq, PartialOrd))]
25pub enum Symbol {
26 Metadata,
29
30 LocalFunction(LocalFunctionIndex),
32
33 Section(SectionIndex),
35
36 FunctionCallTrampoline(SignatureIndex),
38
39 DynamicFunctionTrampoline(FunctionIndex),
41}
42
43pub trait SymbolRegistry: Send + Sync {
45 fn symbol_to_name(&self, symbol: Symbol) -> String;
47
48 fn name_to_symbol(&self, name: &str) -> Option<Symbol>;
52}
53
54#[derive(Debug, RkyvSerialize, RkyvDeserialize, Archive)]
56#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
57#[rkyv(derive(Debug))]
58pub struct ModuleMetadata {
59 pub compile_info: CompileModuleInfo,
61 pub prefix: String,
63 pub data_initializers: Box<[OwnedDataInitializer]>,
65 pub function_body_lengths: PrimaryMap<LocalFunctionIndex, u64>,
67 pub cpu_features: u64,
69}
70
71pub struct ModuleMetadataSymbolRegistry {
73 pub prefix: String,
75}
76
77impl ModuleMetadata {
78 pub fn split(&mut self) -> (&mut CompileModuleInfo, ModuleMetadataSymbolRegistry) {
80 let compile_info = &mut self.compile_info;
81 let symbol_registry = ModuleMetadataSymbolRegistry {
82 prefix: self.prefix.clone(),
83 };
84 (compile_info, symbol_registry)
85 }
86
87 pub fn get_symbol_registry(&self) -> ModuleMetadataSymbolRegistry {
89 ModuleMetadataSymbolRegistry {
90 prefix: self.prefix.clone(),
91 }
92 }
93 pub fn serialize(&self) -> Result<Vec<u8>, SerializeError> {
97 rkyv::to_bytes::<rkyv::rancor::Error>(self)
98 .map(|v| v.into_vec())
99 .map_err(|e| SerializeError::Generic(e.to_string()))
100 }
101
102 pub unsafe fn deserialize_unchecked(metadata_slice: &[u8]) -> Result<Self, DeserializeError> {
114 unsafe {
115 let archived = Self::archive_from_slice(metadata_slice)?;
116 Self::deserialize_from_archive(archived)
117 }
118 }
119
120 pub fn deserialize(metadata_slice: &[u8]) -> Result<Self, DeserializeError> {
124 let archived = Self::archive_from_slice_checked(metadata_slice)?;
125 Self::deserialize_from_archive(archived)
126 }
127
128 unsafe fn archive_from_slice(
133 metadata_slice: &[u8],
134 ) -> Result<&ArchivedModuleMetadata, DeserializeError> {
135 unsafe { Ok(rkyv::access_unchecked(metadata_slice)) }
136 }
137
138 fn archive_from_slice_checked(
143 metadata_slice: &[u8],
144 ) -> Result<&ArchivedModuleMetadata, DeserializeError> {
145 rkyv::access::<_, rkyv::rancor::Error>(metadata_slice)
146 .map_err(|e| DeserializeError::CorruptedBinary(e.to_string()))
147 }
148
149 pub fn deserialize_from_archive(
151 archived: &ArchivedModuleMetadata,
152 ) -> Result<Self, DeserializeError> {
153 rkyv::deserialize::<_, rkyv::rancor::Error>(archived)
154 .map_err(|e| DeserializeError::CorruptedBinary(format!("{e:?}")))
155 }
156}
157
158impl SymbolRegistry for ModuleMetadataSymbolRegistry {
159 fn symbol_to_name(&self, symbol: Symbol) -> String {
160 match symbol {
161 Symbol::Metadata => {
162 format!("WASMER_METADATA_{}", self.prefix.to_uppercase())
163 }
164 Symbol::LocalFunction(index) => {
165 format!("wasmer_function_{}_{}", self.prefix, index.index())
166 }
167 Symbol::Section(index) => format!("wasmer_section_{}_{}", self.prefix, index.index()),
168 Symbol::FunctionCallTrampoline(index) => {
169 format!(
170 "wasmer_trampoline_function_call_{}_{}",
171 self.prefix,
172 index.index()
173 )
174 }
175 Symbol::DynamicFunctionTrampoline(index) => {
176 format!(
177 "wasmer_trampoline_dynamic_function_{}_{}",
178 self.prefix,
179 index.index()
180 )
181 }
182 }
183 }
184
185 fn name_to_symbol(&self, name: &str) -> Option<Symbol> {
186 if name == self.symbol_to_name(Symbol::Metadata) {
187 Some(Symbol::Metadata)
188 } else if let Some(index) = name.strip_prefix(&format!("wasmer_function_{}_", self.prefix))
189 {
190 index
191 .parse::<u32>()
192 .ok()
193 .map(|index| Symbol::LocalFunction(LocalFunctionIndex::from_u32(index)))
194 } else if let Some(index) = name.strip_prefix(&format!("wasmer_section_{}_", self.prefix)) {
195 index
196 .parse::<u32>()
197 .ok()
198 .map(|index| Symbol::Section(SectionIndex::from_u32(index)))
199 } else if let Some(index) =
200 name.strip_prefix(&format!("wasmer_trampoline_function_call_{}_", self.prefix))
201 {
202 index
203 .parse::<u32>()
204 .ok()
205 .map(|index| Symbol::FunctionCallTrampoline(SignatureIndex::from_u32(index)))
206 } else if let Some(index) = name.strip_prefix(&format!(
207 "wasmer_trampoline_dynamic_function_{}_",
208 self.prefix
209 )) {
210 index
211 .parse::<u32>()
212 .ok()
213 .map(|index| Symbol::DynamicFunctionTrampoline(FunctionIndex::from_u32(index)))
214 } else {
215 None
216 }
217 }
218}