summaryrefslogtreecommitdiffstats
path: root/js/public/WasmFeatures.h
blob: 30c1bcca26b87b4bddecd578f34e37e5f36f1b71 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 * vim: set ts=8 sts=2 et sw=2 tw=80:
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef js_WasmFeatures_h
#define js_WasmFeatures_h

// [SMDOC] WebAssembly feature gating
//
// Declarative listing of WebAssembly optional features. This macro is used to
// generate most of the feature gating code in a centralized manner. See
// 'Adding a feature' below for the exact steps needed to add a new feature.
//
// # Adding a feature
//
// 1. Add a configure switch for the feature in js/moz.configure
// 2. Add a WASM_FEATURE_ENABLED #define below
// 3. Add the feature to JS_FOR_WASM_FEATURES
//   a. capitalized name: Used for naming of feature functions, including
//      wasmFeatureEnabled shell function.
//   b. lower case name: Used for naming of feature flag variables, including
//      in wasm::FeatureArgs.
//   c. compile predicate: Set to WASM_FEATURE_ENABLED
//   d. compiler predicate: Expression of compilers that this feature depends
//      on.
//   e. flag predicate: Expression used to predicate enablement of feature
//      flag. Useful for disabling a feature when dependent feature is not
//      enabled or if we are fuzzing.
//   f. preference name: The stem of the browser preference. Will be expanded
//      to `javascript.options.wasm-FEATURE`.
// 4. Add the preference to module/libpref/init/StaticPrefList.yaml
//   a. Set `set_spidermonkey_pref: startup`
//   b. Set value to 'true' for default features, @IS_NIGHTLY_BUILD@ for
//      tentative features, and 'false' for experimental features.
// 5. [fuzzing] Add the feature to gluesmith/src/lib.rs, if wasm-smith has
//    support for it.

#ifdef ENABLE_WASM_RELAXED_SIMD
#  define WASM_RELAXED_SIMD_ENABLED 1
#else
#  define WASM_RELAXED_SIMD_ENABLED 0
#endif
#ifdef ENABLE_WASM_GC
#  define WASM_GC_ENABLED 1
#else
#  define WASM_GC_ENABLED 0
#endif
#ifdef ENABLE_WASM_MEMORY64
#  define WASM_MEMORY64_ENABLED 1
#else
#  define WASM_MEMORY64_ENABLED 0
#endif
#ifdef ENABLE_WASM_MEMORY_CONTROL
#  define WASM_MEMORY_CONTROL_ENABLED 1
#else
#  define WASM_MEMORY_CONTROL_ENABLED 0
#endif
#ifdef ENABLE_WASM_TAIL_CALLS
#  define WASM_TAIL_CALLS_ENABLED 1
#else
#  define WASM_TAIL_CALLS_ENABLED 0
#endif
#ifdef ENABLE_WASM_JSPI
#  define WASM_JSPI_ENABLED 1
#else
#  define WASM_JSPI_ENABLED 0
#endif
#ifdef ENABLE_WASM_MOZ_INTGEMM
#  define WASM_MOZ_INTGEMM_ENABLED 1
#else
#  define WASM_MOZ_INTGEMM_ENABLED 0
#endif
#ifdef ENABLE_WASM_MULTI_MEMORY
#  define WASM_MULTI_MEMORY_ENABLED 1
#else
#  define WASM_MULTI_MEMORY_ENABLED 0
#endif
#ifdef ENABLE_WASM_BRANCH_HINTING
#  define WASM_BRANCH_HINTING_ENABLED 1
#else
#  define WASM_BRANCH_HINTING_ENABLED 0
#endif
#ifdef ENABLE_WASM_JS_STRING_BUILTINS
#  define WASM_JS_STRING_BUILTINS_ENABLED 1
#else
#  define WASM_JS_STRING_BUILTINS_ENABLED 0
#endif

