wasmer_types/
libcalls.rs

1use enum_iterator::IntoEnumIterator;
2use rkyv::{Archive, Deserialize as RkyvDeserialize, Serialize as RkyvSerialize};
3#[cfg(feature = "enable-serde")]
4use serde::{Deserialize, Serialize};
5use std::fmt;
6
7/// The name of a runtime library routine.
8///
9/// This list is likely to grow over time.
10#[derive(
11    Copy,
12    Clone,
13    Debug,
14    PartialEq,
15    Eq,
16    Hash,
17    IntoEnumIterator,
18    RkyvSerialize,
19    RkyvDeserialize,
20    Archive,
21    rkyv::CheckBytes,
22)]
23#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
24#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
25#[archive(as = "Self")]
26#[repr(u16)]
27pub enum LibCall {
28    /// ceil.f32
29    CeilF32,
30
31    /// ceil.f64
32    CeilF64,
33
34    /// floor.f32
35    FloorF32,
36
37    /// floor.f64
38    FloorF64,
39
40    /// nearest.f32
41    NearestF32,
42
43    /// nearest.f64
44    NearestF64,
45
46    /// trunc.f32
47    TruncF32,
48
49    /// trunc.f64
50    TruncF64,
51
52    /// memory.size for local functions
53    Memory32Size,
54
55    /// memory.size for imported functions
56    ImportedMemory32Size,
57
58    /// table.copy
59    TableCopy,
60
61    /// table.init
62    TableInit,
63
64    /// table.fill
65    TableFill,
66
67    /// table.size for local tables
68    TableSize,
69
70    /// table.size for imported tables
71    ImportedTableSize,
72
73    /// table.get for local tables
74    TableGet,
75
76    /// table.get for imported tables
77    ImportedTableGet,
78
79    /// table.set for local tables
80    TableSet,
81
82    /// table.set for imported tables
83    ImportedTableSet,
84
85    /// table.grow for local tables
86    TableGrow,
87
88    /// table.grow for imported tables
89    ImportedTableGrow,
90
91    /// ref.func
92    FuncRef,
93
94    /// elem.drop
95    ElemDrop,
96
97    /// memory.copy for local memories
98    Memory32Copy,
99
100    /// memory.copy for imported memories
101    ImportedMemory32Copy,
102
103    /// memory.fill for local memories
104    Memory32Fill,
105
106    /// memory.fill for imported memories
107    ImportedMemory32Fill,
108
109    /// memory.init
110    Memory32Init,
111
112    /// data.drop
113    DataDrop,
114
115    /// A custom trap
116    RaiseTrap,
117
118    /// probe for stack overflow. These are emitted for functions which need
119    /// when the `enable_probestack` setting is true.
120    Probestack,
121
122    /// memory.atomic.wait32 for local memories
123    Memory32AtomicWait32,
124
125    /// memory.atomic.wait32 for imported memories
126    ImportedMemory32AtomicWait32,
127
128    /// memory.atomic.wait64 for local memories
129    Memory32AtomicWait64,
130
131    /// memory.atomic.wait64 for imported memories
132    ImportedMemory32AtomicWait64,
133
134    /// memory.atomic.notify for local memories
135    Memory32AtomicNotify,
136
137    /// memory.atomic.botify for imported memories
138    ImportedMemory32AtomicNotify,
139}
140
141impl LibCall {
142    /// Return the function name associated to the libcall.
143    pub fn to_function_name(&self) -> &str {
144        match self {
145            Self::CeilF32 => "wasmer_vm_f32_ceil",
146            Self::CeilF64 => "wasmer_vm_f64_ceil",
147            Self::FloorF32 => "wasmer_vm_f32_floor",
148            Self::FloorF64 => "wasmer_vm_f64_floor",
149            Self::NearestF32 => "wasmer_vm_f32_nearest",
150            Self::NearestF64 => "wasmer_vm_f64_nearest",
151            Self::TruncF32 => "wasmer_vm_f32_trunc",
152            Self::TruncF64 => "wasmer_vm_f64_trunc",
153            Self::Memory32Size => "wasmer_vm_memory32_size",
154            Self::ImportedMemory32Size => "wasmer_vm_imported_memory32_size",
155            Self::TableCopy => "wasmer_vm_table_copy",
156            Self::TableInit => "wasmer_vm_table_init",
157            Self::TableFill => "wasmer_vm_table_fill",
158            Self::TableSize => "wasmer_vm_table_size",
159            Self::ImportedTableSize => "wasmer_vm_imported_table_size",
160            Self::TableGet => "wasmer_vm_table_get",
161            Self::ImportedTableGet => "wasmer_vm_imported_table_get",
162            Self::TableSet => "wasmer_vm_table_set",
163            Self::ImportedTableSet => "wasmer_vm_imported_table_set",
164            Self::TableGrow => "wasmer_vm_table_grow",
165            Self::ImportedTableGrow => "wasmer_vm_imported_table_grow",
166            Self::FuncRef => "wasmer_vm_func_ref",
167            Self::ElemDrop => "wasmer_vm_elem_drop",
168            Self::Memory32Copy => "wasmer_vm_memory32_copy",
169            Self::ImportedMemory32Copy => "wasmer_vm_imported_memory32_copy",
170            Self::Memory32Fill => "wasmer_vm_memory32_fill",
171            Self::ImportedMemory32Fill => "wasmer_vm_imported_memory32_fill",
172            Self::Memory32Init => "wasmer_vm_memory32_init",
173            Self::DataDrop => "wasmer_vm_data_drop",
174            Self::RaiseTrap => "wasmer_vm_raise_trap",
175            // We have to do this because macOS requires a leading `_` and it's not
176            // a normal function, it's a static variable, so we have to do it manually.
177            #[cfg(target_vendor = "apple")]
178            Self::Probestack => "_wasmer_vm_probestack",
179            #[cfg(not(target_vendor = "apple"))]
180            Self::Probestack => "wasmer_vm_probestack",
181            Self::Memory32AtomicWait32 => "wasmer_vm_memory32_atomic_wait32",
182            Self::ImportedMemory32AtomicWait32 => "wasmer_vm_imported_memory32_atomic_wait32",
183            Self::Memory32AtomicWait64 => "wasmer_vm_memory32_atomic_wait64",
184            Self::ImportedMemory32AtomicWait64 => "wasmer_vm_imported_memory32_atomic_wait64",
185            Self::Memory32AtomicNotify => "wasmer_vm_memory32_atomic_notify",
186            Self::ImportedMemory32AtomicNotify => "wasmer_vm_imported_memory32_atomic_notify",
187        }
188    }
189}
190
191impl fmt::Display for LibCall {
192    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
193        fmt::Debug::fmt(self, f)
194    }
195}