summaryrefslogtreecommitdiffstats
path: root/js/public/WasmFeatures.h
blob: 4abd99cd1d1ae1e0d87c497d75d7385ec18cb297 (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
/* -*- 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.
//
// Each feature is either `DEFAULT`, `TENTATIVE`, or `EXPERIMENTAL`:
//
// Default features are enabled by default in ContextOptions and in the
// JS-shell, and are given a `--no-wasm-FEATURE` shell flag to disable.  The
// `--wasm-FEATURE` flag is rejected.
//
// Tentative features are like Default features, but the `--wasm-FEATURE` flag
// is silently ignored.
//
// Experimental features are disabled by default in ContextOptions and in the
// JS-shell, and are given a `--wasm-FEATURE` shell flag to enable.  The
// `--no-wasm-FEATURE` flag is silently ignored.
//
// The browser pref is `javascript.options.wasm-FEATURE` for default, tentative,
// and experimental features alike.
//
// # 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. shell flag: The stem of the JS-shell flag. Will be expanded to
//      --no-wasm-FEATURE or --wasm-FEATURE as explained above.
//   g. 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. Use conditionally compiled flag
//   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_SIMD
#  define WASM_SIMD_ENABLED 1
#else
#  define WASM_SIMD_ENABLED 0
#endif
#ifdef ENABLE_WASM_RELAXED_SIMD
#  define WASM_RELAXED_SIMD_ENABLED 1
#else
#  define WASM_RELAXED_SIMD_ENABLED 0
#endif
#ifdef ENABLE_WASM_EXTENDED_CONST
#  define WASM_EXTENDED_CONST_ENABLED 1
#else
#  define WASM_EXTENDED_CONST_ENABLED 0
#endif
#ifdef ENABLE_WASM_FUNCTION_REFERENCES
#  define WASM_FUNCTION_REFERENCES_ENABLED 1
#else
#  define WASM_FUNCTION_REFERENCES_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_MOZ_INTGEMM
#  define WASM_MOZ_INTGEMM_ENABLED 1
#else
#  define WASM_MOZ_INTGEMM_ENABLED 0
#endif

// clang-format off
#define JS_FOR_WASM_FEATURES(DEFAULT, TENTATIVE, EXPERIMENTAL)                \
  TENTATIVE(/* capitalized name   */ ExtendedConst,                           \
            /* lower case name    */ extendedConst,                           \
            /* compile predicate  */ WASM_EXTENDED_CONST_ENABLED,             \
            /* compiler predicate */ true,                                    \
            /* flag predicate     */ true,                                    \
            /* shell flag         */ "extended-const",                        \
            /* preference name    */ "extended_const")                        \
  TENTATIVE(                                                                  \
      /* capitalized name   */ Exceptions,                                    \
      /* lower case name    */ exceptions,                                    \
      /* compile predicate  */ true,                                          \
      /* compiler predicate */ BaselineAvailable(cx) || IonAvailable(cx),     \
      /* flag predicate     */ true,                                          \
      /* shell flag         */ "exceptions",                                  \
      /* preference name    */ "exceptions")                                  \
  EXPERIMENTAL(/* capitalized name   */ FunctionReferences,                   \
               /* lower case name    */ functionReferences,                   \
               /* compile predicate  */ WASM_FUNCTION_REFERENCES_ENABLED,     \
               /* compiler predicate */ BaselineAvailable(cx) ||              \
                                        IonAvailable(cx),                     \
               /* flag predicate     */ true,                                 \
               /* shell flag         */ "function-references",                \
               /* preference name    */ "function_references")                \
  EXPERIMENTAL(/* capitalized name   */ Gc,                                   \
               /* lower case name    */ gc,                                   \
               /* compile predicate  */ WASM_GC_ENABLED,                      \
               /* compiler predicate */ AnyCompilerAvailable(cx),             \
               /* flag predicate     */ WasmFunctionReferencesFlag(cx),       \
               /* shell flag         */ "gc",                                 \
               /* preference name    */ "gc")                                 \
  TENTATIVE(/* capitalized name   */ RelaxedSimd,                             \
            /* lower case name    */ v128Relaxed,                             \
            /* compile predicate  */ WASM_RELAXED_SIMD_ENABLED,               \
            /* compiler predicate */ AnyCompilerAvailable(cx),                \
            /* flag predicate     */ js::jit::JitSupportsWasmSimd(),          \
            /* shell flag         */ "relaxed-simd",                          \
            /* preference name    */ "relaxed_simd")                          \
  TENTATIVE(                                                                  \
      /* capitalized name   */ Memory64,                                      \
      /* lower case name    */ memory64,                                      \
      /* compile predicate  */ WASM_MEMORY64_ENABLED,                         \
      /* compiler predicate */ BaselineAvailable(cx) || IonAvailable(cx),     \
      /* flag predicate     */ true,                                          \
      /* shell flag         */ "memory64",                                    \
      /* preference name    */ "memory64")                                    \
  EXPERIMENTAL(                                                               \
      /* capitalized name   */ MemoryControl,                                 \
      /* lower case name    */ memoryControl,                                 \
      /* compile predicate  */ WASM_MEMORY_CONTROL_ENABLED,                   \
      /* compiler predicate */ BaselineAvailable(cx) || IonAvailable(cx),     \
      /* flag predicate     */ true,                                          \
      /* shell flag         */ "memory-control",                              \
      /* preference name    */ "memory_control")                              \
  EXPERIMENTAL(/* capitalized name   */ MozIntGemm,                           \
               /* lower case name    */ mozIntGemm,                           \
               /* compile predicate  */ WASM_MOZ_INTGEMM_ENABLED,             \
               /* compiler predicate */ BaselineAvailable(cx) ||              \
                  IonAvailable(cx),                                           \
               /* flag predicate     */ IsSimdPrivilegedContext(cx),          \
               /* shell flag         */ "moz-intgemm",                        \
               /* preference name    */ "moz_intgemm")                        \
  EXPERIMENTAL(/* capitalized name   */ TestSerialization,                    \
               /* lower case name    */ testSerialization,                    \
               /* compile predicate  */ 1,                                    \
               /* compiler predicate */ IonAvailable(cx),                     \
               /* flag predicate     */ true,                                 \
               /* shell flag         */ "test-serialization",                 \
               /* preference name    */ "test-serialization")

// clang-format on

#endif  // js_WasmFeatures_h