// clang-format off
#define JS_FOR_WASM_FEATURES(FEATURE)                                   \
  FEATURE(                                                              \
    /* capitalized name   */ ExnRef,                                    \
    /* lower case name    */ exnref,                                    \
    /* compile predicate  */ true,                                      \
    /* compiler predicate */ AnyCompilerAvailable(cx),                  \
    /* flag predicate     */ true,                                      \
    /* flag force enable  */ false,                                     \
    /* flag fuzz enable   */ true,                                      \
    /* preference name    */ exnref)                                    \
  FEATURE(                                                              \
    /* capitalized name   */ Gc,                                        \
    /* lower case name    */ gc,                                        \
    /* compile predicate  */ WASM_GC_ENABLED,                           \
    /* compiler predicate */ AnyCompilerAvailable(cx),                  \
    /* flag predicate     */ true,                                      \
    /* flag force enable  */ false,                                     \
    /* flag fuzz enable   */ false,                                     \
    /* preference name    */ gc)                                        \
  FEATURE(                                                              \
    /* capitalized name   */ JSStringBuiltins,                          \
    /* lower case name    */ jsStringBuiltins,                          \
    /* compile predicate  */ WASM_JS_STRING_BUILTINS_ENABLED,           \
    /* compiler predicate */ AnyCompilerAvailable(cx),                  \
    /* flag predicate     */ true,                                      \
    /* flag force enable  */ false,                                     \
    /* flag fuzz enable   */ true,                                      \
    /* preference name    */ js_string_builtins)                        \
  FEATURE(                                                              \
    /* capitalized name   */ RelaxedSimd,                               \
    /* lower case name    */ v128Relaxed,                               \
    /* compile predicate  */ WASM_RELAXED_SIMD_ENABLED,                 \
    /* compiler predicate */ AnyCompilerAvailable(cx),                  \
    /* flag predicate     */ js::jit::JitSupportsWasmSimd(),            \
    /* flag force enable  */ false,                                     \
    /* flag fuzz enable   */ true,                                      \
    /* preference name    */ relaxed_simd)                              \
  FEATURE(                                                              \
    /* capitalized name   */ Memory64,                                  \
    /* lower case name    */ memory64,                                  \
    /* compile predicate  */ WASM_MEMORY64_ENABLED,                     \
    /* compiler predicate */ AnyCompilerAvailable(cx),                  \
    /* flag predicate     */ true,                                      \
    /* flag force enable  */ false,                                     \
    /* flag fuzz enable   */ true,                                      \
    /* preference name    */ memory64)                                  \
  FEATURE(                                                              \
    /* capitalized name   */ MemoryControl,                             \
    /* lower case name    */ memoryControl,                             \
    /* compile predicate  */ WASM_MEMORY_CONTROL_ENABLED,               \
    /* compiler predicate */ AnyCompilerAvailable(cx),                  \
    /* flag predicate     */ true,                                      \
    /* flag force enable  */ false,                                     \
    /* flag fuzz enable   */ false,                                     \
    /* preference name    */ memory_control)                            \
  FEATURE(                                                              \
    /* capitalized name   */ MultiMemory,                               \
    /* lower case name    */ multiMemory,                               \
    /* compile predicate  */ WASM_MULTI_MEMORY_ENABLED,                 \
    /* compiler predicate */ AnyCompilerAvailable(cx),                  \
    /* flag predicate     */ true,                                      \
    /* flag force enable  */ false,                                     \
    /* flag fuzz enable   */ true,                                      \
    /* preference name    */ multi_memory)                              \
  FEATURE(                                                              \
    /* capitalized name   */ TailCalls,                                 \
    /* lower case name    */ tailCalls,                                 \
    /* compile predicate  */ WASM_TAIL_CALLS_ENABLED,                   \
    /* compiler predicate */ AnyCompilerAvailable(cx),                  \
    /* flag predicate     */ true,                                      \
    /* flag force enable  */ false,                                     \
    /* flag fuzz enable   */ true,                                      \
    /* preference name    */ tail_calls)                                \
  FEATURE(                                                              \
    /* capitalized name   */ JSPromiseIntegration,                      \
    /* lower case name    */ jsPromiseIntegration,                      \
    /* compile predicate  */ WASM_JSPI_ENABLED,                         \
    /* compiler predicate */ IonAvailable(cx),                          \
    /* flag predicate     */ true,                                      \
    /* flag force enable  */ false,                                     \
    /* flag fuzz enable   */ false,                                     \
    /* preference name    */ js_promise_integration)                    \
  FEATURE(                                                              \
    /* capitalized name   */ MozIntGemm,                                \
    /* lower case name    */ mozIntGemm,                                \
    /* compile predicate  */ WASM_MOZ_INTGEMM_ENABLED,                  \
    /* compiler predicate */ AnyCompilerAvailable(cx),                  \
    /* flag predicate     */ IsSimdPrivilegedContext(cx),               \
    /* flag force enable  */ false,                                     \
    /* flag fuzz enable   */ false,                                     \
    /* preference name    */ moz_intgemm)                               \
  FEATURE(                                                              \
    /* capitalized name   */ TestSerialization,                         \
    /* lower case name    */ testSerialization,                         \
    /* compile predicate  */ 1,                                         \
    /* compiler predicate */ IonAvailable(cx),                          \
    /* flag predicate     */ true,                                      \
    /* flag force enable  */ false,                                     \
    /* flag fuzz enable   */ false,                                     \
    /* preference name    */ test_serialization)                        \
  FEATURE(                                                              \
    /* capitalized name   */ BranchHinting,                             \
    /* lower case name    */ branchHinting,                             \
    /* compile predicate  */ WASM_BRANCH_HINTING_ENABLED,               \
    /* compiler predicate */ IonAvailable(cx),                          \
    /* flag predicate     */ true,                                      \
    /* flag force enable  */ false,                                     \
    /* flag fuzz enable   */ false,                                     \
    /* preference name    */ branch_hinting)

// clang-format on

#endif  // js_WasmFeatures_h