1 /*
2  * Copyright 2016 WebAssembly Community Group participants
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 //===============================
18 // Binaryen C API implementation
19 //===============================
20 
21 #include <mutex>
22 
23 #include "binaryen-c.h"
24 #include "cfg/Relooper.h"
25 #include "ir/utils.h"
26 #include "pass.h"
27 #include "shell-interface.h"
28 #include "support/colors.h"
29 #include "wasm-binary.h"
30 #include "wasm-builder.h"
31 #include "wasm-interpreter.h"
32 #include "wasm-printing.h"
33 #include "wasm-s-parser.h"
34 #include "wasm-validator.h"
35 #include "wasm.h"
36 #include "wasm2js.h"
37 #include <iostream>
38 #include <sstream>
39 
40 #ifdef __EMSCRIPTEN__
41 #include <emscripten.h>
42 #endif
43 
44 using namespace wasm;
45 
46 // Literal utilities
47 
48 static_assert(sizeof(BinaryenLiteral) == sizeof(Literal),
49               "Binaryen C API literal must match wasm.h");
50 
toBinaryenLiteral(Literal x)51 BinaryenLiteral toBinaryenLiteral(Literal x) {
52   BinaryenLiteral ret;
53   ret.type = x.type.getID();
54   TODO_SINGLE_COMPOUND(x.type);
55   switch (x.type.getBasic()) {
56     case Type::i32:
57       ret.i32 = x.geti32();
58       break;
59     case Type::i64:
60       ret.i64 = x.geti64();
61       break;
62     case Type::f32:
63       ret.i32 = x.reinterpreti32();
64       break;
65     case Type::f64:
66       ret.i64 = x.reinterpreti64();
67       break;
68     case Type::v128:
69       memcpy(&ret.v128, x.getv128Ptr(), 16);
70       break;
71     case Type::funcref:
72       ret.func = x.isNull() ? nullptr : x.getFunc().c_str();
73       break;
74     case Type::externref:
75     case Type::exnref:
76     case Type::anyref:
77     case Type::eqref:
78       assert(x.isNull() && "unexpected non-null reference type literal");
79       break;
80     case Type::i31ref:
81       WASM_UNREACHABLE("TODO: i31ref");
82     case Type::none:
83     case Type::unreachable:
84       WASM_UNREACHABLE("unexpected type");
85   }
86   return ret;
87 }
88 
fromBinaryenLiteral(BinaryenLiteral x)89 Literal fromBinaryenLiteral(BinaryenLiteral x) {
90   switch (x.type) {
91     case Type::i32:
92       return Literal(x.i32);
93     case Type::i64:
94       return Literal(x.i64);
95     case Type::f32:
96       return Literal(x.i32).castToF32();
97     case Type::f64:
98       return Literal(x.i64).castToF64();
99     case Type::v128:
100       return Literal(x.v128);
101     case Type::funcref:
102       return Literal::makeFunc(x.func);
103     case Type::externref:
104     case Type::exnref:
105     case Type::anyref:
106     case Type::eqref:
107       return Literal::makeNull(Type(x.type));
108     case Type::i31ref:
109       WASM_UNREACHABLE("TODO: i31ref");
110     case Type::none:
111     case Type::unreachable:
112       WASM_UNREACHABLE("unexpected type");
113   }
114   WASM_UNREACHABLE("invalid type");
115 }
116 
117 // Mutexes (global for now; in theory if multiple modules
118 // are used at once this should be optimized to be per-
119 // module, but likely it doesn't matter)
120 
121 static std::mutex BinaryenFunctionMutex;
122 
123 // Optimization options
124 static PassOptions globalPassOptions =
125   PassOptions::getWithDefaultOptimizationOptions();
126 
127 extern "C" {
128 
129 //
130 // ========== Module Creation ==========
131 //
132 
133 // Core types
134 
BinaryenTypeNone(void)135 BinaryenType BinaryenTypeNone(void) { return Type::none; }
BinaryenTypeInt32(void)136 BinaryenType BinaryenTypeInt32(void) { return Type::i32; }
BinaryenTypeInt64(void)137 BinaryenType BinaryenTypeInt64(void) { return Type::i64; }
BinaryenTypeFloat32(void)138 BinaryenType BinaryenTypeFloat32(void) { return Type::f32; }
BinaryenTypeFloat64(void)139 BinaryenType BinaryenTypeFloat64(void) { return Type::f64; }
BinaryenTypeVec128(void)140 BinaryenType BinaryenTypeVec128(void) { return Type::v128; }
BinaryenTypeFuncref(void)141 BinaryenType BinaryenTypeFuncref(void) { return Type::funcref; }
BinaryenTypeExternref(void)142 BinaryenType BinaryenTypeExternref(void) { return Type::externref; }
BinaryenTypeExnref(void)143 BinaryenType BinaryenTypeExnref(void) { return Type::exnref; }
BinaryenTypeAnyref(void)144 BinaryenType BinaryenTypeAnyref(void) { return Type::anyref; }
BinaryenTypeEqref(void)145 BinaryenType BinaryenTypeEqref(void) { return Type::eqref; }
BinaryenTypeI31ref(void)146 BinaryenType BinaryenTypeI31ref(void) { return Type::i31ref; }
BinaryenTypeUnreachable(void)147 BinaryenType BinaryenTypeUnreachable(void) { return Type::unreachable; }
BinaryenTypeAuto(void)148 BinaryenType BinaryenTypeAuto(void) { return uintptr_t(-1); }
149 
BinaryenTypeCreate(BinaryenType * types,uint32_t numTypes)150 BinaryenType BinaryenTypeCreate(BinaryenType* types, uint32_t numTypes) {
151   std::vector<Type> typeVec;
152   typeVec.reserve(numTypes);
153   for (size_t i = 0; i < numTypes; ++i) {
154     typeVec.push_back(Type(types[i]));
155   }
156   return Type(typeVec).getID();
157 }
158 
BinaryenTypeArity(BinaryenType t)159 uint32_t BinaryenTypeArity(BinaryenType t) { return Type(t).size(); }
160 
BinaryenTypeExpand(BinaryenType t,BinaryenType * buf)161 void BinaryenTypeExpand(BinaryenType t, BinaryenType* buf) {
162   Type types(t);
163   size_t i = 0;
164   for (const auto& type : types) {
165     buf[i++] = type.getID();
166   }
167 }
168 
BinaryenNone(void)169 WASM_DEPRECATED BinaryenType BinaryenNone(void) { return Type::none; }
BinaryenInt32(void)170 WASM_DEPRECATED BinaryenType BinaryenInt32(void) { return Type::i32; }
BinaryenInt64(void)171 WASM_DEPRECATED BinaryenType BinaryenInt64(void) { return Type::i64; }
BinaryenFloat32(void)172 WASM_DEPRECATED BinaryenType BinaryenFloat32(void) { return Type::f32; }
BinaryenFloat64(void)173 WASM_DEPRECATED BinaryenType BinaryenFloat64(void) { return Type::f64; }
BinaryenUndefined(void)174 WASM_DEPRECATED BinaryenType BinaryenUndefined(void) { return uint32_t(-1); }
175 
176 // Expression ids
177 
BinaryenInvalidId(void)178 BinaryenExpressionId BinaryenInvalidId(void) {
179   return Expression::Id::InvalidId;
180 }
BinaryenBlockId(void)181 BinaryenExpressionId BinaryenBlockId(void) { return Expression::Id::BlockId; }
BinaryenIfId(void)182 BinaryenExpressionId BinaryenIfId(void) { return Expression::Id::IfId; }
BinaryenLoopId(void)183 BinaryenExpressionId BinaryenLoopId(void) { return Expression::Id::LoopId; }
BinaryenBreakId(void)184 BinaryenExpressionId BinaryenBreakId(void) { return Expression::Id::BreakId; }
BinaryenSwitchId(void)185 BinaryenExpressionId BinaryenSwitchId(void) { return Expression::Id::SwitchId; }
BinaryenCallId(void)186 BinaryenExpressionId BinaryenCallId(void) { return Expression::Id::CallId; }
BinaryenCallIndirectId(void)187 BinaryenExpressionId BinaryenCallIndirectId(void) {
188   return Expression::Id::CallIndirectId;
189 }
BinaryenLocalGetId(void)190 BinaryenExpressionId BinaryenLocalGetId(void) {
191   return Expression::Id::LocalGetId;
192 }
BinaryenLocalSetId(void)193 BinaryenExpressionId BinaryenLocalSetId(void) {
194   return Expression::Id::LocalSetId;
195 }
BinaryenGlobalGetId(void)196 BinaryenExpressionId BinaryenGlobalGetId(void) {
197   return Expression::Id::GlobalGetId;
198 }
BinaryenGlobalSetId(void)199 BinaryenExpressionId BinaryenGlobalSetId(void) {
200   return Expression::Id::GlobalSetId;
201 }
BinaryenLoadId(void)202 BinaryenExpressionId BinaryenLoadId(void) { return Expression::Id::LoadId; }
BinaryenStoreId(void)203 BinaryenExpressionId BinaryenStoreId(void) { return Expression::Id::StoreId; }
BinaryenConstId(void)204 BinaryenExpressionId BinaryenConstId(void) { return Expression::Id::ConstId; }
BinaryenUnaryId(void)205 BinaryenExpressionId BinaryenUnaryId(void) { return Expression::Id::UnaryId; }
BinaryenBinaryId(void)206 BinaryenExpressionId BinaryenBinaryId(void) { return Expression::Id::BinaryId; }
BinaryenSelectId(void)207 BinaryenExpressionId BinaryenSelectId(void) { return Expression::Id::SelectId; }
BinaryenDropId(void)208 BinaryenExpressionId BinaryenDropId(void) { return Expression::Id::DropId; }
BinaryenReturnId(void)209 BinaryenExpressionId BinaryenReturnId(void) { return Expression::Id::ReturnId; }
BinaryenMemorySizeId(void)210 BinaryenExpressionId BinaryenMemorySizeId(void) {
211   return Expression::Id::MemorySizeId;
212 }
BinaryenMemoryGrowId(void)213 BinaryenExpressionId BinaryenMemoryGrowId(void) {
214   return Expression::Id::MemoryGrowId;
215 }
BinaryenNopId(void)216 BinaryenExpressionId BinaryenNopId(void) { return Expression::Id::NopId; }
BinaryenUnreachableId(void)217 BinaryenExpressionId BinaryenUnreachableId(void) {
218   return Expression::Id::UnreachableId;
219 }
BinaryenAtomicCmpxchgId(void)220 BinaryenExpressionId BinaryenAtomicCmpxchgId(void) {
221   return Expression::Id::AtomicCmpxchgId;
222 }
BinaryenAtomicRMWId(void)223 BinaryenExpressionId BinaryenAtomicRMWId(void) {
224   return Expression::Id::AtomicRMWId;
225 }
BinaryenAtomicWaitId(void)226 BinaryenExpressionId BinaryenAtomicWaitId(void) {
227   return Expression::Id::AtomicWaitId;
228 }
BinaryenAtomicNotifyId(void)229 BinaryenExpressionId BinaryenAtomicNotifyId(void) {
230   return Expression::Id::AtomicNotifyId;
231 }
BinaryenAtomicFenceId(void)232 BinaryenExpressionId BinaryenAtomicFenceId(void) {
233   return Expression::Id::AtomicFenceId;
234 }
BinaryenSIMDExtractId(void)235 BinaryenExpressionId BinaryenSIMDExtractId(void) {
236   return Expression::Id::SIMDExtractId;
237 }
BinaryenSIMDReplaceId(void)238 BinaryenExpressionId BinaryenSIMDReplaceId(void) {
239   return Expression::Id::SIMDReplaceId;
240 }
BinaryenSIMDShuffleId(void)241 BinaryenExpressionId BinaryenSIMDShuffleId(void) {
242   return Expression::Id::SIMDShuffleId;
243 }
BinaryenSIMDTernaryId(void)244 BinaryenExpressionId BinaryenSIMDTernaryId(void) {
245   return Expression::Id::SIMDTernaryId;
246 }
BinaryenSIMDShiftId(void)247 BinaryenExpressionId BinaryenSIMDShiftId(void) {
248   return Expression::Id::SIMDShiftId;
249 }
BinaryenSIMDLoadId(void)250 BinaryenExpressionId BinaryenSIMDLoadId(void) {
251   return Expression::Id::SIMDLoadId;
252 }
BinaryenMemoryInitId(void)253 BinaryenExpressionId BinaryenMemoryInitId(void) {
254   return Expression::Id::MemoryInitId;
255 }
BinaryenDataDropId(void)256 BinaryenExpressionId BinaryenDataDropId(void) {
257   return Expression::Id::DataDropId;
258 }
BinaryenMemoryCopyId(void)259 BinaryenExpressionId BinaryenMemoryCopyId(void) {
260   return Expression::Id::MemoryCopyId;
261 }
BinaryenMemoryFillId(void)262 BinaryenExpressionId BinaryenMemoryFillId(void) {
263   return Expression::Id::MemoryFillId;
264 }
BinaryenRefNullId(void)265 BinaryenExpressionId BinaryenRefNullId(void) {
266   return Expression::Id::RefNullId;
267 }
BinaryenRefIsNullId(void)268 BinaryenExpressionId BinaryenRefIsNullId(void) {
269   return Expression::Id::RefIsNullId;
270 }
BinaryenRefFuncId(void)271 BinaryenExpressionId BinaryenRefFuncId(void) {
272   return Expression::Id::RefFuncId;
273 }
BinaryenRefEqId(void)274 BinaryenExpressionId BinaryenRefEqId(void) { return Expression::Id::RefEqId; }
BinaryenTryId(void)275 BinaryenExpressionId BinaryenTryId(void) { return Expression::Id::TryId; }
BinaryenThrowId(void)276 BinaryenExpressionId BinaryenThrowId(void) { return Expression::Id::ThrowId; }
BinaryenRethrowId(void)277 BinaryenExpressionId BinaryenRethrowId(void) {
278   return Expression::Id::RethrowId;
279 }
BinaryenBrOnExnId(void)280 BinaryenExpressionId BinaryenBrOnExnId(void) {
281   return Expression::Id::BrOnExnId;
282 }
BinaryenTupleMakeId(void)283 BinaryenExpressionId BinaryenTupleMakeId(void) {
284   return Expression::Id::TupleMakeId;
285 }
BinaryenTupleExtractId(void)286 BinaryenExpressionId BinaryenTupleExtractId(void) {
287   return Expression::Id::TupleExtractId;
288 }
BinaryenPopId(void)289 BinaryenExpressionId BinaryenPopId(void) { return Expression::Id::PopId; }
BinaryenI31NewId(void)290 BinaryenExpressionId BinaryenI31NewId(void) { return Expression::Id::I31NewId; }
BinaryenI31GetId(void)291 BinaryenExpressionId BinaryenI31GetId(void) { return Expression::Id::I31GetId; }
BinaryenRefTestId(void)292 BinaryenExpressionId BinaryenRefTestId(void) {
293   return Expression::Id::RefTestId;
294 }
BinaryenRefCastId(void)295 BinaryenExpressionId BinaryenRefCastId(void) {
296   return Expression::Id::RefCastId;
297 }
BinaryenBrOnCastId(void)298 BinaryenExpressionId BinaryenBrOnCastId(void) {
299   return Expression::Id::BrOnCastId;
300 }
BinaryenRttCanonId(void)301 BinaryenExpressionId BinaryenRttCanonId(void) {
302   return Expression::Id::RttCanonId;
303 }
BinaryenRttSubId(void)304 BinaryenExpressionId BinaryenRttSubId(void) { return Expression::Id::RttSubId; }
BinaryenStructNewId(void)305 BinaryenExpressionId BinaryenStructNewId(void) {
306   return Expression::Id::StructNewId;
307 }
BinaryenStructGetId(void)308 BinaryenExpressionId BinaryenStructGetId(void) {
309   return Expression::Id::StructGetId;
310 }
BinaryenStructSetId(void)311 BinaryenExpressionId BinaryenStructSetId(void) {
312   return Expression::Id::StructSetId;
313 }
BinaryenArrayNewId(void)314 BinaryenExpressionId BinaryenArrayNewId(void) {
315   return Expression::Id::ArrayNewId;
316 }
BinaryenArrayGetId(void)317 BinaryenExpressionId BinaryenArrayGetId(void) {
318   return Expression::Id::ArrayGetId;
319 }
BinaryenArraySetId(void)320 BinaryenExpressionId BinaryenArraySetId(void) {
321   return Expression::Id::ArraySetId;
322 }
BinaryenArrayLenId(void)323 BinaryenExpressionId BinaryenArrayLenId(void) {
324   return Expression::Id::ArrayLenId;
325 }
326 
327 // External kinds
328 
BinaryenExternalFunction(void)329 BinaryenExternalKind BinaryenExternalFunction(void) {
330   return static_cast<BinaryenExternalKind>(ExternalKind::Function);
331 }
BinaryenExternalTable(void)332 BinaryenExternalKind BinaryenExternalTable(void) {
333   return static_cast<BinaryenExternalKind>(ExternalKind::Table);
334 }
BinaryenExternalMemory(void)335 BinaryenExternalKind BinaryenExternalMemory(void) {
336   return static_cast<BinaryenExternalKind>(ExternalKind::Memory);
337 }
BinaryenExternalGlobal(void)338 BinaryenExternalKind BinaryenExternalGlobal(void) {
339   return static_cast<BinaryenExternalKind>(ExternalKind::Global);
340 }
BinaryenExternalEvent(void)341 BinaryenExternalKind BinaryenExternalEvent(void) {
342   return static_cast<BinaryenExternalKind>(ExternalKind::Event);
343 }
344 
345 // Features
346 
BinaryenFeatureMVP(void)347 BinaryenFeatures BinaryenFeatureMVP(void) {
348   return static_cast<BinaryenFeatures>(FeatureSet::MVP);
349 }
BinaryenFeatureAtomics(void)350 BinaryenFeatures BinaryenFeatureAtomics(void) {
351   return static_cast<BinaryenFeatures>(FeatureSet::Atomics);
352 }
BinaryenFeatureBulkMemory(void)353 BinaryenFeatures BinaryenFeatureBulkMemory(void) {
354   return static_cast<BinaryenFeatures>(FeatureSet::BulkMemory);
355 }
BinaryenFeatureMutableGlobals(void)356 BinaryenFeatures BinaryenFeatureMutableGlobals(void) {
357   return static_cast<BinaryenFeatures>(FeatureSet::MutableGlobals);
358 }
BinaryenFeatureNontrappingFPToInt(void)359 BinaryenFeatures BinaryenFeatureNontrappingFPToInt(void) {
360   return static_cast<BinaryenFeatures>(FeatureSet::TruncSat);
361 }
BinaryenFeatureSignExt(void)362 BinaryenFeatures BinaryenFeatureSignExt(void) {
363   return static_cast<BinaryenFeatures>(FeatureSet::SignExt);
364 }
BinaryenFeatureSIMD128(void)365 BinaryenFeatures BinaryenFeatureSIMD128(void) {
366   return static_cast<BinaryenFeatures>(FeatureSet::SIMD);
367 }
BinaryenFeatureExceptionHandling(void)368 BinaryenFeatures BinaryenFeatureExceptionHandling(void) {
369   return static_cast<BinaryenFeatures>(FeatureSet::ExceptionHandling);
370 }
BinaryenFeatureTailCall(void)371 BinaryenFeatures BinaryenFeatureTailCall(void) {
372   return static_cast<BinaryenFeatures>(FeatureSet::TailCall);
373 }
BinaryenFeatureReferenceTypes(void)374 BinaryenFeatures BinaryenFeatureReferenceTypes(void) {
375   return static_cast<BinaryenFeatures>(FeatureSet::ReferenceTypes);
376 }
BinaryenFeatureMultivalue(void)377 BinaryenFeatures BinaryenFeatureMultivalue(void) {
378   return static_cast<BinaryenFeatures>(FeatureSet::Multivalue);
379 }
BinaryenFeatureGC(void)380 BinaryenFeatures BinaryenFeatureGC(void) {
381   return static_cast<BinaryenFeatures>(FeatureSet::GC);
382 }
BinaryenFeatureMemory64(void)383 BinaryenFeatures BinaryenFeatureMemory64(void) {
384   return static_cast<BinaryenFeatures>(FeatureSet::Memory64);
385 }
BinaryenFeatureAll(void)386 BinaryenFeatures BinaryenFeatureAll(void) {
387   return static_cast<BinaryenFeatures>(FeatureSet::All);
388 }
389 
390 // Modules
391 
BinaryenModuleCreate(void)392 BinaryenModuleRef BinaryenModuleCreate(void) { return new Module(); }
BinaryenModuleDispose(BinaryenModuleRef module)393 void BinaryenModuleDispose(BinaryenModuleRef module) { delete (Module*)module; }
394 
395 // Literals
396 
BinaryenLiteralInt32(int32_t x)397 BinaryenLiteral BinaryenLiteralInt32(int32_t x) {
398   return toBinaryenLiteral(Literal(x));
399 }
BinaryenLiteralInt64(int64_t x)400 BinaryenLiteral BinaryenLiteralInt64(int64_t x) {
401   return toBinaryenLiteral(Literal(x));
402 }
BinaryenLiteralFloat32(float x)403 BinaryenLiteral BinaryenLiteralFloat32(float x) {
404   return toBinaryenLiteral(Literal(x));
405 }
BinaryenLiteralFloat64(double x)406 BinaryenLiteral BinaryenLiteralFloat64(double x) {
407   return toBinaryenLiteral(Literal(x));
408 }
BinaryenLiteralVec128(const uint8_t x[16])409 BinaryenLiteral BinaryenLiteralVec128(const uint8_t x[16]) {
410   return toBinaryenLiteral(Literal(x));
411 }
BinaryenLiteralFloat32Bits(int32_t x)412 BinaryenLiteral BinaryenLiteralFloat32Bits(int32_t x) {
413   return toBinaryenLiteral(Literal(x).castToF32());
414 }
BinaryenLiteralFloat64Bits(int64_t x)415 BinaryenLiteral BinaryenLiteralFloat64Bits(int64_t x) {
416   return toBinaryenLiteral(Literal(x).castToF64());
417 }
418 
419 // Expressions
420 
BinaryenClzInt32(void)421 BinaryenOp BinaryenClzInt32(void) { return ClzInt32; }
BinaryenCtzInt32(void)422 BinaryenOp BinaryenCtzInt32(void) { return CtzInt32; }
BinaryenPopcntInt32(void)423 BinaryenOp BinaryenPopcntInt32(void) { return PopcntInt32; }
BinaryenNegFloat32(void)424 BinaryenOp BinaryenNegFloat32(void) { return NegFloat32; }
BinaryenAbsFloat32(void)425 BinaryenOp BinaryenAbsFloat32(void) { return AbsFloat32; }
BinaryenCeilFloat32(void)426 BinaryenOp BinaryenCeilFloat32(void) { return CeilFloat32; }
BinaryenFloorFloat32(void)427 BinaryenOp BinaryenFloorFloat32(void) { return FloorFloat32; }
BinaryenTruncFloat32(void)428 BinaryenOp BinaryenTruncFloat32(void) { return TruncFloat32; }
BinaryenNearestFloat32(void)429 BinaryenOp BinaryenNearestFloat32(void) { return NearestFloat32; }
BinaryenSqrtFloat32(void)430 BinaryenOp BinaryenSqrtFloat32(void) { return SqrtFloat32; }
BinaryenEqZInt32(void)431 BinaryenOp BinaryenEqZInt32(void) { return EqZInt32; }
BinaryenClzInt64(void)432 BinaryenOp BinaryenClzInt64(void) { return ClzInt64; }
BinaryenCtzInt64(void)433 BinaryenOp BinaryenCtzInt64(void) { return CtzInt64; }
BinaryenPopcntInt64(void)434 BinaryenOp BinaryenPopcntInt64(void) { return PopcntInt64; }
BinaryenNegFloat64(void)435 BinaryenOp BinaryenNegFloat64(void) { return NegFloat64; }
BinaryenAbsFloat64(void)436 BinaryenOp BinaryenAbsFloat64(void) { return AbsFloat64; }
BinaryenCeilFloat64(void)437 BinaryenOp BinaryenCeilFloat64(void) { return CeilFloat64; }
BinaryenFloorFloat64(void)438 BinaryenOp BinaryenFloorFloat64(void) { return FloorFloat64; }
BinaryenTruncFloat64(void)439 BinaryenOp BinaryenTruncFloat64(void) { return TruncFloat64; }
BinaryenNearestFloat64(void)440 BinaryenOp BinaryenNearestFloat64(void) { return NearestFloat64; }
BinaryenSqrtFloat64(void)441 BinaryenOp BinaryenSqrtFloat64(void) { return SqrtFloat64; }
BinaryenEqZInt64(void)442 BinaryenOp BinaryenEqZInt64(void) { return EqZInt64; }
BinaryenExtendSInt32(void)443 BinaryenOp BinaryenExtendSInt32(void) { return ExtendSInt32; }
BinaryenExtendUInt32(void)444 BinaryenOp BinaryenExtendUInt32(void) { return ExtendUInt32; }
BinaryenWrapInt64(void)445 BinaryenOp BinaryenWrapInt64(void) { return WrapInt64; }
BinaryenTruncSFloat32ToInt32(void)446 BinaryenOp BinaryenTruncSFloat32ToInt32(void) { return TruncSFloat32ToInt32; }
BinaryenTruncSFloat32ToInt64(void)447 BinaryenOp BinaryenTruncSFloat32ToInt64(void) { return TruncSFloat32ToInt64; }
BinaryenTruncUFloat32ToInt32(void)448 BinaryenOp BinaryenTruncUFloat32ToInt32(void) { return TruncUFloat32ToInt32; }
BinaryenTruncUFloat32ToInt64(void)449 BinaryenOp BinaryenTruncUFloat32ToInt64(void) { return TruncUFloat32ToInt64; }
BinaryenTruncSFloat64ToInt32(void)450 BinaryenOp BinaryenTruncSFloat64ToInt32(void) { return TruncSFloat64ToInt32; }
BinaryenTruncSFloat64ToInt64(void)451 BinaryenOp BinaryenTruncSFloat64ToInt64(void) { return TruncSFloat64ToInt64; }
BinaryenTruncUFloat64ToInt32(void)452 BinaryenOp BinaryenTruncUFloat64ToInt32(void) { return TruncUFloat64ToInt32; }
BinaryenTruncUFloat64ToInt64(void)453 BinaryenOp BinaryenTruncUFloat64ToInt64(void) { return TruncUFloat64ToInt64; }
BinaryenReinterpretFloat32(void)454 BinaryenOp BinaryenReinterpretFloat32(void) { return ReinterpretFloat32; }
BinaryenReinterpretFloat64(void)455 BinaryenOp BinaryenReinterpretFloat64(void) { return ReinterpretFloat64; }
BinaryenExtendS8Int32(void)456 BinaryenOp BinaryenExtendS8Int32(void) { return ExtendS8Int32; }
BinaryenExtendS16Int32(void)457 BinaryenOp BinaryenExtendS16Int32(void) { return ExtendS16Int32; }
BinaryenExtendS8Int64(void)458 BinaryenOp BinaryenExtendS8Int64(void) { return ExtendS8Int64; }
BinaryenExtendS16Int64(void)459 BinaryenOp BinaryenExtendS16Int64(void) { return ExtendS16Int64; }
BinaryenExtendS32Int64(void)460 BinaryenOp BinaryenExtendS32Int64(void) { return ExtendS32Int64; }
BinaryenConvertSInt32ToFloat32(void)461 BinaryenOp BinaryenConvertSInt32ToFloat32(void) {
462   return ConvertSInt32ToFloat32;
463 }
BinaryenConvertSInt32ToFloat64(void)464 BinaryenOp BinaryenConvertSInt32ToFloat64(void) {
465   return ConvertSInt32ToFloat64;
466 }
BinaryenConvertUInt32ToFloat32(void)467 BinaryenOp BinaryenConvertUInt32ToFloat32(void) {
468   return ConvertUInt32ToFloat32;
469 }
BinaryenConvertUInt32ToFloat64(void)470 BinaryenOp BinaryenConvertUInt32ToFloat64(void) {
471   return ConvertUInt32ToFloat64;
472 }
BinaryenConvertSInt64ToFloat32(void)473 BinaryenOp BinaryenConvertSInt64ToFloat32(void) {
474   return ConvertSInt64ToFloat32;
475 }
BinaryenConvertSInt64ToFloat64(void)476 BinaryenOp BinaryenConvertSInt64ToFloat64(void) {
477   return ConvertSInt64ToFloat64;
478 }
BinaryenConvertUInt64ToFloat32(void)479 BinaryenOp BinaryenConvertUInt64ToFloat32(void) {
480   return ConvertUInt64ToFloat32;
481 }
BinaryenConvertUInt64ToFloat64(void)482 BinaryenOp BinaryenConvertUInt64ToFloat64(void) {
483   return ConvertUInt64ToFloat64;
484 }
BinaryenPromoteFloat32(void)485 BinaryenOp BinaryenPromoteFloat32(void) { return PromoteFloat32; }
BinaryenDemoteFloat64(void)486 BinaryenOp BinaryenDemoteFloat64(void) { return DemoteFloat64; }
BinaryenReinterpretInt32(void)487 BinaryenOp BinaryenReinterpretInt32(void) { return ReinterpretInt32; }
BinaryenReinterpretInt64(void)488 BinaryenOp BinaryenReinterpretInt64(void) { return ReinterpretInt64; }
BinaryenAddInt32(void)489 BinaryenOp BinaryenAddInt32(void) { return AddInt32; }
BinaryenSubInt32(void)490 BinaryenOp BinaryenSubInt32(void) { return SubInt32; }
BinaryenMulInt32(void)491 BinaryenOp BinaryenMulInt32(void) { return MulInt32; }
BinaryenDivSInt32(void)492 BinaryenOp BinaryenDivSInt32(void) { return DivSInt32; }
BinaryenDivUInt32(void)493 BinaryenOp BinaryenDivUInt32(void) { return DivUInt32; }
BinaryenRemSInt32(void)494 BinaryenOp BinaryenRemSInt32(void) { return RemSInt32; }
BinaryenRemUInt32(void)495 BinaryenOp BinaryenRemUInt32(void) { return RemUInt32; }
BinaryenAndInt32(void)496 BinaryenOp BinaryenAndInt32(void) { return AndInt32; }
BinaryenOrInt32(void)497 BinaryenOp BinaryenOrInt32(void) { return OrInt32; }
BinaryenXorInt32(void)498 BinaryenOp BinaryenXorInt32(void) { return XorInt32; }
BinaryenShlInt32(void)499 BinaryenOp BinaryenShlInt32(void) { return ShlInt32; }
BinaryenShrUInt32(void)500 BinaryenOp BinaryenShrUInt32(void) { return ShrUInt32; }
BinaryenShrSInt32(void)501 BinaryenOp BinaryenShrSInt32(void) { return ShrSInt32; }
BinaryenRotLInt32(void)502 BinaryenOp BinaryenRotLInt32(void) { return RotLInt32; }
BinaryenRotRInt32(void)503 BinaryenOp BinaryenRotRInt32(void) { return RotRInt32; }
BinaryenEqInt32(void)504 BinaryenOp BinaryenEqInt32(void) { return EqInt32; }
BinaryenNeInt32(void)505 BinaryenOp BinaryenNeInt32(void) { return NeInt32; }
BinaryenLtSInt32(void)506 BinaryenOp BinaryenLtSInt32(void) { return LtSInt32; }
BinaryenLtUInt32(void)507 BinaryenOp BinaryenLtUInt32(void) { return LtUInt32; }
BinaryenLeSInt32(void)508 BinaryenOp BinaryenLeSInt32(void) { return LeSInt32; }
BinaryenLeUInt32(void)509 BinaryenOp BinaryenLeUInt32(void) { return LeUInt32; }
BinaryenGtSInt32(void)510 BinaryenOp BinaryenGtSInt32(void) { return GtSInt32; }
BinaryenGtUInt32(void)511 BinaryenOp BinaryenGtUInt32(void) { return GtUInt32; }
BinaryenGeSInt32(void)512 BinaryenOp BinaryenGeSInt32(void) { return GeSInt32; }
BinaryenGeUInt32(void)513 BinaryenOp BinaryenGeUInt32(void) { return GeUInt32; }
BinaryenAddInt64(void)514 BinaryenOp BinaryenAddInt64(void) { return AddInt64; }
BinaryenSubInt64(void)515 BinaryenOp BinaryenSubInt64(void) { return SubInt64; }
BinaryenMulInt64(void)516 BinaryenOp BinaryenMulInt64(void) { return MulInt64; }
BinaryenDivSInt64(void)517 BinaryenOp BinaryenDivSInt64(void) { return DivSInt64; }
BinaryenDivUInt64(void)518 BinaryenOp BinaryenDivUInt64(void) { return DivUInt64; }
BinaryenRemSInt64(void)519 BinaryenOp BinaryenRemSInt64(void) { return RemSInt64; }
BinaryenRemUInt64(void)520 BinaryenOp BinaryenRemUInt64(void) { return RemUInt64; }
BinaryenAndInt64(void)521 BinaryenOp BinaryenAndInt64(void) { return AndInt64; }
BinaryenOrInt64(void)522 BinaryenOp BinaryenOrInt64(void) { return OrInt64; }
BinaryenXorInt64(void)523 BinaryenOp BinaryenXorInt64(void) { return XorInt64; }
BinaryenShlInt64(void)524 BinaryenOp BinaryenShlInt64(void) { return ShlInt64; }
BinaryenShrUInt64(void)525 BinaryenOp BinaryenShrUInt64(void) { return ShrUInt64; }
BinaryenShrSInt64(void)526 BinaryenOp BinaryenShrSInt64(void) { return ShrSInt64; }
BinaryenRotLInt64(void)527 BinaryenOp BinaryenRotLInt64(void) { return RotLInt64; }
BinaryenRotRInt64(void)528 BinaryenOp BinaryenRotRInt64(void) { return RotRInt64; }
BinaryenEqInt64(void)529 BinaryenOp BinaryenEqInt64(void) { return EqInt64; }
BinaryenNeInt64(void)530 BinaryenOp BinaryenNeInt64(void) { return NeInt64; }
BinaryenLtSInt64(void)531 BinaryenOp BinaryenLtSInt64(void) { return LtSInt64; }
BinaryenLtUInt64(void)532 BinaryenOp BinaryenLtUInt64(void) { return LtUInt64; }
BinaryenLeSInt64(void)533 BinaryenOp BinaryenLeSInt64(void) { return LeSInt64; }
BinaryenLeUInt64(void)534 BinaryenOp BinaryenLeUInt64(void) { return LeUInt64; }
BinaryenGtSInt64(void)535 BinaryenOp BinaryenGtSInt64(void) { return GtSInt64; }
BinaryenGtUInt64(void)536 BinaryenOp BinaryenGtUInt64(void) { return GtUInt64; }
BinaryenGeSInt64(void)537 BinaryenOp BinaryenGeSInt64(void) { return GeSInt64; }
BinaryenGeUInt64(void)538 BinaryenOp BinaryenGeUInt64(void) { return GeUInt64; }
BinaryenAddFloat32(void)539 BinaryenOp BinaryenAddFloat32(void) { return AddFloat32; }
BinaryenSubFloat32(void)540 BinaryenOp BinaryenSubFloat32(void) { return SubFloat32; }
BinaryenMulFloat32(void)541 BinaryenOp BinaryenMulFloat32(void) { return MulFloat32; }
BinaryenDivFloat32(void)542 BinaryenOp BinaryenDivFloat32(void) { return DivFloat32; }
BinaryenCopySignFloat32(void)543 BinaryenOp BinaryenCopySignFloat32(void) { return CopySignFloat32; }
BinaryenMinFloat32(void)544 BinaryenOp BinaryenMinFloat32(void) { return MinFloat32; }
BinaryenMaxFloat32(void)545 BinaryenOp BinaryenMaxFloat32(void) { return MaxFloat32; }
BinaryenEqFloat32(void)546 BinaryenOp BinaryenEqFloat32(void) { return EqFloat32; }
BinaryenNeFloat32(void)547 BinaryenOp BinaryenNeFloat32(void) { return NeFloat32; }
BinaryenLtFloat32(void)548 BinaryenOp BinaryenLtFloat32(void) { return LtFloat32; }
BinaryenLeFloat32(void)549 BinaryenOp BinaryenLeFloat32(void) { return LeFloat32; }
BinaryenGtFloat32(void)550 BinaryenOp BinaryenGtFloat32(void) { return GtFloat32; }
BinaryenGeFloat32(void)551 BinaryenOp BinaryenGeFloat32(void) { return GeFloat32; }
BinaryenAddFloat64(void)552 BinaryenOp BinaryenAddFloat64(void) { return AddFloat64; }
BinaryenSubFloat64(void)553 BinaryenOp BinaryenSubFloat64(void) { return SubFloat64; }
BinaryenMulFloat64(void)554 BinaryenOp BinaryenMulFloat64(void) { return MulFloat64; }
BinaryenDivFloat64(void)555 BinaryenOp BinaryenDivFloat64(void) { return DivFloat64; }
BinaryenCopySignFloat64(void)556 BinaryenOp BinaryenCopySignFloat64(void) { return CopySignFloat64; }
BinaryenMinFloat64(void)557 BinaryenOp BinaryenMinFloat64(void) { return MinFloat64; }
BinaryenMaxFloat64(void)558 BinaryenOp BinaryenMaxFloat64(void) { return MaxFloat64; }
BinaryenEqFloat64(void)559 BinaryenOp BinaryenEqFloat64(void) { return EqFloat64; }
BinaryenNeFloat64(void)560 BinaryenOp BinaryenNeFloat64(void) { return NeFloat64; }
BinaryenLtFloat64(void)561 BinaryenOp BinaryenLtFloat64(void) { return LtFloat64; }
BinaryenLeFloat64(void)562 BinaryenOp BinaryenLeFloat64(void) { return LeFloat64; }
BinaryenGtFloat64(void)563 BinaryenOp BinaryenGtFloat64(void) { return GtFloat64; }
BinaryenGeFloat64(void)564 BinaryenOp BinaryenGeFloat64(void) { return GeFloat64; }
BinaryenAtomicRMWAdd(void)565 BinaryenOp BinaryenAtomicRMWAdd(void) { return AtomicRMWOp::Add; }
BinaryenAtomicRMWSub(void)566 BinaryenOp BinaryenAtomicRMWSub(void) { return AtomicRMWOp::Sub; }
BinaryenAtomicRMWAnd(void)567 BinaryenOp BinaryenAtomicRMWAnd(void) { return AtomicRMWOp::And; }
BinaryenAtomicRMWOr(void)568 BinaryenOp BinaryenAtomicRMWOr(void) { return AtomicRMWOp::Or; }
BinaryenAtomicRMWXor(void)569 BinaryenOp BinaryenAtomicRMWXor(void) { return AtomicRMWOp::Xor; }
BinaryenAtomicRMWXchg(void)570 BinaryenOp BinaryenAtomicRMWXchg(void) { return AtomicRMWOp::Xchg; }
BinaryenTruncSatSFloat32ToInt32(void)571 BinaryenOp BinaryenTruncSatSFloat32ToInt32(void) {
572   return TruncSatSFloat32ToInt32;
573 }
BinaryenTruncSatSFloat32ToInt64(void)574 BinaryenOp BinaryenTruncSatSFloat32ToInt64(void) {
575   return TruncSatSFloat32ToInt64;
576 }
BinaryenTruncSatUFloat32ToInt32(void)577 BinaryenOp BinaryenTruncSatUFloat32ToInt32(void) {
578   return TruncSatUFloat32ToInt32;
579 }
BinaryenTruncSatUFloat32ToInt64(void)580 BinaryenOp BinaryenTruncSatUFloat32ToInt64(void) {
581   return TruncSatUFloat32ToInt64;
582 }
BinaryenTruncSatSFloat64ToInt32(void)583 BinaryenOp BinaryenTruncSatSFloat64ToInt32(void) {
584   return TruncSatSFloat64ToInt32;
585 }
BinaryenTruncSatSFloat64ToInt64(void)586 BinaryenOp BinaryenTruncSatSFloat64ToInt64(void) {
587   return TruncSatSFloat64ToInt64;
588 }
BinaryenTruncSatUFloat64ToInt32(void)589 BinaryenOp BinaryenTruncSatUFloat64ToInt32(void) {
590   return TruncSatUFloat64ToInt32;
591 }
BinaryenTruncSatUFloat64ToInt64(void)592 BinaryenOp BinaryenTruncSatUFloat64ToInt64(void) {
593   return TruncSatUFloat64ToInt64;
594 }
BinaryenSplatVecI8x16(void)595 BinaryenOp BinaryenSplatVecI8x16(void) { return SplatVecI8x16; }
BinaryenExtractLaneSVecI8x16(void)596 BinaryenOp BinaryenExtractLaneSVecI8x16(void) { return ExtractLaneSVecI8x16; }
BinaryenExtractLaneUVecI8x16(void)597 BinaryenOp BinaryenExtractLaneUVecI8x16(void) { return ExtractLaneUVecI8x16; }
BinaryenReplaceLaneVecI8x16(void)598 BinaryenOp BinaryenReplaceLaneVecI8x16(void) { return ReplaceLaneVecI8x16; }
BinaryenSplatVecI16x8(void)599 BinaryenOp BinaryenSplatVecI16x8(void) { return SplatVecI16x8; }
BinaryenExtractLaneSVecI16x8(void)600 BinaryenOp BinaryenExtractLaneSVecI16x8(void) { return ExtractLaneSVecI16x8; }
BinaryenExtractLaneUVecI16x8(void)601 BinaryenOp BinaryenExtractLaneUVecI16x8(void) { return ExtractLaneUVecI16x8; }
BinaryenReplaceLaneVecI16x8(void)602 BinaryenOp BinaryenReplaceLaneVecI16x8(void) { return ReplaceLaneVecI16x8; }
BinaryenSplatVecI32x4(void)603 BinaryenOp BinaryenSplatVecI32x4(void) { return SplatVecI32x4; }
BinaryenExtractLaneVecI32x4(void)604 BinaryenOp BinaryenExtractLaneVecI32x4(void) { return ExtractLaneVecI32x4; }
BinaryenReplaceLaneVecI32x4(void)605 BinaryenOp BinaryenReplaceLaneVecI32x4(void) { return ReplaceLaneVecI32x4; }
BinaryenSplatVecI64x2(void)606 BinaryenOp BinaryenSplatVecI64x2(void) { return SplatVecI64x2; }
BinaryenExtractLaneVecI64x2(void)607 BinaryenOp BinaryenExtractLaneVecI64x2(void) { return ExtractLaneVecI64x2; }
BinaryenReplaceLaneVecI64x2(void)608 BinaryenOp BinaryenReplaceLaneVecI64x2(void) { return ReplaceLaneVecI64x2; }
BinaryenSplatVecF32x4(void)609 BinaryenOp BinaryenSplatVecF32x4(void) { return SplatVecF32x4; }
BinaryenExtractLaneVecF32x4(void)610 BinaryenOp BinaryenExtractLaneVecF32x4(void) { return ExtractLaneVecF32x4; }
BinaryenReplaceLaneVecF32x4(void)611 BinaryenOp BinaryenReplaceLaneVecF32x4(void) { return ReplaceLaneVecF32x4; }
BinaryenSplatVecF64x2(void)612 BinaryenOp BinaryenSplatVecF64x2(void) { return SplatVecF64x2; }
BinaryenExtractLaneVecF64x2(void)613 BinaryenOp BinaryenExtractLaneVecF64x2(void) { return ExtractLaneVecF64x2; }
BinaryenReplaceLaneVecF64x2(void)614 BinaryenOp BinaryenReplaceLaneVecF64x2(void) { return ReplaceLaneVecF64x2; }
BinaryenEqVecI8x16(void)615 BinaryenOp BinaryenEqVecI8x16(void) { return EqVecI8x16; }
BinaryenNeVecI8x16(void)616 BinaryenOp BinaryenNeVecI8x16(void) { return NeVecI8x16; }
BinaryenLtSVecI8x16(void)617 BinaryenOp BinaryenLtSVecI8x16(void) { return LtSVecI8x16; }
BinaryenLtUVecI8x16(void)618 BinaryenOp BinaryenLtUVecI8x16(void) { return LtUVecI8x16; }
BinaryenGtSVecI8x16(void)619 BinaryenOp BinaryenGtSVecI8x16(void) { return GtSVecI8x16; }
BinaryenGtUVecI8x16(void)620 BinaryenOp BinaryenGtUVecI8x16(void) { return GtUVecI8x16; }
BinaryenLeSVecI8x16(void)621 BinaryenOp BinaryenLeSVecI8x16(void) { return LeSVecI8x16; }
BinaryenLeUVecI8x16(void)622 BinaryenOp BinaryenLeUVecI8x16(void) { return LeUVecI8x16; }
BinaryenGeSVecI8x16(void)623 BinaryenOp BinaryenGeSVecI8x16(void) { return GeSVecI8x16; }
BinaryenGeUVecI8x16(void)624 BinaryenOp BinaryenGeUVecI8x16(void) { return GeUVecI8x16; }
BinaryenEqVecI16x8(void)625 BinaryenOp BinaryenEqVecI16x8(void) { return EqVecI16x8; }
BinaryenNeVecI16x8(void)626 BinaryenOp BinaryenNeVecI16x8(void) { return NeVecI16x8; }
BinaryenLtSVecI16x8(void)627 BinaryenOp BinaryenLtSVecI16x8(void) { return LtSVecI16x8; }
BinaryenLtUVecI16x8(void)628 BinaryenOp BinaryenLtUVecI16x8(void) { return LtUVecI16x8; }
BinaryenGtSVecI16x8(void)629 BinaryenOp BinaryenGtSVecI16x8(void) { return GtSVecI16x8; }
BinaryenGtUVecI16x8(void)630 BinaryenOp BinaryenGtUVecI16x8(void) { return GtUVecI16x8; }
BinaryenLeSVecI16x8(void)631 BinaryenOp BinaryenLeSVecI16x8(void) { return LeSVecI16x8; }
BinaryenLeUVecI16x8(void)632 BinaryenOp BinaryenLeUVecI16x8(void) { return LeUVecI16x8; }
BinaryenGeSVecI16x8(void)633 BinaryenOp BinaryenGeSVecI16x8(void) { return GeSVecI16x8; }
BinaryenGeUVecI16x8(void)634 BinaryenOp BinaryenGeUVecI16x8(void) { return GeUVecI16x8; }
BinaryenEqVecI32x4(void)635 BinaryenOp BinaryenEqVecI32x4(void) { return EqVecI32x4; }
BinaryenNeVecI32x4(void)636 BinaryenOp BinaryenNeVecI32x4(void) { return NeVecI32x4; }
BinaryenLtSVecI32x4(void)637 BinaryenOp BinaryenLtSVecI32x4(void) { return LtSVecI32x4; }
BinaryenLtUVecI32x4(void)638 BinaryenOp BinaryenLtUVecI32x4(void) { return LtUVecI32x4; }
BinaryenGtSVecI32x4(void)639 BinaryenOp BinaryenGtSVecI32x4(void) { return GtSVecI32x4; }
BinaryenGtUVecI32x4(void)640 BinaryenOp BinaryenGtUVecI32x4(void) { return GtUVecI32x4; }
BinaryenLeSVecI32x4(void)641 BinaryenOp BinaryenLeSVecI32x4(void) { return LeSVecI32x4; }
BinaryenLeUVecI32x4(void)642 BinaryenOp BinaryenLeUVecI32x4(void) { return LeUVecI32x4; }
BinaryenGeSVecI32x4(void)643 BinaryenOp BinaryenGeSVecI32x4(void) { return GeSVecI32x4; }
BinaryenGeUVecI32x4(void)644 BinaryenOp BinaryenGeUVecI32x4(void) { return GeUVecI32x4; }
BinaryenEqVecF32x4(void)645 BinaryenOp BinaryenEqVecF32x4(void) { return EqVecF32x4; }
BinaryenNeVecF32x4(void)646 BinaryenOp BinaryenNeVecF32x4(void) { return NeVecF32x4; }
BinaryenLtVecF32x4(void)647 BinaryenOp BinaryenLtVecF32x4(void) { return LtVecF32x4; }
BinaryenGtVecF32x4(void)648 BinaryenOp BinaryenGtVecF32x4(void) { return GtVecF32x4; }
BinaryenLeVecF32x4(void)649 BinaryenOp BinaryenLeVecF32x4(void) { return LeVecF32x4; }
BinaryenGeVecF32x4(void)650 BinaryenOp BinaryenGeVecF32x4(void) { return GeVecF32x4; }
BinaryenEqVecF64x2(void)651 BinaryenOp BinaryenEqVecF64x2(void) { return EqVecF64x2; }
BinaryenNeVecF64x2(void)652 BinaryenOp BinaryenNeVecF64x2(void) { return NeVecF64x2; }
BinaryenLtVecF64x2(void)653 BinaryenOp BinaryenLtVecF64x2(void) { return LtVecF64x2; }
BinaryenGtVecF64x2(void)654 BinaryenOp BinaryenGtVecF64x2(void) { return GtVecF64x2; }
BinaryenLeVecF64x2(void)655 BinaryenOp BinaryenLeVecF64x2(void) { return LeVecF64x2; }
BinaryenGeVecF64x2(void)656 BinaryenOp BinaryenGeVecF64x2(void) { return GeVecF64x2; }
BinaryenNotVec128(void)657 BinaryenOp BinaryenNotVec128(void) { return NotVec128; }
BinaryenAndVec128(void)658 BinaryenOp BinaryenAndVec128(void) { return AndVec128; }
BinaryenOrVec128(void)659 BinaryenOp BinaryenOrVec128(void) { return OrVec128; }
BinaryenXorVec128(void)660 BinaryenOp BinaryenXorVec128(void) { return XorVec128; }
BinaryenAndNotVec128(void)661 BinaryenOp BinaryenAndNotVec128(void) { return AndNotVec128; }
BinaryenBitselectVec128(void)662 BinaryenOp BinaryenBitselectVec128(void) { return Bitselect; }
BinaryenAbsVecI8x16(void)663 BinaryenOp BinaryenAbsVecI8x16(void) { return AbsVecI8x16; }
BinaryenNegVecI8x16(void)664 BinaryenOp BinaryenNegVecI8x16(void) { return NegVecI8x16; }
BinaryenAnyTrueVecI8x16(void)665 BinaryenOp BinaryenAnyTrueVecI8x16(void) { return AnyTrueVecI8x16; }
BinaryenAllTrueVecI8x16(void)666 BinaryenOp BinaryenAllTrueVecI8x16(void) { return AllTrueVecI8x16; }
BinaryenBitmaskVecI8x16(void)667 BinaryenOp BinaryenBitmaskVecI8x16(void) { return BitmaskVecI8x16; }
BinaryenShlVecI8x16(void)668 BinaryenOp BinaryenShlVecI8x16(void) { return ShlVecI8x16; }
BinaryenShrSVecI8x16(void)669 BinaryenOp BinaryenShrSVecI8x16(void) { return ShrSVecI8x16; }
BinaryenShrUVecI8x16(void)670 BinaryenOp BinaryenShrUVecI8x16(void) { return ShrUVecI8x16; }
BinaryenAddVecI8x16(void)671 BinaryenOp BinaryenAddVecI8x16(void) { return AddVecI8x16; }
BinaryenAddSatSVecI8x16(void)672 BinaryenOp BinaryenAddSatSVecI8x16(void) { return AddSatSVecI8x16; }
BinaryenAddSatUVecI8x16(void)673 BinaryenOp BinaryenAddSatUVecI8x16(void) { return AddSatUVecI8x16; }
BinaryenSubVecI8x16(void)674 BinaryenOp BinaryenSubVecI8x16(void) { return SubVecI8x16; }
BinaryenSubSatSVecI8x16(void)675 BinaryenOp BinaryenSubSatSVecI8x16(void) { return SubSatSVecI8x16; }
BinaryenSubSatUVecI8x16(void)676 BinaryenOp BinaryenSubSatUVecI8x16(void) { return SubSatUVecI8x16; }
BinaryenMulVecI8x16(void)677 BinaryenOp BinaryenMulVecI8x16(void) { return MulVecI8x16; }
BinaryenMinSVecI8x16(void)678 BinaryenOp BinaryenMinSVecI8x16(void) { return MinSVecI8x16; }
BinaryenMinUVecI8x16(void)679 BinaryenOp BinaryenMinUVecI8x16(void) { return MinUVecI8x16; }
BinaryenMaxSVecI8x16(void)680 BinaryenOp BinaryenMaxSVecI8x16(void) { return MaxSVecI8x16; }
BinaryenMaxUVecI8x16(void)681 BinaryenOp BinaryenMaxUVecI8x16(void) { return MaxUVecI8x16; }
BinaryenAvgrUVecI8x16(void)682 BinaryenOp BinaryenAvgrUVecI8x16(void) { return AvgrUVecI8x16; }
BinaryenAbsVecI16x8(void)683 BinaryenOp BinaryenAbsVecI16x8(void) { return AbsVecI16x8; }
BinaryenNegVecI16x8(void)684 BinaryenOp BinaryenNegVecI16x8(void) { return NegVecI16x8; }
BinaryenAnyTrueVecI16x8(void)685 BinaryenOp BinaryenAnyTrueVecI16x8(void) { return AnyTrueVecI16x8; }
BinaryenAllTrueVecI16x8(void)686 BinaryenOp BinaryenAllTrueVecI16x8(void) { return AllTrueVecI16x8; }
BinaryenBitmaskVecI16x8(void)687 BinaryenOp BinaryenBitmaskVecI16x8(void) { return BitmaskVecI16x8; }
BinaryenShlVecI16x8(void)688 BinaryenOp BinaryenShlVecI16x8(void) { return ShlVecI16x8; }
BinaryenShrSVecI16x8(void)689 BinaryenOp BinaryenShrSVecI16x8(void) { return ShrSVecI16x8; }
BinaryenShrUVecI16x8(void)690 BinaryenOp BinaryenShrUVecI16x8(void) { return ShrUVecI16x8; }
BinaryenAddVecI16x8(void)691 BinaryenOp BinaryenAddVecI16x8(void) { return AddVecI16x8; }
BinaryenAddSatSVecI16x8(void)692 BinaryenOp BinaryenAddSatSVecI16x8(void) { return AddSatSVecI16x8; }
BinaryenAddSatUVecI16x8(void)693 BinaryenOp BinaryenAddSatUVecI16x8(void) { return AddSatUVecI16x8; }
BinaryenSubVecI16x8(void)694 BinaryenOp BinaryenSubVecI16x8(void) { return SubVecI16x8; }
BinaryenSubSatSVecI16x8(void)695 BinaryenOp BinaryenSubSatSVecI16x8(void) { return SubSatSVecI16x8; }
BinaryenSubSatUVecI16x8(void)696 BinaryenOp BinaryenSubSatUVecI16x8(void) { return SubSatUVecI16x8; }
BinaryenMulVecI16x8(void)697 BinaryenOp BinaryenMulVecI16x8(void) { return MulVecI16x8; }
BinaryenMinSVecI16x8(void)698 BinaryenOp BinaryenMinSVecI16x8(void) { return MinSVecI16x8; }
BinaryenMinUVecI16x8(void)699 BinaryenOp BinaryenMinUVecI16x8(void) { return MinUVecI16x8; }
BinaryenMaxSVecI16x8(void)700 BinaryenOp BinaryenMaxSVecI16x8(void) { return MaxSVecI16x8; }
BinaryenMaxUVecI16x8(void)701 BinaryenOp BinaryenMaxUVecI16x8(void) { return MaxUVecI16x8; }
BinaryenAvgrUVecI16x8(void)702 BinaryenOp BinaryenAvgrUVecI16x8(void) { return AvgrUVecI16x8; }
BinaryenAbsVecI32x4(void)703 BinaryenOp BinaryenAbsVecI32x4(void) { return AbsVecI32x4; }
BinaryenNegVecI32x4(void)704 BinaryenOp BinaryenNegVecI32x4(void) { return NegVecI32x4; }
BinaryenAnyTrueVecI32x4(void)705 BinaryenOp BinaryenAnyTrueVecI32x4(void) { return AnyTrueVecI32x4; }
BinaryenAllTrueVecI32x4(void)706 BinaryenOp BinaryenAllTrueVecI32x4(void) { return AllTrueVecI32x4; }
BinaryenBitmaskVecI32x4(void)707 BinaryenOp BinaryenBitmaskVecI32x4(void) { return BitmaskVecI32x4; }
BinaryenShlVecI32x4(void)708 BinaryenOp BinaryenShlVecI32x4(void) { return ShlVecI32x4; }
BinaryenShrSVecI32x4(void)709 BinaryenOp BinaryenShrSVecI32x4(void) { return ShrSVecI32x4; }
BinaryenShrUVecI32x4(void)710 BinaryenOp BinaryenShrUVecI32x4(void) { return ShrUVecI32x4; }
BinaryenAddVecI32x4(void)711 BinaryenOp BinaryenAddVecI32x4(void) { return AddVecI32x4; }
BinaryenSubVecI32x4(void)712 BinaryenOp BinaryenSubVecI32x4(void) { return SubVecI32x4; }
BinaryenMulVecI32x4(void)713 BinaryenOp BinaryenMulVecI32x4(void) { return MulVecI32x4; }
BinaryenMinSVecI32x4(void)714 BinaryenOp BinaryenMinSVecI32x4(void) { return MinSVecI32x4; }
BinaryenMinUVecI32x4(void)715 BinaryenOp BinaryenMinUVecI32x4(void) { return MinUVecI32x4; }
BinaryenMaxSVecI32x4(void)716 BinaryenOp BinaryenMaxSVecI32x4(void) { return MaxSVecI32x4; }
BinaryenMaxUVecI32x4(void)717 BinaryenOp BinaryenMaxUVecI32x4(void) { return MaxUVecI32x4; }
BinaryenDotSVecI16x8ToVecI32x4(void)718 BinaryenOp BinaryenDotSVecI16x8ToVecI32x4(void) {
719   return DotSVecI16x8ToVecI32x4;
720 }
BinaryenNegVecI64x2(void)721 BinaryenOp BinaryenNegVecI64x2(void) { return NegVecI64x2; }
BinaryenAnyTrueVecI64x2(void)722 BinaryenOp BinaryenAnyTrueVecI64x2(void) { return AnyTrueVecI64x2; }
BinaryenAllTrueVecI64x2(void)723 BinaryenOp BinaryenAllTrueVecI64x2(void) { return AllTrueVecI64x2; }
BinaryenShlVecI64x2(void)724 BinaryenOp BinaryenShlVecI64x2(void) { return ShlVecI64x2; }
BinaryenShrSVecI64x2(void)725 BinaryenOp BinaryenShrSVecI64x2(void) { return ShrSVecI64x2; }
BinaryenShrUVecI64x2(void)726 BinaryenOp BinaryenShrUVecI64x2(void) { return ShrUVecI64x2; }
BinaryenAddVecI64x2(void)727 BinaryenOp BinaryenAddVecI64x2(void) { return AddVecI64x2; }
BinaryenSubVecI64x2(void)728 BinaryenOp BinaryenSubVecI64x2(void) { return SubVecI64x2; }
BinaryenMulVecI64x2(void)729 BinaryenOp BinaryenMulVecI64x2(void) { return MulVecI64x2; }
BinaryenAbsVecF32x4(void)730 BinaryenOp BinaryenAbsVecF32x4(void) { return AbsVecF32x4; }
BinaryenNegVecF32x4(void)731 BinaryenOp BinaryenNegVecF32x4(void) { return NegVecF32x4; }
BinaryenSqrtVecF32x4(void)732 BinaryenOp BinaryenSqrtVecF32x4(void) { return SqrtVecF32x4; }
BinaryenQFMAVecF32x4(void)733 BinaryenOp BinaryenQFMAVecF32x4(void) { return QFMAF32x4; }
BinaryenQFMSVecF32x4(void)734 BinaryenOp BinaryenQFMSVecF32x4(void) { return QFMSF32x4; }
BinaryenAddVecF32x4(void)735 BinaryenOp BinaryenAddVecF32x4(void) { return AddVecF32x4; }
BinaryenSubVecF32x4(void)736 BinaryenOp BinaryenSubVecF32x4(void) { return SubVecF32x4; }
BinaryenMulVecF32x4(void)737 BinaryenOp BinaryenMulVecF32x4(void) { return MulVecF32x4; }
BinaryenDivVecF32x4(void)738 BinaryenOp BinaryenDivVecF32x4(void) { return DivVecF32x4; }
BinaryenMinVecF32x4(void)739 BinaryenOp BinaryenMinVecF32x4(void) { return MinVecF32x4; }
BinaryenMaxVecF32x4(void)740 BinaryenOp BinaryenMaxVecF32x4(void) { return MaxVecF32x4; }
BinaryenPMinVecF32x4(void)741 BinaryenOp BinaryenPMinVecF32x4(void) { return PMinVecF32x4; }
BinaryenCeilVecF32x4(void)742 BinaryenOp BinaryenCeilVecF32x4(void) { return CeilVecF32x4; }
BinaryenFloorVecF32x4(void)743 BinaryenOp BinaryenFloorVecF32x4(void) { return FloorVecF32x4; }
BinaryenTruncVecF32x4(void)744 BinaryenOp BinaryenTruncVecF32x4(void) { return TruncVecF32x4; }
BinaryenNearestVecF32x4(void)745 BinaryenOp BinaryenNearestVecF32x4(void) { return NearestVecF32x4; }
BinaryenPMaxVecF32x4(void)746 BinaryenOp BinaryenPMaxVecF32x4(void) { return PMaxVecF32x4; }
BinaryenAbsVecF64x2(void)747 BinaryenOp BinaryenAbsVecF64x2(void) { return AbsVecF64x2; }
BinaryenNegVecF64x2(void)748 BinaryenOp BinaryenNegVecF64x2(void) { return NegVecF64x2; }
BinaryenSqrtVecF64x2(void)749 BinaryenOp BinaryenSqrtVecF64x2(void) { return SqrtVecF64x2; }
BinaryenQFMAVecF64x2(void)750 BinaryenOp BinaryenQFMAVecF64x2(void) { return QFMAF64x2; }
BinaryenQFMSVecF64x2(void)751 BinaryenOp BinaryenQFMSVecF64x2(void) { return QFMSF64x2; }
BinaryenAddVecF64x2(void)752 BinaryenOp BinaryenAddVecF64x2(void) { return AddVecF64x2; }
BinaryenSubVecF64x2(void)753 BinaryenOp BinaryenSubVecF64x2(void) { return SubVecF64x2; }
BinaryenMulVecF64x2(void)754 BinaryenOp BinaryenMulVecF64x2(void) { return MulVecF64x2; }
BinaryenDivVecF64x2(void)755 BinaryenOp BinaryenDivVecF64x2(void) { return DivVecF64x2; }
BinaryenMinVecF64x2(void)756 BinaryenOp BinaryenMinVecF64x2(void) { return MinVecF64x2; }
BinaryenMaxVecF64x2(void)757 BinaryenOp BinaryenMaxVecF64x2(void) { return MaxVecF64x2; }
BinaryenPMinVecF64x2(void)758 BinaryenOp BinaryenPMinVecF64x2(void) { return PMinVecF64x2; }
BinaryenPMaxVecF64x2(void)759 BinaryenOp BinaryenPMaxVecF64x2(void) { return PMaxVecF64x2; }
BinaryenCeilVecF64x2(void)760 BinaryenOp BinaryenCeilVecF64x2(void) { return CeilVecF64x2; }
BinaryenFloorVecF64x2(void)761 BinaryenOp BinaryenFloorVecF64x2(void) { return FloorVecF64x2; }
BinaryenTruncVecF64x2(void)762 BinaryenOp BinaryenTruncVecF64x2(void) { return TruncVecF64x2; }
BinaryenNearestVecF64x2(void)763 BinaryenOp BinaryenNearestVecF64x2(void) { return NearestVecF64x2; }
BinaryenTruncSatSVecF32x4ToVecI32x4(void)764 BinaryenOp BinaryenTruncSatSVecF32x4ToVecI32x4(void) {
765   return TruncSatSVecF32x4ToVecI32x4;
766 }
BinaryenTruncSatUVecF32x4ToVecI32x4(void)767 BinaryenOp BinaryenTruncSatUVecF32x4ToVecI32x4(void) {
768   return TruncSatUVecF32x4ToVecI32x4;
769 }
BinaryenTruncSatSVecF64x2ToVecI64x2(void)770 BinaryenOp BinaryenTruncSatSVecF64x2ToVecI64x2(void) {
771   return TruncSatSVecF64x2ToVecI64x2;
772 }
BinaryenTruncSatUVecF64x2ToVecI64x2(void)773 BinaryenOp BinaryenTruncSatUVecF64x2ToVecI64x2(void) {
774   return TruncSatUVecF64x2ToVecI64x2;
775 }
BinaryenConvertSVecI32x4ToVecF32x4(void)776 BinaryenOp BinaryenConvertSVecI32x4ToVecF32x4(void) {
777   return ConvertSVecI32x4ToVecF32x4;
778 }
BinaryenConvertUVecI32x4ToVecF32x4(void)779 BinaryenOp BinaryenConvertUVecI32x4ToVecF32x4(void) {
780   return ConvertUVecI32x4ToVecF32x4;
781 }
BinaryenConvertSVecI64x2ToVecF64x2(void)782 BinaryenOp BinaryenConvertSVecI64x2ToVecF64x2(void) {
783   return ConvertSVecI64x2ToVecF64x2;
784 }
BinaryenConvertUVecI64x2ToVecF64x2(void)785 BinaryenOp BinaryenConvertUVecI64x2ToVecF64x2(void) {
786   return ConvertUVecI64x2ToVecF64x2;
787 }
BinaryenLoadSplatVec8x16(void)788 BinaryenOp BinaryenLoadSplatVec8x16(void) { return LoadSplatVec8x16; }
BinaryenLoadSplatVec16x8(void)789 BinaryenOp BinaryenLoadSplatVec16x8(void) { return LoadSplatVec16x8; }
BinaryenLoadSplatVec32x4(void)790 BinaryenOp BinaryenLoadSplatVec32x4(void) { return LoadSplatVec32x4; }
BinaryenLoadSplatVec64x2(void)791 BinaryenOp BinaryenLoadSplatVec64x2(void) { return LoadSplatVec64x2; }
BinaryenLoadExtSVec8x8ToVecI16x8(void)792 BinaryenOp BinaryenLoadExtSVec8x8ToVecI16x8(void) {
793   return LoadExtSVec8x8ToVecI16x8;
794 }
BinaryenLoadExtUVec8x8ToVecI16x8(void)795 BinaryenOp BinaryenLoadExtUVec8x8ToVecI16x8(void) {
796   return LoadExtUVec8x8ToVecI16x8;
797 }
BinaryenLoadExtSVec16x4ToVecI32x4(void)798 BinaryenOp BinaryenLoadExtSVec16x4ToVecI32x4(void) {
799   return LoadExtSVec16x4ToVecI32x4;
800 }
BinaryenLoadExtUVec16x4ToVecI32x4(void)801 BinaryenOp BinaryenLoadExtUVec16x4ToVecI32x4(void) {
802   return LoadExtUVec16x4ToVecI32x4;
803 }
BinaryenLoadExtSVec32x2ToVecI64x2(void)804 BinaryenOp BinaryenLoadExtSVec32x2ToVecI64x2(void) {
805   return LoadExtSVec32x2ToVecI64x2;
806 }
BinaryenLoadExtUVec32x2ToVecI64x2(void)807 BinaryenOp BinaryenLoadExtUVec32x2ToVecI64x2(void) {
808   return LoadExtUVec32x2ToVecI64x2;
809 }
BinaryenNarrowSVecI16x8ToVecI8x16(void)810 BinaryenOp BinaryenNarrowSVecI16x8ToVecI8x16(void) {
811   return NarrowSVecI16x8ToVecI8x16;
812 }
BinaryenNarrowUVecI16x8ToVecI8x16(void)813 BinaryenOp BinaryenNarrowUVecI16x8ToVecI8x16(void) {
814   return NarrowUVecI16x8ToVecI8x16;
815 }
BinaryenNarrowSVecI32x4ToVecI16x8(void)816 BinaryenOp BinaryenNarrowSVecI32x4ToVecI16x8(void) {
817   return NarrowSVecI32x4ToVecI16x8;
818 }
BinaryenNarrowUVecI32x4ToVecI16x8(void)819 BinaryenOp BinaryenNarrowUVecI32x4ToVecI16x8(void) {
820   return NarrowUVecI32x4ToVecI16x8;
821 }
BinaryenWidenLowSVecI8x16ToVecI16x8(void)822 BinaryenOp BinaryenWidenLowSVecI8x16ToVecI16x8(void) {
823   return WidenLowSVecI8x16ToVecI16x8;
824 }
BinaryenWidenHighSVecI8x16ToVecI16x8(void)825 BinaryenOp BinaryenWidenHighSVecI8x16ToVecI16x8(void) {
826   return WidenHighSVecI8x16ToVecI16x8;
827 }
BinaryenWidenLowUVecI8x16ToVecI16x8(void)828 BinaryenOp BinaryenWidenLowUVecI8x16ToVecI16x8(void) {
829   return WidenLowUVecI8x16ToVecI16x8;
830 }
BinaryenWidenHighUVecI8x16ToVecI16x8(void)831 BinaryenOp BinaryenWidenHighUVecI8x16ToVecI16x8(void) {
832   return WidenHighUVecI8x16ToVecI16x8;
833 }
BinaryenWidenLowSVecI16x8ToVecI32x4(void)834 BinaryenOp BinaryenWidenLowSVecI16x8ToVecI32x4(void) {
835   return WidenLowSVecI16x8ToVecI32x4;
836 }
BinaryenWidenHighSVecI16x8ToVecI32x4(void)837 BinaryenOp BinaryenWidenHighSVecI16x8ToVecI32x4(void) {
838   return WidenHighSVecI16x8ToVecI32x4;
839 }
BinaryenWidenLowUVecI16x8ToVecI32x4(void)840 BinaryenOp BinaryenWidenLowUVecI16x8ToVecI32x4(void) {
841   return WidenLowUVecI16x8ToVecI32x4;
842 }
BinaryenWidenHighUVecI16x8ToVecI32x4(void)843 BinaryenOp BinaryenWidenHighUVecI16x8ToVecI32x4(void) {
844   return WidenHighUVecI16x8ToVecI32x4;
845 }
BinaryenSwizzleVec8x16(void)846 BinaryenOp BinaryenSwizzleVec8x16(void) { return SwizzleVec8x16; }
847 
BinaryenBlock(BinaryenModuleRef module,const char * name,BinaryenExpressionRef * children,BinaryenIndex numChildren,BinaryenType type)848 BinaryenExpressionRef BinaryenBlock(BinaryenModuleRef module,
849                                     const char* name,
850                                     BinaryenExpressionRef* children,
851                                     BinaryenIndex numChildren,
852                                     BinaryenType type) {
853   auto* ret = ((Module*)module)->allocator.alloc<Block>();
854   if (name) {
855     ret->name = name;
856   }
857   for (BinaryenIndex i = 0; i < numChildren; i++) {
858     ret->list.push_back((Expression*)children[i]);
859   }
860   if (type != BinaryenTypeAuto()) {
861     ret->finalize(Type(type));
862   } else {
863     ret->finalize();
864   }
865   return static_cast<Expression*>(ret);
866 }
BinaryenIf(BinaryenModuleRef module,BinaryenExpressionRef condition,BinaryenExpressionRef ifTrue,BinaryenExpressionRef ifFalse)867 BinaryenExpressionRef BinaryenIf(BinaryenModuleRef module,
868                                  BinaryenExpressionRef condition,
869                                  BinaryenExpressionRef ifTrue,
870                                  BinaryenExpressionRef ifFalse) {
871   auto* ret = ((Module*)module)->allocator.alloc<If>();
872   ret->condition = (Expression*)condition;
873   ret->ifTrue = (Expression*)ifTrue;
874   ret->ifFalse = (Expression*)ifFalse;
875   ret->finalize();
876   return static_cast<Expression*>(ret);
877 }
BinaryenLoop(BinaryenModuleRef module,const char * name,BinaryenExpressionRef body)878 BinaryenExpressionRef BinaryenLoop(BinaryenModuleRef module,
879                                    const char* name,
880                                    BinaryenExpressionRef body) {
881   return static_cast<Expression*>(
882     Builder(*(Module*)module)
883       .makeLoop(name ? Name(name) : Name(), (Expression*)body));
884 }
BinaryenBreak(BinaryenModuleRef module,const char * name,BinaryenExpressionRef condition,BinaryenExpressionRef value)885 BinaryenExpressionRef BinaryenBreak(BinaryenModuleRef module,
886                                     const char* name,
887                                     BinaryenExpressionRef condition,
888                                     BinaryenExpressionRef value) {
889   return static_cast<Expression*>(
890     Builder(*(Module*)module)
891       .makeBreak(name, (Expression*)value, (Expression*)condition));
892 }
BinaryenSwitch(BinaryenModuleRef module,const char ** names,BinaryenIndex numNames,const char * defaultName,BinaryenExpressionRef condition,BinaryenExpressionRef value)893 BinaryenExpressionRef BinaryenSwitch(BinaryenModuleRef module,
894                                      const char** names,
895                                      BinaryenIndex numNames,
896                                      const char* defaultName,
897                                      BinaryenExpressionRef condition,
898                                      BinaryenExpressionRef value) {
899   auto* ret = ((Module*)module)->allocator.alloc<Switch>();
900   for (BinaryenIndex i = 0; i < numNames; i++) {
901     ret->targets.push_back(names[i]);
902   }
903   ret->default_ = defaultName;
904   ret->condition = (Expression*)condition;
905   ret->value = (Expression*)value;
906   ret->finalize();
907   return static_cast<Expression*>(ret);
908 }
makeBinaryenCall(BinaryenModuleRef module,const char * target,BinaryenExpressionRef * operands,BinaryenIndex numOperands,BinaryenType returnType,bool isReturn)909 static BinaryenExpressionRef makeBinaryenCall(BinaryenModuleRef module,
910                                               const char* target,
911                                               BinaryenExpressionRef* operands,
912                                               BinaryenIndex numOperands,
913                                               BinaryenType returnType,
914                                               bool isReturn) {
915   auto* ret = ((Module*)module)->allocator.alloc<Call>();
916   ret->target = target;
917   for (BinaryenIndex i = 0; i < numOperands; i++) {
918     ret->operands.push_back((Expression*)operands[i]);
919   }
920   ret->type = Type(returnType);
921   ret->isReturn = isReturn;
922   ret->finalize();
923   return static_cast<Expression*>(ret);
924 }
BinaryenCall(BinaryenModuleRef module,const char * target,BinaryenExpressionRef * operands,BinaryenIndex numOperands,BinaryenType returnType)925 BinaryenExpressionRef BinaryenCall(BinaryenModuleRef module,
926                                    const char* target,
927                                    BinaryenExpressionRef* operands,
928                                    BinaryenIndex numOperands,
929                                    BinaryenType returnType) {
930   return makeBinaryenCall(
931     module, target, operands, numOperands, returnType, false);
932 }
BinaryenReturnCall(BinaryenModuleRef module,const char * target,BinaryenExpressionRef * operands,BinaryenIndex numOperands,BinaryenType returnType)933 BinaryenExpressionRef BinaryenReturnCall(BinaryenModuleRef module,
934                                          const char* target,
935                                          BinaryenExpressionRef* operands,
936                                          BinaryenIndex numOperands,
937                                          BinaryenType returnType) {
938   return makeBinaryenCall(
939     module, target, operands, numOperands, returnType, true);
940 }
941 static BinaryenExpressionRef
makeBinaryenCallIndirect(BinaryenModuleRef module,BinaryenExpressionRef target,BinaryenExpressionRef * operands,BinaryenIndex numOperands,BinaryenType params,BinaryenType results,bool isReturn)942 makeBinaryenCallIndirect(BinaryenModuleRef module,
943                          BinaryenExpressionRef target,
944                          BinaryenExpressionRef* operands,
945                          BinaryenIndex numOperands,
946                          BinaryenType params,
947                          BinaryenType results,
948                          bool isReturn) {
949   auto* ret = ((Module*)module)->allocator.alloc<CallIndirect>();
950   ret->target = (Expression*)target;
951   for (BinaryenIndex i = 0; i < numOperands; i++) {
952     ret->operands.push_back((Expression*)operands[i]);
953   }
954   ret->sig = Signature(Type(params), Type(results));
955   ret->type = Type(results);
956   ret->isReturn = isReturn;
957   ret->finalize();
958   return static_cast<Expression*>(ret);
959 }
BinaryenCallIndirect(BinaryenModuleRef module,BinaryenExpressionRef target,BinaryenExpressionRef * operands,BinaryenIndex numOperands,BinaryenType params,BinaryenType results)960 BinaryenExpressionRef BinaryenCallIndirect(BinaryenModuleRef module,
961                                            BinaryenExpressionRef target,
962                                            BinaryenExpressionRef* operands,
963                                            BinaryenIndex numOperands,
964                                            BinaryenType params,
965                                            BinaryenType results) {
966   return makeBinaryenCallIndirect(
967     module, target, operands, numOperands, params, results, false);
968 }
969 BinaryenExpressionRef
BinaryenReturnCallIndirect(BinaryenModuleRef module,BinaryenExpressionRef target,BinaryenExpressionRef * operands,BinaryenIndex numOperands,BinaryenType params,BinaryenType results)970 BinaryenReturnCallIndirect(BinaryenModuleRef module,
971                            BinaryenExpressionRef target,
972                            BinaryenExpressionRef* operands,
973                            BinaryenIndex numOperands,
974                            BinaryenType params,
975                            BinaryenType results) {
976   return makeBinaryenCallIndirect(
977     module, target, operands, numOperands, params, results, true);
978 }
BinaryenLocalGet(BinaryenModuleRef module,BinaryenIndex index,BinaryenType type)979 BinaryenExpressionRef BinaryenLocalGet(BinaryenModuleRef module,
980                                        BinaryenIndex index,
981                                        BinaryenType type) {
982   auto* ret = ((Module*)module)->allocator.alloc<LocalGet>();
983   ret->index = index;
984   ret->type = Type(type);
985   ret->finalize();
986   return static_cast<Expression*>(ret);
987 }
BinaryenLocalSet(BinaryenModuleRef module,BinaryenIndex index,BinaryenExpressionRef value)988 BinaryenExpressionRef BinaryenLocalSet(BinaryenModuleRef module,
989                                        BinaryenIndex index,
990                                        BinaryenExpressionRef value) {
991   auto* ret = ((Module*)module)->allocator.alloc<LocalSet>();
992   ret->index = index;
993   ret->value = (Expression*)value;
994   ret->makeSet();
995   ret->finalize();
996   return static_cast<Expression*>(ret);
997 }
BinaryenLocalTee(BinaryenModuleRef module,BinaryenIndex index,BinaryenExpressionRef value,BinaryenType type)998 BinaryenExpressionRef BinaryenLocalTee(BinaryenModuleRef module,
999                                        BinaryenIndex index,
1000                                        BinaryenExpressionRef value,
1001                                        BinaryenType type) {
1002   auto* ret = ((Module*)module)->allocator.alloc<LocalSet>();
1003   ret->index = index;
1004   ret->value = (Expression*)value;
1005   ret->makeTee(Type(type));
1006   ret->finalize();
1007   return static_cast<Expression*>(ret);
1008 }
BinaryenGlobalGet(BinaryenModuleRef module,const char * name,BinaryenType type)1009 BinaryenExpressionRef BinaryenGlobalGet(BinaryenModuleRef module,
1010                                         const char* name,
1011                                         BinaryenType type) {
1012   auto* ret = ((Module*)module)->allocator.alloc<GlobalGet>();
1013   ret->name = name;
1014   ret->type = Type(type);
1015   ret->finalize();
1016   return static_cast<Expression*>(ret);
1017 }
BinaryenGlobalSet(BinaryenModuleRef module,const char * name,BinaryenExpressionRef value)1018 BinaryenExpressionRef BinaryenGlobalSet(BinaryenModuleRef module,
1019                                         const char* name,
1020                                         BinaryenExpressionRef value) {
1021   auto* ret = ((Module*)module)->allocator.alloc<GlobalSet>();
1022   ret->name = name;
1023   ret->value = (Expression*)value;
1024   ret->finalize();
1025   return static_cast<Expression*>(ret);
1026 }
BinaryenLoad(BinaryenModuleRef module,uint32_t bytes,int8_t signed_,uint32_t offset,uint32_t align,BinaryenType type,BinaryenExpressionRef ptr)1027 BinaryenExpressionRef BinaryenLoad(BinaryenModuleRef module,
1028                                    uint32_t bytes,
1029                                    int8_t signed_,
1030                                    uint32_t offset,
1031                                    uint32_t align,
1032                                    BinaryenType type,
1033                                    BinaryenExpressionRef ptr) {
1034   auto* ret = ((Module*)module)->allocator.alloc<Load>();
1035   ret->isAtomic = false;
1036   ret->bytes = bytes;
1037   ret->signed_ = !!signed_;
1038   ret->offset = offset;
1039   ret->align = align ? align : bytes;
1040   ret->type = Type(type);
1041   ret->ptr = (Expression*)ptr;
1042   ret->finalize();
1043   return static_cast<Expression*>(ret);
1044 }
BinaryenStore(BinaryenModuleRef module,uint32_t bytes,uint32_t offset,uint32_t align,BinaryenExpressionRef ptr,BinaryenExpressionRef value,BinaryenType type)1045 BinaryenExpressionRef BinaryenStore(BinaryenModuleRef module,
1046                                     uint32_t bytes,
1047                                     uint32_t offset,
1048                                     uint32_t align,
1049                                     BinaryenExpressionRef ptr,
1050                                     BinaryenExpressionRef value,
1051                                     BinaryenType type) {
1052   auto* ret = ((Module*)module)->allocator.alloc<Store>();
1053   ret->isAtomic = false;
1054   ret->bytes = bytes;
1055   ret->offset = offset;
1056   ret->align = align ? align : bytes;
1057   ret->ptr = (Expression*)ptr;
1058   ret->value = (Expression*)value;
1059   ret->valueType = Type(type);
1060   ret->finalize();
1061   return static_cast<Expression*>(ret);
1062 }
BinaryenConst(BinaryenModuleRef module,BinaryenLiteral value)1063 BinaryenExpressionRef BinaryenConst(BinaryenModuleRef module,
1064                                     BinaryenLiteral value) {
1065   return static_cast<Expression*>(
1066     Builder(*(Module*)module).makeConst(fromBinaryenLiteral(value)));
1067 }
BinaryenUnary(BinaryenModuleRef module,BinaryenOp op,BinaryenExpressionRef value)1068 BinaryenExpressionRef BinaryenUnary(BinaryenModuleRef module,
1069                                     BinaryenOp op,
1070                                     BinaryenExpressionRef value) {
1071   return static_cast<Expression*>(
1072     Builder(*(Module*)module).makeUnary(UnaryOp(op), (Expression*)value));
1073 }
BinaryenBinary(BinaryenModuleRef module,BinaryenOp op,BinaryenExpressionRef left,BinaryenExpressionRef right)1074 BinaryenExpressionRef BinaryenBinary(BinaryenModuleRef module,
1075                                      BinaryenOp op,
1076                                      BinaryenExpressionRef left,
1077                                      BinaryenExpressionRef right) {
1078   return static_cast<Expression*>(
1079     Builder(*(Module*)module)
1080       .makeBinary(BinaryOp(op), (Expression*)left, (Expression*)right));
1081 }
BinaryenSelect(BinaryenModuleRef module,BinaryenExpressionRef condition,BinaryenExpressionRef ifTrue,BinaryenExpressionRef ifFalse,BinaryenType type)1082 BinaryenExpressionRef BinaryenSelect(BinaryenModuleRef module,
1083                                      BinaryenExpressionRef condition,
1084                                      BinaryenExpressionRef ifTrue,
1085                                      BinaryenExpressionRef ifFalse,
1086                                      BinaryenType type) {
1087   auto* ret = ((Module*)module)->allocator.alloc<Select>();
1088   ret->condition = (Expression*)condition;
1089   ret->ifTrue = (Expression*)ifTrue;
1090   ret->ifFalse = (Expression*)ifFalse;
1091   if (type != BinaryenTypeAuto()) {
1092     ret->finalize(Type(type));
1093   } else {
1094     ret->finalize();
1095   }
1096   return static_cast<Expression*>(ret);
1097 }
BinaryenDrop(BinaryenModuleRef module,BinaryenExpressionRef value)1098 BinaryenExpressionRef BinaryenDrop(BinaryenModuleRef module,
1099                                    BinaryenExpressionRef value) {
1100   auto* ret = ((Module*)module)->allocator.alloc<Drop>();
1101   ret->value = (Expression*)value;
1102   ret->finalize();
1103   return static_cast<Expression*>(ret);
1104 }
BinaryenReturn(BinaryenModuleRef module,BinaryenExpressionRef value)1105 BinaryenExpressionRef BinaryenReturn(BinaryenModuleRef module,
1106                                      BinaryenExpressionRef value) {
1107   auto* ret = Builder(*(Module*)module).makeReturn((Expression*)value);
1108   return static_cast<Expression*>(ret);
1109 }
BinaryenMemorySize(BinaryenModuleRef module)1110 BinaryenExpressionRef BinaryenMemorySize(BinaryenModuleRef module) {
1111   auto* ret = Builder(*(Module*)module).makeMemorySize();
1112   return static_cast<Expression*>(ret);
1113 }
BinaryenMemoryGrow(BinaryenModuleRef module,BinaryenExpressionRef delta)1114 BinaryenExpressionRef BinaryenMemoryGrow(BinaryenModuleRef module,
1115                                          BinaryenExpressionRef delta) {
1116   auto* ret = Builder(*(Module*)module).makeMemoryGrow((Expression*)delta);
1117   return static_cast<Expression*>(ret);
1118 }
BinaryenNop(BinaryenModuleRef module)1119 BinaryenExpressionRef BinaryenNop(BinaryenModuleRef module) {
1120   return static_cast<Expression*>(((Module*)module)->allocator.alloc<Nop>());
1121 }
BinaryenUnreachable(BinaryenModuleRef module)1122 BinaryenExpressionRef BinaryenUnreachable(BinaryenModuleRef module) {
1123   return static_cast<Expression*>(
1124     ((Module*)module)->allocator.alloc<Unreachable>());
1125 }
BinaryenAtomicLoad(BinaryenModuleRef module,uint32_t bytes,uint32_t offset,BinaryenType type,BinaryenExpressionRef ptr)1126 BinaryenExpressionRef BinaryenAtomicLoad(BinaryenModuleRef module,
1127                                          uint32_t bytes,
1128                                          uint32_t offset,
1129                                          BinaryenType type,
1130                                          BinaryenExpressionRef ptr) {
1131   return static_cast<Expression*>(
1132     Builder(*(Module*)module)
1133       .makeAtomicLoad(bytes, offset, (Expression*)ptr, Type(type)));
1134 }
BinaryenAtomicStore(BinaryenModuleRef module,uint32_t bytes,uint32_t offset,BinaryenExpressionRef ptr,BinaryenExpressionRef value,BinaryenType type)1135 BinaryenExpressionRef BinaryenAtomicStore(BinaryenModuleRef module,
1136                                           uint32_t bytes,
1137                                           uint32_t offset,
1138                                           BinaryenExpressionRef ptr,
1139                                           BinaryenExpressionRef value,
1140                                           BinaryenType type) {
1141   return static_cast<Expression*>(
1142     Builder(*(Module*)module)
1143       .makeAtomicStore(
1144         bytes, offset, (Expression*)ptr, (Expression*)value, Type(type)));
1145 }
BinaryenAtomicRMW(BinaryenModuleRef module,BinaryenOp op,BinaryenIndex bytes,BinaryenIndex offset,BinaryenExpressionRef ptr,BinaryenExpressionRef value,BinaryenType type)1146 BinaryenExpressionRef BinaryenAtomicRMW(BinaryenModuleRef module,
1147                                         BinaryenOp op,
1148                                         BinaryenIndex bytes,
1149                                         BinaryenIndex offset,
1150                                         BinaryenExpressionRef ptr,
1151                                         BinaryenExpressionRef value,
1152                                         BinaryenType type) {
1153   return static_cast<Expression*>(Builder(*(Module*)module)
1154                                     .makeAtomicRMW(AtomicRMWOp(op),
1155                                                    bytes,
1156                                                    offset,
1157                                                    (Expression*)ptr,
1158                                                    (Expression*)value,
1159                                                    Type(type)));
1160 }
BinaryenAtomicCmpxchg(BinaryenModuleRef module,BinaryenIndex bytes,BinaryenIndex offset,BinaryenExpressionRef ptr,BinaryenExpressionRef expected,BinaryenExpressionRef replacement,BinaryenType type)1161 BinaryenExpressionRef BinaryenAtomicCmpxchg(BinaryenModuleRef module,
1162                                             BinaryenIndex bytes,
1163                                             BinaryenIndex offset,
1164                                             BinaryenExpressionRef ptr,
1165                                             BinaryenExpressionRef expected,
1166                                             BinaryenExpressionRef replacement,
1167                                             BinaryenType type) {
1168   return static_cast<Expression*>(Builder(*(Module*)module)
1169                                     .makeAtomicCmpxchg(bytes,
1170                                                        offset,
1171                                                        (Expression*)ptr,
1172                                                        (Expression*)expected,
1173                                                        (Expression*)replacement,
1174                                                        Type(type)));
1175 }
BinaryenAtomicWait(BinaryenModuleRef module,BinaryenExpressionRef ptr,BinaryenExpressionRef expected,BinaryenExpressionRef timeout,BinaryenType expectedType)1176 BinaryenExpressionRef BinaryenAtomicWait(BinaryenModuleRef module,
1177                                          BinaryenExpressionRef ptr,
1178                                          BinaryenExpressionRef expected,
1179                                          BinaryenExpressionRef timeout,
1180                                          BinaryenType expectedType) {
1181   return static_cast<Expression*>(Builder(*(Module*)module)
1182                                     .makeAtomicWait((Expression*)ptr,
1183                                                     (Expression*)expected,
1184                                                     (Expression*)timeout,
1185                                                     Type(expectedType),
1186                                                     0));
1187 }
BinaryenAtomicNotify(BinaryenModuleRef module,BinaryenExpressionRef ptr,BinaryenExpressionRef notifyCount)1188 BinaryenExpressionRef BinaryenAtomicNotify(BinaryenModuleRef module,
1189                                            BinaryenExpressionRef ptr,
1190                                            BinaryenExpressionRef notifyCount) {
1191   return static_cast<Expression*>(
1192     Builder(*(Module*)module)
1193       .makeAtomicNotify((Expression*)ptr, (Expression*)notifyCount, 0));
1194 }
BinaryenAtomicFence(BinaryenModuleRef module)1195 BinaryenExpressionRef BinaryenAtomicFence(BinaryenModuleRef module) {
1196   return static_cast<Expression*>(Builder(*(Module*)module).makeAtomicFence());
1197 }
BinaryenSIMDExtract(BinaryenModuleRef module,BinaryenOp op,BinaryenExpressionRef vec,uint8_t index)1198 BinaryenExpressionRef BinaryenSIMDExtract(BinaryenModuleRef module,
1199                                           BinaryenOp op,
1200                                           BinaryenExpressionRef vec,
1201                                           uint8_t index) {
1202   return static_cast<Expression*>(
1203     Builder(*(Module*)module)
1204       .makeSIMDExtract(SIMDExtractOp(op), (Expression*)vec, index));
1205 }
BinaryenSIMDReplace(BinaryenModuleRef module,BinaryenOp op,BinaryenExpressionRef vec,uint8_t index,BinaryenExpressionRef value)1206 BinaryenExpressionRef BinaryenSIMDReplace(BinaryenModuleRef module,
1207                                           BinaryenOp op,
1208                                           BinaryenExpressionRef vec,
1209                                           uint8_t index,
1210                                           BinaryenExpressionRef value) {
1211   return static_cast<Expression*>(
1212     Builder(*(Module*)module)
1213       .makeSIMDReplace(
1214         SIMDReplaceOp(op), (Expression*)vec, index, (Expression*)value));
1215 }
BinaryenSIMDShuffle(BinaryenModuleRef module,BinaryenExpressionRef left,BinaryenExpressionRef right,const uint8_t mask_[16])1216 BinaryenExpressionRef BinaryenSIMDShuffle(BinaryenModuleRef module,
1217                                           BinaryenExpressionRef left,
1218                                           BinaryenExpressionRef right,
1219                                           const uint8_t mask_[16]) {
1220   assert(mask_); // nullptr would be wrong
1221   std::array<uint8_t, 16> mask;
1222   memcpy(mask.data(), mask_, 16);
1223   return static_cast<Expression*>(
1224     Builder(*(Module*)module)
1225       .makeSIMDShuffle((Expression*)left, (Expression*)right, mask));
1226 }
BinaryenSIMDTernary(BinaryenModuleRef module,BinaryenOp op,BinaryenExpressionRef a,BinaryenExpressionRef b,BinaryenExpressionRef c)1227 BinaryenExpressionRef BinaryenSIMDTernary(BinaryenModuleRef module,
1228                                           BinaryenOp op,
1229                                           BinaryenExpressionRef a,
1230                                           BinaryenExpressionRef b,
1231                                           BinaryenExpressionRef c) {
1232   return static_cast<Expression*>(
1233     Builder(*(Module*)module)
1234       .makeSIMDTernary(
1235         SIMDTernaryOp(op), (Expression*)a, (Expression*)b, (Expression*)c));
1236 }
BinaryenSIMDShift(BinaryenModuleRef module,BinaryenOp op,BinaryenExpressionRef vec,BinaryenExpressionRef shift)1237 BinaryenExpressionRef BinaryenSIMDShift(BinaryenModuleRef module,
1238                                         BinaryenOp op,
1239                                         BinaryenExpressionRef vec,
1240                                         BinaryenExpressionRef shift) {
1241   return static_cast<Expression*>(
1242     Builder(*(Module*)module)
1243       .makeSIMDShift(SIMDShiftOp(op), (Expression*)vec, (Expression*)shift));
1244 }
BinaryenSIMDLoad(BinaryenModuleRef module,BinaryenOp op,uint32_t offset,uint32_t align,BinaryenExpressionRef ptr)1245 BinaryenExpressionRef BinaryenSIMDLoad(BinaryenModuleRef module,
1246                                        BinaryenOp op,
1247                                        uint32_t offset,
1248                                        uint32_t align,
1249                                        BinaryenExpressionRef ptr) {
1250   return static_cast<Expression*>(
1251     Builder(*(Module*)module)
1252       .makeSIMDLoad(
1253         SIMDLoadOp(op), Address(offset), Address(align), (Expression*)ptr));
1254 }
BinaryenMemoryInit(BinaryenModuleRef module,uint32_t segment,BinaryenExpressionRef dest,BinaryenExpressionRef offset,BinaryenExpressionRef size)1255 BinaryenExpressionRef BinaryenMemoryInit(BinaryenModuleRef module,
1256                                          uint32_t segment,
1257                                          BinaryenExpressionRef dest,
1258                                          BinaryenExpressionRef offset,
1259                                          BinaryenExpressionRef size) {
1260   return static_cast<Expression*>(
1261     Builder(*(Module*)module)
1262       .makeMemoryInit(
1263         segment, (Expression*)dest, (Expression*)offset, (Expression*)size));
1264 }
1265 
BinaryenDataDrop(BinaryenModuleRef module,uint32_t segment)1266 BinaryenExpressionRef BinaryenDataDrop(BinaryenModuleRef module,
1267                                        uint32_t segment) {
1268   return static_cast<Expression*>(
1269     Builder(*(Module*)module).makeDataDrop(segment));
1270 }
1271 
BinaryenMemoryCopy(BinaryenModuleRef module,BinaryenExpressionRef dest,BinaryenExpressionRef source,BinaryenExpressionRef size)1272 BinaryenExpressionRef BinaryenMemoryCopy(BinaryenModuleRef module,
1273                                          BinaryenExpressionRef dest,
1274                                          BinaryenExpressionRef source,
1275                                          BinaryenExpressionRef size) {
1276   return static_cast<Expression*>(Builder(*(Module*)module)
1277                                     .makeMemoryCopy((Expression*)dest,
1278                                                     (Expression*)source,
1279                                                     (Expression*)size));
1280 }
1281 
BinaryenMemoryFill(BinaryenModuleRef module,BinaryenExpressionRef dest,BinaryenExpressionRef value,BinaryenExpressionRef size)1282 BinaryenExpressionRef BinaryenMemoryFill(BinaryenModuleRef module,
1283                                          BinaryenExpressionRef dest,
1284                                          BinaryenExpressionRef value,
1285                                          BinaryenExpressionRef size) {
1286   return static_cast<Expression*>(Builder(*(Module*)module)
1287                                     .makeMemoryFill((Expression*)dest,
1288                                                     (Expression*)value,
1289                                                     (Expression*)size));
1290 }
1291 
BinaryenTupleMake(BinaryenModuleRef module,BinaryenExpressionRef * operands,BinaryenIndex numOperands)1292 BinaryenExpressionRef BinaryenTupleMake(BinaryenModuleRef module,
1293                                         BinaryenExpressionRef* operands,
1294                                         BinaryenIndex numOperands) {
1295   std::vector<Expression*> ops;
1296   ops.resize(numOperands);
1297   for (size_t i = 0; i < numOperands; ++i) {
1298     ops[i] = (Expression*)operands[i];
1299   }
1300   return static_cast<Expression*>(Builder(*(Module*)module).makeTupleMake(ops));
1301 }
1302 
BinaryenTupleExtract(BinaryenModuleRef module,BinaryenExpressionRef tuple,BinaryenIndex index)1303 BinaryenExpressionRef BinaryenTupleExtract(BinaryenModuleRef module,
1304                                            BinaryenExpressionRef tuple,
1305                                            BinaryenIndex index) {
1306   return static_cast<Expression*>(
1307     Builder(*(Module*)module).makeTupleExtract((Expression*)tuple, index));
1308 }
1309 
BinaryenPop(BinaryenModuleRef module,BinaryenType type)1310 BinaryenExpressionRef BinaryenPop(BinaryenModuleRef module, BinaryenType type) {
1311   return static_cast<Expression*>(
1312     Builder(*(Module*)module).makePop(Type(type)));
1313 }
1314 
BinaryenRefNull(BinaryenModuleRef module,BinaryenType type)1315 BinaryenExpressionRef BinaryenRefNull(BinaryenModuleRef module,
1316                                       BinaryenType type) {
1317   Type type_(type);
1318   assert(type_.isNullable());
1319   return static_cast<Expression*>(Builder(*(Module*)module).makeRefNull(type_));
1320 }
1321 
BinaryenRefIsNull(BinaryenModuleRef module,BinaryenExpressionRef value)1322 BinaryenExpressionRef BinaryenRefIsNull(BinaryenModuleRef module,
1323                                         BinaryenExpressionRef value) {
1324   return static_cast<Expression*>(
1325     Builder(*(Module*)module).makeRefIsNull((Expression*)value));
1326 }
1327 
BinaryenRefFunc(BinaryenModuleRef module,const char * func)1328 BinaryenExpressionRef BinaryenRefFunc(BinaryenModuleRef module,
1329                                       const char* func) {
1330   return static_cast<Expression*>(Builder(*(Module*)module).makeRefFunc(func));
1331 }
1332 
BinaryenRefEq(BinaryenModuleRef module,BinaryenExpressionRef left,BinaryenExpressionRef right)1333 BinaryenExpressionRef BinaryenRefEq(BinaryenModuleRef module,
1334                                     BinaryenExpressionRef left,
1335                                     BinaryenExpressionRef right) {
1336   return static_cast<Expression*>(
1337     Builder(*(Module*)module).makeRefEq((Expression*)left, (Expression*)right));
1338 }
1339 
BinaryenTry(BinaryenModuleRef module,BinaryenExpressionRef body,BinaryenExpressionRef catchBody)1340 BinaryenExpressionRef BinaryenTry(BinaryenModuleRef module,
1341                                   BinaryenExpressionRef body,
1342                                   BinaryenExpressionRef catchBody) {
1343   return static_cast<Expression*>(
1344     Builder(*(Module*)module)
1345       .makeTry((Expression*)body, (Expression*)catchBody));
1346 }
1347 
BinaryenThrow(BinaryenModuleRef module,const char * event,BinaryenExpressionRef * operands,BinaryenIndex numOperands)1348 BinaryenExpressionRef BinaryenThrow(BinaryenModuleRef module,
1349                                     const char* event,
1350                                     BinaryenExpressionRef* operands,
1351                                     BinaryenIndex numOperands) {
1352   std::vector<Expression*> args;
1353   for (BinaryenIndex i = 0; i < numOperands; i++) {
1354     args.push_back((Expression*)operands[i]);
1355   }
1356   return static_cast<Expression*>(
1357     Builder(*(Module*)module).makeThrow(event, args));
1358 }
1359 
BinaryenRethrow(BinaryenModuleRef module,BinaryenExpressionRef exnref)1360 BinaryenExpressionRef BinaryenRethrow(BinaryenModuleRef module,
1361                                       BinaryenExpressionRef exnref) {
1362   return static_cast<Expression*>(
1363     Builder(*(Module*)module).makeRethrow((Expression*)exnref));
1364 }
1365 
BinaryenBrOnExn(BinaryenModuleRef module,const char * name,const char * eventName,BinaryenExpressionRef exnref)1366 BinaryenExpressionRef BinaryenBrOnExn(BinaryenModuleRef module,
1367                                       const char* name,
1368                                       const char* eventName,
1369                                       BinaryenExpressionRef exnref) {
1370   auto* wasm = (Module*)module;
1371   auto* event = wasm->getEventOrNull(eventName);
1372   assert(event && "br_on_exn's event must exist");
1373   return static_cast<Expression*>(
1374     Builder(*wasm).makeBrOnExn(name, event, (Expression*)exnref));
1375 }
1376 
BinaryenI31New(BinaryenModuleRef module,BinaryenExpressionRef value)1377 BinaryenExpressionRef BinaryenI31New(BinaryenModuleRef module,
1378                                      BinaryenExpressionRef value) {
1379   return static_cast<Expression*>(
1380     Builder(*(Module*)module).makeI31New((Expression*)value));
1381 }
1382 
BinaryenI31Get(BinaryenModuleRef module,BinaryenExpressionRef i31,int signed_)1383 BinaryenExpressionRef BinaryenI31Get(BinaryenModuleRef module,
1384                                      BinaryenExpressionRef i31,
1385                                      int signed_) {
1386   return static_cast<Expression*>(
1387     Builder(*(Module*)module).makeI31Get((Expression*)i31, signed_ != 0));
1388 }
1389 
1390 // TODO (gc): ref.test
1391 // TODO (gc): ref.cast
1392 // TODO (gc): br_on_cast
1393 // TODO (gc): rtt.canon
1394 // TODO (gc): rtt.sub
1395 // TODO (gc): struct.new
1396 // TODO (gc): struct.get
1397 // TODO (gc): struct.set
1398 // TODO (gc): array.new
1399 // TODO (gc): array.get
1400 // TODO (gc): array.set
1401 // TODO (gc): array.len
1402 
1403 // Expression utility
1404 
BinaryenExpressionGetId(BinaryenExpressionRef expr)1405 BinaryenExpressionId BinaryenExpressionGetId(BinaryenExpressionRef expr) {
1406   return ((Expression*)expr)->_id;
1407 }
BinaryenExpressionGetType(BinaryenExpressionRef expr)1408 BinaryenType BinaryenExpressionGetType(BinaryenExpressionRef expr) {
1409   return ((Expression*)expr)->type.getID();
1410 }
BinaryenExpressionSetType(BinaryenExpressionRef expr,BinaryenType type)1411 void BinaryenExpressionSetType(BinaryenExpressionRef expr, BinaryenType type) {
1412   ((Expression*)expr)->type = Type(type);
1413 }
BinaryenExpressionPrint(BinaryenExpressionRef expr)1414 void BinaryenExpressionPrint(BinaryenExpressionRef expr) {
1415   WasmPrinter::printExpression((Expression*)expr, std::cout);
1416   std::cout << '\n';
1417 }
BinaryenExpressionFinalize(BinaryenExpressionRef expr)1418 void BinaryenExpressionFinalize(BinaryenExpressionRef expr) {
1419   ReFinalizeNode().visit((Expression*)expr);
1420 }
1421 
BinaryenExpressionCopy(BinaryenExpressionRef expr,BinaryenModuleRef module)1422 BinaryenExpressionRef BinaryenExpressionCopy(BinaryenExpressionRef expr,
1423                                              BinaryenModuleRef module) {
1424   return ExpressionManipulator::copy(expr, *(Module*)module);
1425 }
1426 
1427 // Specific expression utility
1428 
1429 // Block
BinaryenBlockGetName(BinaryenExpressionRef expr)1430 const char* BinaryenBlockGetName(BinaryenExpressionRef expr) {
1431   auto* expression = (Expression*)expr;
1432   assert(expression->is<Block>());
1433   return static_cast<Block*>(expression)->name.c_str();
1434 }
BinaryenBlockSetName(BinaryenExpressionRef expr,const char * name)1435 void BinaryenBlockSetName(BinaryenExpressionRef expr, const char* name) {
1436   auto* expression = (Expression*)expr;
1437   assert(expression->is<Block>());
1438   // may be null or empty
1439   static_cast<Block*>(expression)->name = name;
1440 }
BinaryenBlockGetNumChildren(BinaryenExpressionRef expr)1441 BinaryenIndex BinaryenBlockGetNumChildren(BinaryenExpressionRef expr) {
1442   auto* expression = (Expression*)expr;
1443   assert(expression->is<Block>());
1444   return static_cast<Block*>(expression)->list.size();
1445 }
BinaryenBlockGetChildAt(BinaryenExpressionRef expr,BinaryenIndex index)1446 BinaryenExpressionRef BinaryenBlockGetChildAt(BinaryenExpressionRef expr,
1447                                               BinaryenIndex index) {
1448   auto* expression = (Expression*)expr;
1449   assert(expression->is<Block>());
1450   assert(index < static_cast<Block*>(expression)->list.size());
1451   return static_cast<Block*>(expression)->list[index];
1452 }
BinaryenBlockSetChildAt(BinaryenExpressionRef expr,BinaryenIndex index,BinaryenExpressionRef childExpr)1453 void BinaryenBlockSetChildAt(BinaryenExpressionRef expr,
1454                              BinaryenIndex index,
1455                              BinaryenExpressionRef childExpr) {
1456   auto* expression = (Expression*)expr;
1457   assert(expression->is<Block>());
1458   assert(childExpr);
1459   auto& list = static_cast<Block*>(expression)->list;
1460   assert(index < list.size());
1461   list[index] = (Expression*)childExpr;
1462 }
BinaryenBlockAppendChild(BinaryenExpressionRef expr,BinaryenExpressionRef childExpr)1463 BinaryenIndex BinaryenBlockAppendChild(BinaryenExpressionRef expr,
1464                                        BinaryenExpressionRef childExpr) {
1465   auto* expression = (Expression*)expr;
1466   assert(expression->is<Block>());
1467   assert(childExpr);
1468   auto& list = static_cast<Block*>(expression)->list;
1469   auto index = list.size();
1470   list.push_back((Expression*)childExpr);
1471   return index;
1472 }
BinaryenBlockInsertChildAt(BinaryenExpressionRef expr,BinaryenIndex index,BinaryenExpressionRef childExpr)1473 void BinaryenBlockInsertChildAt(BinaryenExpressionRef expr,
1474                                 BinaryenIndex index,
1475                                 BinaryenExpressionRef childExpr) {
1476   auto* expression = (Expression*)expr;
1477   assert(expression->is<Block>());
1478   assert(childExpr);
1479   static_cast<Block*>(expression)->list.insertAt(index, (Expression*)childExpr);
1480 }
BinaryenBlockRemoveChildAt(BinaryenExpressionRef expr,BinaryenIndex index)1481 BinaryenExpressionRef BinaryenBlockRemoveChildAt(BinaryenExpressionRef expr,
1482                                                  BinaryenIndex index) {
1483   auto* expression = (Expression*)expr;
1484   assert(expression->is<Block>());
1485   return static_cast<Block*>(expression)->list.removeAt(index);
1486 }
1487 // If
BinaryenIfGetCondition(BinaryenExpressionRef expr)1488 BinaryenExpressionRef BinaryenIfGetCondition(BinaryenExpressionRef expr) {
1489   auto* expression = (Expression*)expr;
1490   assert(expression->is<If>());
1491   return static_cast<If*>(expression)->condition;
1492 }
BinaryenIfSetCondition(BinaryenExpressionRef expr,BinaryenExpressionRef condExpr)1493 void BinaryenIfSetCondition(BinaryenExpressionRef expr,
1494                             BinaryenExpressionRef condExpr) {
1495   auto* expression = (Expression*)expr;
1496   assert(expression->is<If>());
1497   assert(condExpr);
1498   static_cast<If*>(expression)->condition = (Expression*)condExpr;
1499 }
BinaryenIfGetIfTrue(BinaryenExpressionRef expr)1500 BinaryenExpressionRef BinaryenIfGetIfTrue(BinaryenExpressionRef expr) {
1501   auto* expression = (Expression*)expr;
1502   assert(expression->is<If>());
1503   return static_cast<If*>(expression)->ifTrue;
1504 }
BinaryenIfSetIfTrue(BinaryenExpressionRef expr,BinaryenExpressionRef ifTrueExpr)1505 void BinaryenIfSetIfTrue(BinaryenExpressionRef expr,
1506                          BinaryenExpressionRef ifTrueExpr) {
1507   auto* expression = (Expression*)expr;
1508   assert(expression->is<If>());
1509   assert(ifTrueExpr);
1510   static_cast<If*>(expression)->ifTrue = (Expression*)ifTrueExpr;
1511 }
BinaryenIfGetIfFalse(BinaryenExpressionRef expr)1512 BinaryenExpressionRef BinaryenIfGetIfFalse(BinaryenExpressionRef expr) {
1513   auto* expression = (Expression*)expr;
1514   assert(expression->is<If>());
1515   return static_cast<If*>(expression)->ifFalse;
1516 }
BinaryenIfSetIfFalse(BinaryenExpressionRef expr,BinaryenExpressionRef ifFalseExpr)1517 void BinaryenIfSetIfFalse(BinaryenExpressionRef expr,
1518                           BinaryenExpressionRef ifFalseExpr) {
1519   auto* expression = (Expression*)expr;
1520   assert(expression->is<If>());
1521   // may be null
1522   static_cast<If*>(expression)->ifFalse = (Expression*)ifFalseExpr;
1523 }
1524 // Loop
BinaryenLoopGetName(BinaryenExpressionRef expr)1525 const char* BinaryenLoopGetName(BinaryenExpressionRef expr) {
1526   auto* expression = (Expression*)expr;
1527   assert(expression->is<Loop>());
1528   return static_cast<Loop*>(expression)->name.c_str();
1529 }
BinaryenLoopSetName(BinaryenExpressionRef expr,const char * name)1530 void BinaryenLoopSetName(BinaryenExpressionRef expr, const char* name) {
1531   auto* expression = (Expression*)expr;
1532   assert(expression->is<Loop>());
1533   // may be null or empty
1534   static_cast<Loop*>(expression)->name = name;
1535 }
BinaryenLoopGetBody(BinaryenExpressionRef expr)1536 BinaryenExpressionRef BinaryenLoopGetBody(BinaryenExpressionRef expr) {
1537   auto* expression = (Expression*)expr;
1538   assert(expression->is<Loop>());
1539   return static_cast<Loop*>(expression)->body;
1540 }
BinaryenLoopSetBody(BinaryenExpressionRef expr,BinaryenExpressionRef bodyExpr)1541 void BinaryenLoopSetBody(BinaryenExpressionRef expr,
1542                          BinaryenExpressionRef bodyExpr) {
1543   auto* expression = (Expression*)expr;
1544   assert(expression->is<Loop>());
1545   assert(bodyExpr);
1546   static_cast<Loop*>(expression)->body = (Expression*)bodyExpr;
1547 }
1548 // Break
BinaryenBreakGetName(BinaryenExpressionRef expr)1549 const char* BinaryenBreakGetName(BinaryenExpressionRef expr) {
1550   auto* expression = (Expression*)expr;
1551   assert(expression->is<Break>());
1552   return static_cast<Break*>(expression)->name.c_str();
1553 }
BinaryenBreakSetName(BinaryenExpressionRef expr,const char * name)1554 void BinaryenBreakSetName(BinaryenExpressionRef expr, const char* name) {
1555   auto* expression = (Expression*)expr;
1556   assert(expression->is<Break>());
1557   assert(name);
1558   static_cast<Break*>(expression)->name = name;
1559 }
BinaryenBreakGetCondition(BinaryenExpressionRef expr)1560 BinaryenExpressionRef BinaryenBreakGetCondition(BinaryenExpressionRef expr) {
1561   auto* expression = (Expression*)expr;
1562   assert(expression->is<Break>());
1563   return static_cast<Break*>(expression)->condition;
1564 }
BinaryenBreakSetCondition(BinaryenExpressionRef expr,BinaryenExpressionRef condExpr)1565 void BinaryenBreakSetCondition(BinaryenExpressionRef expr,
1566                                BinaryenExpressionRef condExpr) {
1567   auto* expression = (Expression*)expr;
1568   assert(expression->is<Break>());
1569   // may be null (br)
1570   static_cast<Break*>(expression)->condition = (Expression*)condExpr;
1571 }
BinaryenBreakGetValue(BinaryenExpressionRef expr)1572 BinaryenExpressionRef BinaryenBreakGetValue(BinaryenExpressionRef expr) {
1573   auto* expression = (Expression*)expr;
1574   assert(expression->is<Break>());
1575   return static_cast<Break*>(expression)->value;
1576 }
BinaryenBreakSetValue(BinaryenExpressionRef expr,BinaryenExpressionRef valueExpr)1577 void BinaryenBreakSetValue(BinaryenExpressionRef expr,
1578                            BinaryenExpressionRef valueExpr) {
1579   auto* expression = (Expression*)expr;
1580   assert(expression->is<Break>());
1581   // may be null
1582   static_cast<Break*>(expression)->value = (Expression*)valueExpr;
1583 }
1584 // Switch
BinaryenSwitchGetNumNames(BinaryenExpressionRef expr)1585 BinaryenIndex BinaryenSwitchGetNumNames(BinaryenExpressionRef expr) {
1586   auto* expression = (Expression*)expr;
1587   assert(expression->is<Switch>());
1588   return static_cast<Switch*>(expression)->targets.size();
1589 }
BinaryenSwitchGetNameAt(BinaryenExpressionRef expr,BinaryenIndex index)1590 const char* BinaryenSwitchGetNameAt(BinaryenExpressionRef expr,
1591                                     BinaryenIndex index) {
1592   auto* expression = (Expression*)expr;
1593   assert(expression->is<Switch>());
1594   assert(index < static_cast<Switch*>(expression)->targets.size());
1595   return static_cast<Switch*>(expression)->targets[index].c_str();
1596 }
BinaryenSwitchSetNameAt(BinaryenExpressionRef expr,BinaryenIndex index,const char * name)1597 void BinaryenSwitchSetNameAt(BinaryenExpressionRef expr,
1598                              BinaryenIndex index,
1599                              const char* name) {
1600   auto* expression = (Expression*)expr;
1601   assert(expression->is<Switch>());
1602   assert(index < static_cast<Switch*>(expression)->targets.size());
1603   assert(name);
1604   static_cast<Switch*>(expression)->targets[index] = name;
1605 }
BinaryenSwitchAppendName(BinaryenExpressionRef expr,const char * name)1606 BinaryenIndex BinaryenSwitchAppendName(BinaryenExpressionRef expr,
1607                                        const char* name) {
1608   auto* expression = (Expression*)expr;
1609   assert(expression->is<Switch>());
1610   assert(name);
1611   auto& list = static_cast<Switch*>(expression)->targets;
1612   auto index = list.size();
1613   list.push_back(name);
1614   return index;
1615 }
BinaryenSwitchInsertNameAt(BinaryenExpressionRef expr,BinaryenIndex index,const char * name)1616 void BinaryenSwitchInsertNameAt(BinaryenExpressionRef expr,
1617                                 BinaryenIndex index,
1618                                 const char* name) {
1619   auto* expression = (Expression*)expr;
1620   assert(expression->is<Switch>());
1621   assert(name);
1622   static_cast<Switch*>(expression)->targets.insertAt(index, name);
1623 }
BinaryenSwitchRemoveNameAt(BinaryenExpressionRef expr,BinaryenIndex index)1624 const char* BinaryenSwitchRemoveNameAt(BinaryenExpressionRef expr,
1625                                        BinaryenIndex index) {
1626   auto* expression = (Expression*)expr;
1627   assert(expression->is<Switch>());
1628   return static_cast<Switch*>(expression)->targets.removeAt(index).c_str();
1629 }
BinaryenSwitchGetDefaultName(BinaryenExpressionRef expr)1630 const char* BinaryenSwitchGetDefaultName(BinaryenExpressionRef expr) {
1631   auto* expression = (Expression*)expr;
1632   assert(expression->is<Switch>());
1633   return static_cast<Switch*>(expression)->default_.c_str();
1634 }
BinaryenSwitchSetDefaultName(BinaryenExpressionRef expr,const char * name)1635 void BinaryenSwitchSetDefaultName(BinaryenExpressionRef expr,
1636                                   const char* name) {
1637   auto* expression = (Expression*)expr;
1638   assert(expression->is<Switch>());
1639   // may be null or empty
1640   static_cast<Switch*>(expression)->default_ = name;
1641 }
BinaryenSwitchGetCondition(BinaryenExpressionRef expr)1642 BinaryenExpressionRef BinaryenSwitchGetCondition(BinaryenExpressionRef expr) {
1643   auto* expression = (Expression*)expr;
1644   assert(expression->is<Switch>());
1645   return static_cast<Switch*>(expression)->condition;
1646 }
BinaryenSwitchSetCondition(BinaryenExpressionRef expr,BinaryenExpressionRef condExpr)1647 void BinaryenSwitchSetCondition(BinaryenExpressionRef expr,
1648                                 BinaryenExpressionRef condExpr) {
1649   auto* expression = (Expression*)expr;
1650   assert(expression->is<Switch>());
1651   assert(condExpr);
1652   static_cast<Switch*>(expression)->condition = (Expression*)condExpr;
1653 }
BinaryenSwitchGetValue(BinaryenExpressionRef expr)1654 BinaryenExpressionRef BinaryenSwitchGetValue(BinaryenExpressionRef expr) {
1655   auto* expression = (Expression*)expr;
1656   assert(expression->is<Switch>());
1657   return static_cast<Switch*>(expression)->value;
1658 }
BinaryenSwitchSetValue(BinaryenExpressionRef expr,BinaryenExpressionRef valueExpr)1659 void BinaryenSwitchSetValue(BinaryenExpressionRef expr,
1660                             BinaryenExpressionRef valueExpr) {
1661   auto* expression = (Expression*)expr;
1662   assert(expression->is<Switch>());
1663   // may be null
1664   static_cast<Switch*>(expression)->value = (Expression*)valueExpr;
1665 }
1666 // Call
BinaryenCallGetTarget(BinaryenExpressionRef expr)1667 const char* BinaryenCallGetTarget(BinaryenExpressionRef expr) {
1668   auto* expression = (Expression*)expr;
1669   assert(expression->is<Call>());
1670   return static_cast<Call*>(expression)->target.c_str();
1671 }
BinaryenCallSetTarget(BinaryenExpressionRef expr,const char * target)1672 void BinaryenCallSetTarget(BinaryenExpressionRef expr, const char* target) {
1673   auto* expression = (Expression*)expr;
1674   assert(expression->is<Call>());
1675   assert(target);
1676   static_cast<Call*>(expression)->target = target;
1677 }
BinaryenCallGetNumOperands(BinaryenExpressionRef expr)1678 BinaryenIndex BinaryenCallGetNumOperands(BinaryenExpressionRef expr) {
1679   auto* expression = (Expression*)expr;
1680   assert(expression->is<Call>());
1681   return static_cast<Call*>(expression)->operands.size();
1682 }
BinaryenCallGetOperandAt(BinaryenExpressionRef expr,BinaryenIndex index)1683 BinaryenExpressionRef BinaryenCallGetOperandAt(BinaryenExpressionRef expr,
1684                                                BinaryenIndex index) {
1685   auto* expression = (Expression*)expr;
1686   assert(expression->is<Call>());
1687   assert(index < static_cast<Call*>(expression)->operands.size());
1688   return static_cast<Call*>(expression)->operands[index];
1689 }
BinaryenCallSetOperandAt(BinaryenExpressionRef expr,BinaryenIndex index,BinaryenExpressionRef operandExpr)1690 void BinaryenCallSetOperandAt(BinaryenExpressionRef expr,
1691                               BinaryenIndex index,
1692                               BinaryenExpressionRef operandExpr) {
1693   auto* expression = (Expression*)expr;
1694   assert(expression->is<Call>());
1695   assert(index < static_cast<Call*>(expression)->operands.size());
1696   assert(operandExpr);
1697   static_cast<Call*>(expression)->operands[index] = (Expression*)operandExpr;
1698 }
BinaryenCallAppendOperand(BinaryenExpressionRef expr,BinaryenExpressionRef operandExpr)1699 BinaryenIndex BinaryenCallAppendOperand(BinaryenExpressionRef expr,
1700                                         BinaryenExpressionRef operandExpr) {
1701   auto* expression = (Expression*)expr;
1702   assert(expression->is<Call>());
1703   assert(operandExpr);
1704   auto& list = static_cast<Call*>(expression)->operands;
1705   auto index = list.size();
1706   list.push_back((Expression*)operandExpr);
1707   return index;
1708 }
BinaryenCallInsertOperandAt(BinaryenExpressionRef expr,BinaryenIndex index,BinaryenExpressionRef operandExpr)1709 void BinaryenCallInsertOperandAt(BinaryenExpressionRef expr,
1710                                  BinaryenIndex index,
1711                                  BinaryenExpressionRef operandExpr) {
1712   auto* expression = (Expression*)expr;
1713   assert(expression->is<Call>());
1714   assert(operandExpr);
1715   static_cast<Call*>(expression)
1716     ->operands.insertAt(index, (Expression*)operandExpr);
1717 }
BinaryenCallRemoveOperandAt(BinaryenExpressionRef expr,BinaryenIndex index)1718 BinaryenExpressionRef BinaryenCallRemoveOperandAt(BinaryenExpressionRef expr,
1719                                                   BinaryenIndex index) {
1720   auto* expression = (Expression*)expr;
1721   assert(expression->is<Call>());
1722   return static_cast<Call*>(expression)->operands.removeAt(index);
1723 }
BinaryenCallIsReturn(BinaryenExpressionRef expr)1724 int BinaryenCallIsReturn(BinaryenExpressionRef expr) {
1725   auto* expression = (Expression*)expr;
1726   assert(expression->is<Call>());
1727   return static_cast<Call*>(expression)->isReturn;
1728 }
BinaryenCallSetReturn(BinaryenExpressionRef expr,int isReturn)1729 void BinaryenCallSetReturn(BinaryenExpressionRef expr, int isReturn) {
1730   auto* expression = (Expression*)expr;
1731   assert(expression->is<Call>());
1732   static_cast<Call*>(expression)->isReturn = isReturn != 0;
1733 }
1734 // CallIndirect
1735 BinaryenExpressionRef
BinaryenCallIndirectGetTarget(BinaryenExpressionRef expr)1736 BinaryenCallIndirectGetTarget(BinaryenExpressionRef expr) {
1737   auto* expression = (Expression*)expr;
1738   assert(expression->is<CallIndirect>());
1739   return static_cast<CallIndirect*>(expression)->target;
1740 }
BinaryenCallIndirectSetTarget(BinaryenExpressionRef expr,BinaryenExpressionRef targetExpr)1741 void BinaryenCallIndirectSetTarget(BinaryenExpressionRef expr,
1742                                    BinaryenExpressionRef targetExpr) {
1743   auto* expression = (Expression*)expr;
1744   assert(expression->is<CallIndirect>());
1745   assert(targetExpr);
1746   static_cast<CallIndirect*>(expression)->target = (Expression*)targetExpr;
1747 }
BinaryenCallIndirectGetNumOperands(BinaryenExpressionRef expr)1748 BinaryenIndex BinaryenCallIndirectGetNumOperands(BinaryenExpressionRef expr) {
1749   auto* expression = (Expression*)expr;
1750   assert(expression->is<CallIndirect>());
1751   return static_cast<CallIndirect*>(expression)->operands.size();
1752 }
1753 BinaryenExpressionRef
BinaryenCallIndirectGetOperandAt(BinaryenExpressionRef expr,BinaryenIndex index)1754 BinaryenCallIndirectGetOperandAt(BinaryenExpressionRef expr,
1755                                  BinaryenIndex index) {
1756   auto* expression = (Expression*)expr;
1757   assert(expression->is<CallIndirect>());
1758   assert(index < static_cast<CallIndirect*>(expression)->operands.size());
1759   return static_cast<CallIndirect*>(expression)->operands[index];
1760 }
BinaryenCallIndirectSetOperandAt(BinaryenExpressionRef expr,BinaryenIndex index,BinaryenExpressionRef operandExpr)1761 void BinaryenCallIndirectSetOperandAt(BinaryenExpressionRef expr,
1762                                       BinaryenIndex index,
1763                                       BinaryenExpressionRef operandExpr) {
1764   auto* expression = (Expression*)expr;
1765   assert(expression->is<CallIndirect>());
1766   assert(index < static_cast<CallIndirect*>(expression)->operands.size());
1767   assert(operandExpr);
1768   static_cast<CallIndirect*>(expression)->operands[index] =
1769     (Expression*)operandExpr;
1770 }
1771 BinaryenIndex
BinaryenCallIndirectAppendOperand(BinaryenExpressionRef expr,BinaryenExpressionRef operandExpr)1772 BinaryenCallIndirectAppendOperand(BinaryenExpressionRef expr,
1773                                   BinaryenExpressionRef operandExpr) {
1774   auto* expression = (Expression*)expr;
1775   assert(expression->is<CallIndirect>());
1776   assert(operandExpr);
1777   auto& list = static_cast<CallIndirect*>(expression)->operands;
1778   auto index = list.size();
1779   list.push_back((Expression*)operandExpr);
1780   return index;
1781 }
BinaryenCallIndirectInsertOperandAt(BinaryenExpressionRef expr,BinaryenIndex index,BinaryenExpressionRef operandExpr)1782 void BinaryenCallIndirectInsertOperandAt(BinaryenExpressionRef expr,
1783                                          BinaryenIndex index,
1784                                          BinaryenExpressionRef operandExpr) {
1785   auto* expression = (Expression*)expr;
1786   assert(expression->is<CallIndirect>());
1787   assert(operandExpr);
1788   static_cast<CallIndirect*>(expression)
1789     ->operands.insertAt(index, (Expression*)operandExpr);
1790 }
1791 BinaryenExpressionRef
BinaryenCallIndirectRemoveOperandAt(BinaryenExpressionRef expr,BinaryenIndex index)1792 BinaryenCallIndirectRemoveOperandAt(BinaryenExpressionRef expr,
1793                                     BinaryenIndex index) {
1794   auto* expression = (Expression*)expr;
1795   assert(expression->is<CallIndirect>());
1796   return static_cast<CallIndirect*>(expression)->operands.removeAt(index);
1797 }
BinaryenCallIndirectIsReturn(BinaryenExpressionRef expr)1798 int BinaryenCallIndirectIsReturn(BinaryenExpressionRef expr) {
1799   auto* expression = (Expression*)expr;
1800   assert(expression->is<CallIndirect>());
1801   return static_cast<CallIndirect*>(expression)->isReturn;
1802 }
BinaryenCallIndirectSetReturn(BinaryenExpressionRef expr,int isReturn)1803 void BinaryenCallIndirectSetReturn(BinaryenExpressionRef expr, int isReturn) {
1804   auto* expression = (Expression*)expr;
1805   assert(expression->is<CallIndirect>());
1806   static_cast<CallIndirect*>(expression)->isReturn = isReturn != 0;
1807 }
BinaryenCallIndirectGetParams(BinaryenExpressionRef expr)1808 BinaryenType BinaryenCallIndirectGetParams(BinaryenExpressionRef expr) {
1809   auto* expression = (Expression*)expr;
1810   assert(expression->is<CallIndirect>());
1811   return static_cast<CallIndirect*>(expression)->sig.params.getID();
1812 }
BinaryenCallIndirectSetParams(BinaryenExpressionRef expr,BinaryenType params)1813 void BinaryenCallIndirectSetParams(BinaryenExpressionRef expr,
1814                                    BinaryenType params) {
1815   auto* expression = (Expression*)expr;
1816   assert(expression->is<CallIndirect>());
1817   static_cast<CallIndirect*>(expression)->sig.params = Type(params);
1818 }
BinaryenCallIndirectGetResults(BinaryenExpressionRef expr)1819 BinaryenType BinaryenCallIndirectGetResults(BinaryenExpressionRef expr) {
1820   auto* expression = (Expression*)expr;
1821   assert(expression->is<CallIndirect>());
1822   return static_cast<CallIndirect*>(expression)->sig.results.getID();
1823 }
BinaryenCallIndirectSetResults(BinaryenExpressionRef expr,BinaryenType results)1824 void BinaryenCallIndirectSetResults(BinaryenExpressionRef expr,
1825                                     BinaryenType results) {
1826   auto* expression = (Expression*)expr;
1827   assert(expression->is<CallIndirect>());
1828   static_cast<CallIndirect*>(expression)->sig.results = Type(results);
1829 }
1830 // LocalGet
BinaryenLocalGetGetIndex(BinaryenExpressionRef expr)1831 BinaryenIndex BinaryenLocalGetGetIndex(BinaryenExpressionRef expr) {
1832   auto* expression = (Expression*)expr;
1833   assert(expression->is<LocalGet>());
1834   return static_cast<LocalGet*>(expression)->index;
1835 }
BinaryenLocalGetSetIndex(BinaryenExpressionRef expr,BinaryenIndex index)1836 void BinaryenLocalGetSetIndex(BinaryenExpressionRef expr, BinaryenIndex index) {
1837   auto* expression = (Expression*)expr;
1838   assert(expression->is<LocalGet>());
1839   static_cast<LocalGet*>(expression)->index = index;
1840 }
1841 // LocalSet
BinaryenLocalSetIsTee(BinaryenExpressionRef expr)1842 int BinaryenLocalSetIsTee(BinaryenExpressionRef expr) {
1843   auto* expression = (Expression*)expr;
1844   assert(expression->is<LocalSet>());
1845   return static_cast<LocalSet*>(expression)->isTee();
1846   // has no setter
1847 }
BinaryenLocalSetGetIndex(BinaryenExpressionRef expr)1848 BinaryenIndex BinaryenLocalSetGetIndex(BinaryenExpressionRef expr) {
1849   auto* expression = (Expression*)expr;
1850   assert(expression->is<LocalSet>());
1851   return static_cast<LocalSet*>(expression)->index;
1852 }
BinaryenLocalSetSetIndex(BinaryenExpressionRef expr,BinaryenIndex index)1853 void BinaryenLocalSetSetIndex(BinaryenExpressionRef expr, BinaryenIndex index) {
1854   auto* expression = (Expression*)expr;
1855   assert(expression->is<LocalSet>());
1856   static_cast<LocalSet*>(expression)->index = index;
1857 }
BinaryenLocalSetGetValue(BinaryenExpressionRef expr)1858 BinaryenExpressionRef BinaryenLocalSetGetValue(BinaryenExpressionRef expr) {
1859   auto* expression = (Expression*)expr;
1860   assert(expression->is<LocalSet>());
1861   return static_cast<LocalSet*>(expression)->value;
1862 }
BinaryenLocalSetSetValue(BinaryenExpressionRef expr,BinaryenExpressionRef valueExpr)1863 void BinaryenLocalSetSetValue(BinaryenExpressionRef expr,
1864                               BinaryenExpressionRef valueExpr) {
1865   auto* expression = (Expression*)expr;
1866   assert(expression->is<LocalSet>());
1867   assert(valueExpr);
1868   static_cast<LocalSet*>(expression)->value = (Expression*)valueExpr;
1869 }
1870 // GlobalGet
BinaryenGlobalGetGetName(BinaryenExpressionRef expr)1871 const char* BinaryenGlobalGetGetName(BinaryenExpressionRef expr) {
1872   auto* expression = (Expression*)expr;
1873   assert(expression->is<GlobalGet>());
1874   return static_cast<GlobalGet*>(expression)->name.c_str();
1875 }
BinaryenGlobalGetSetName(BinaryenExpressionRef expr,const char * name)1876 void BinaryenGlobalGetSetName(BinaryenExpressionRef expr, const char* name) {
1877   auto* expression = (Expression*)expr;
1878   assert(expression->is<GlobalGet>());
1879   assert(name);
1880   static_cast<GlobalGet*>(expression)->name = name;
1881 }
1882 // GlobalSet
BinaryenGlobalSetGetName(BinaryenExpressionRef expr)1883 const char* BinaryenGlobalSetGetName(BinaryenExpressionRef expr) {
1884   auto* expression = (Expression*)expr;
1885   assert(expression->is<GlobalSet>());
1886   return static_cast<GlobalSet*>(expression)->name.c_str();
1887 }
BinaryenGlobalSetSetName(BinaryenExpressionRef expr,const char * name)1888 void BinaryenGlobalSetSetName(BinaryenExpressionRef expr, const char* name) {
1889   auto* expression = (Expression*)expr;
1890   assert(expression->is<GlobalSet>());
1891   assert(name);
1892   static_cast<GlobalSet*>(expression)->name = name;
1893 }
BinaryenGlobalSetGetValue(BinaryenExpressionRef expr)1894 BinaryenExpressionRef BinaryenGlobalSetGetValue(BinaryenExpressionRef expr) {
1895   auto* expression = (Expression*)expr;
1896   assert(expression->is<GlobalSet>());
1897   return static_cast<GlobalSet*>(expression)->value;
1898 }
BinaryenGlobalSetSetValue(BinaryenExpressionRef expr,BinaryenExpressionRef valueExpr)1899 void BinaryenGlobalSetSetValue(BinaryenExpressionRef expr,
1900                                BinaryenExpressionRef valueExpr) {
1901   auto* expression = (Expression*)expr;
1902   assert(expression->is<GlobalSet>());
1903   assert(valueExpr);
1904   static_cast<GlobalSet*>(expression)->value = (Expression*)valueExpr;
1905 }
1906 // MemoryGrow
BinaryenMemoryGrowGetDelta(BinaryenExpressionRef expr)1907 BinaryenExpressionRef BinaryenMemoryGrowGetDelta(BinaryenExpressionRef expr) {
1908   auto* expression = (Expression*)expr;
1909   assert(expression->is<MemoryGrow>());
1910   return static_cast<MemoryGrow*>(expression)->delta;
1911 }
BinaryenMemoryGrowSetDelta(BinaryenExpressionRef expr,BinaryenExpressionRef deltaExpr)1912 void BinaryenMemoryGrowSetDelta(BinaryenExpressionRef expr,
1913                                 BinaryenExpressionRef deltaExpr) {
1914   auto* expression = (Expression*)expr;
1915   assert(expression->is<MemoryGrow>());
1916   assert(deltaExpr);
1917   static_cast<MemoryGrow*>(expression)->delta = (Expression*)deltaExpr;
1918 }
1919 // Load
BinaryenLoadIsAtomic(BinaryenExpressionRef expr)1920 int BinaryenLoadIsAtomic(BinaryenExpressionRef expr) {
1921   auto* expression = (Expression*)expr;
1922   assert(expression->is<Load>());
1923   return static_cast<Load*>(expression)->isAtomic;
1924 }
BinaryenLoadSetAtomic(BinaryenExpressionRef expr,int isAtomic)1925 void BinaryenLoadSetAtomic(BinaryenExpressionRef expr, int isAtomic) {
1926   auto* expression = (Expression*)expr;
1927   assert(expression->is<Load>());
1928   static_cast<Load*>(expression)->isAtomic = isAtomic != 0;
1929 }
BinaryenLoadIsSigned(BinaryenExpressionRef expr)1930 int BinaryenLoadIsSigned(BinaryenExpressionRef expr) {
1931   auto* expression = (Expression*)expr;
1932   assert(expression->is<Load>());
1933   return static_cast<Load*>(expression)->signed_;
1934 }
BinaryenLoadSetSigned(BinaryenExpressionRef expr,int isSigned)1935 void BinaryenLoadSetSigned(BinaryenExpressionRef expr, int isSigned) {
1936   auto* expression = (Expression*)expr;
1937   assert(expression->is<Load>());
1938   static_cast<Load*>(expression)->signed_ = isSigned != 0;
1939 }
BinaryenLoadGetBytes(BinaryenExpressionRef expr)1940 uint32_t BinaryenLoadGetBytes(BinaryenExpressionRef expr) {
1941   auto* expression = (Expression*)expr;
1942   assert(expression->is<Load>());
1943   return static_cast<Load*>(expression)->bytes;
1944 }
BinaryenLoadSetBytes(BinaryenExpressionRef expr,uint32_t bytes)1945 void BinaryenLoadSetBytes(BinaryenExpressionRef expr, uint32_t bytes) {
1946   auto* expression = (Expression*)expr;
1947   assert(expression->is<Load>());
1948   static_cast<Load*>(expression)->bytes = bytes;
1949 }
BinaryenLoadGetOffset(BinaryenExpressionRef expr)1950 uint32_t BinaryenLoadGetOffset(BinaryenExpressionRef expr) {
1951   auto* expression = (Expression*)expr;
1952   assert(expression->is<Load>());
1953   return static_cast<Load*>(expression)->offset;
1954 }
BinaryenLoadSetOffset(BinaryenExpressionRef expr,uint32_t offset)1955 void BinaryenLoadSetOffset(BinaryenExpressionRef expr, uint32_t offset) {
1956   auto* expression = (Expression*)expr;
1957   assert(expression->is<Load>());
1958   static_cast<Load*>(expression)->offset = offset;
1959 }
BinaryenLoadGetAlign(BinaryenExpressionRef expr)1960 uint32_t BinaryenLoadGetAlign(BinaryenExpressionRef expr) {
1961   auto* expression = (Expression*)expr;
1962   assert(expression->is<Load>());
1963   return static_cast<Load*>(expression)->align;
1964 }
BinaryenLoadSetAlign(BinaryenExpressionRef expr,uint32_t align)1965 void BinaryenLoadSetAlign(BinaryenExpressionRef expr, uint32_t align) {
1966   auto* expression = (Expression*)expr;
1967   assert(expression->is<Load>());
1968   static_cast<Load*>(expression)->align = align;
1969 }
BinaryenLoadGetPtr(BinaryenExpressionRef expr)1970 BinaryenExpressionRef BinaryenLoadGetPtr(BinaryenExpressionRef expr) {
1971   auto* expression = (Expression*)expr;
1972   assert(expression->is<Load>());
1973   return static_cast<Load*>(expression)->ptr;
1974 }
BinaryenLoadSetPtr(BinaryenExpressionRef expr,BinaryenExpressionRef ptrExpr)1975 void BinaryenLoadSetPtr(BinaryenExpressionRef expr,
1976                         BinaryenExpressionRef ptrExpr) {
1977   auto* expression = (Expression*)expr;
1978   assert(expression->is<Load>());
1979   assert(ptrExpr);
1980   static_cast<Load*>(expression)->ptr = (Expression*)ptrExpr;
1981 }
1982 // Store
BinaryenStoreIsAtomic(BinaryenExpressionRef expr)1983 int BinaryenStoreIsAtomic(BinaryenExpressionRef expr) {
1984   auto* expression = (Expression*)expr;
1985   assert(expression->is<Store>());
1986   return static_cast<Store*>(expression)->isAtomic;
1987 }
BinaryenStoreSetAtomic(BinaryenExpressionRef expr,int isAtomic)1988 void BinaryenStoreSetAtomic(BinaryenExpressionRef expr, int isAtomic) {
1989   auto* expression = (Expression*)expr;
1990   assert(expression->is<Store>());
1991   static_cast<Store*>(expression)->isAtomic = isAtomic != 0;
1992 }
BinaryenStoreGetBytes(BinaryenExpressionRef expr)1993 uint32_t BinaryenStoreGetBytes(BinaryenExpressionRef expr) {
1994   auto* expression = (Expression*)expr;
1995   assert(expression->is<Store>());
1996   return static_cast<Store*>(expression)->bytes;
1997 }
BinaryenStoreSetBytes(BinaryenExpressionRef expr,uint32_t bytes)1998 void BinaryenStoreSetBytes(BinaryenExpressionRef expr, uint32_t bytes) {
1999   auto* expression = (Expression*)expr;
2000   assert(expression->is<Store>());
2001   static_cast<Store*>(expression)->bytes = bytes;
2002 }
BinaryenStoreGetOffset(BinaryenExpressionRef expr)2003 uint32_t BinaryenStoreGetOffset(BinaryenExpressionRef expr) {
2004   auto* expression = (Expression*)expr;
2005   assert(expression->is<Store>());
2006   return static_cast<Store*>(expression)->offset;
2007 }
BinaryenStoreSetOffset(BinaryenExpressionRef expr,uint32_t offset)2008 void BinaryenStoreSetOffset(BinaryenExpressionRef expr, uint32_t offset) {
2009   auto* expression = (Expression*)expr;
2010   assert(expression->is<Store>());
2011   static_cast<Store*>(expression)->offset = offset;
2012 }
BinaryenStoreGetAlign(BinaryenExpressionRef expr)2013 uint32_t BinaryenStoreGetAlign(BinaryenExpressionRef expr) {
2014   auto* expression = (Expression*)expr;
2015   assert(expression->is<Store>());
2016   return static_cast<Store*>(expression)->align;
2017 }
BinaryenStoreSetAlign(BinaryenExpressionRef expr,uint32_t align)2018 void BinaryenStoreSetAlign(BinaryenExpressionRef expr, uint32_t align) {
2019   auto* expression = (Expression*)expr;
2020   assert(expression->is<Store>());
2021   static_cast<Store*>(expression)->align = align;
2022 }
BinaryenStoreGetPtr(BinaryenExpressionRef expr)2023 BinaryenExpressionRef BinaryenStoreGetPtr(BinaryenExpressionRef expr) {
2024   auto* expression = (Expression*)expr;
2025   assert(expression->is<Store>());
2026   return static_cast<Store*>(expression)->ptr;
2027 }
BinaryenStoreSetPtr(BinaryenExpressionRef expr,BinaryenExpressionRef ptrExpr)2028 void BinaryenStoreSetPtr(BinaryenExpressionRef expr,
2029                          BinaryenExpressionRef ptrExpr) {
2030   auto* expression = (Expression*)expr;
2031   assert(expression->is<Store>());
2032   assert(ptrExpr);
2033   static_cast<Store*>(expression)->ptr = (Expression*)ptrExpr;
2034 }
BinaryenStoreGetValue(BinaryenExpressionRef expr)2035 BinaryenExpressionRef BinaryenStoreGetValue(BinaryenExpressionRef expr) {
2036   auto* expression = (Expression*)expr;
2037   assert(expression->is<Store>());
2038   return static_cast<Store*>(expression)->value;
2039 }
BinaryenStoreSetValue(BinaryenExpressionRef expr,BinaryenExpressionRef valueExpr)2040 void BinaryenStoreSetValue(BinaryenExpressionRef expr,
2041                            BinaryenExpressionRef valueExpr) {
2042   auto* expression = (Expression*)expr;
2043   assert(expression->is<Store>());
2044   assert(valueExpr);
2045   static_cast<Store*>(expression)->value = (Expression*)valueExpr;
2046 }
BinaryenStoreGetValueType(BinaryenExpressionRef expr)2047 BinaryenType BinaryenStoreGetValueType(BinaryenExpressionRef expr) {
2048   auto* expression = (Expression*)expr;
2049   assert(expression->is<Store>());
2050   return static_cast<Store*>(expression)->valueType.getID();
2051 }
BinaryenStoreSetValueType(BinaryenExpressionRef expr,BinaryenType valueType)2052 void BinaryenStoreSetValueType(BinaryenExpressionRef expr,
2053                                BinaryenType valueType) {
2054   auto* expression = (Expression*)expr;
2055   assert(expression->is<Store>());
2056   static_cast<Store*>(expression)->valueType = Type(valueType);
2057 }
2058 // Const
BinaryenConstGetValueI32(BinaryenExpressionRef expr)2059 int32_t BinaryenConstGetValueI32(BinaryenExpressionRef expr) {
2060   auto* expression = (Expression*)expr;
2061   assert(expression->is<Const>());
2062   return static_cast<Const*>(expression)->value.geti32();
2063 }
BinaryenConstSetValueI32(BinaryenExpressionRef expr,int32_t value)2064 void BinaryenConstSetValueI32(BinaryenExpressionRef expr, int32_t value) {
2065   auto* expression = (Expression*)expr;
2066   assert(expression->is<Const>());
2067   static_cast<Const*>(expression)->value = Literal(value);
2068 }
BinaryenConstGetValueI64(BinaryenExpressionRef expr)2069 int64_t BinaryenConstGetValueI64(BinaryenExpressionRef expr) {
2070   auto* expression = (Expression*)expr;
2071   assert(expression->is<Const>());
2072   return static_cast<Const*>(expression)->value.geti64();
2073 }
BinaryenConstSetValueI64(BinaryenExpressionRef expr,int64_t value)2074 void BinaryenConstSetValueI64(BinaryenExpressionRef expr, int64_t value) {
2075   auto* expression = (Expression*)expr;
2076   assert(expression->is<Const>());
2077   static_cast<Const*>(expression)->value = Literal(value);
2078 }
BinaryenConstGetValueI64Low(BinaryenExpressionRef expr)2079 int32_t BinaryenConstGetValueI64Low(BinaryenExpressionRef expr) {
2080   auto* expression = (Expression*)expr;
2081   assert(expression->is<Const>());
2082   return (int32_t)(static_cast<Const*>(expression)->value.geti64() &
2083                    0xffffffff);
2084 }
BinaryenConstSetValueI64Low(BinaryenExpressionRef expr,int32_t valueLow)2085 void BinaryenConstSetValueI64Low(BinaryenExpressionRef expr, int32_t valueLow) {
2086   auto* expression = (Expression*)expr;
2087   assert(expression->is<Const>());
2088   auto& value = static_cast<Const*>(expression)->value;
2089   int64_t valueI64 = value.type == Type::i64 ? value.geti64() : 0;
2090   static_cast<Const*>(expression)->value =
2091     Literal((valueI64 & ~0xffffffff) | (int64_t(valueLow) & 0xffffffff));
2092 }
BinaryenConstGetValueI64High(BinaryenExpressionRef expr)2093 int32_t BinaryenConstGetValueI64High(BinaryenExpressionRef expr) {
2094   auto* expression = (Expression*)expr;
2095   assert(expression->is<Const>());
2096   return (int32_t)(static_cast<Const*>(expression)->value.geti64() >> 32);
2097 }
BinaryenConstSetValueI64High(BinaryenExpressionRef expr,int32_t valueHigh)2098 void BinaryenConstSetValueI64High(BinaryenExpressionRef expr,
2099                                   int32_t valueHigh) {
2100   auto* expression = (Expression*)expr;
2101   assert(expression->is<Const>());
2102   auto& value = static_cast<Const*>(expression)->value;
2103   int64_t valueI64 = value.type == Type::i64 ? value.geti64() : 0;
2104   static_cast<Const*>(expression)->value =
2105     Literal((int64_t(valueHigh) << 32) | (valueI64 & 0xffffffff));
2106 }
BinaryenConstGetValueF32(BinaryenExpressionRef expr)2107 float BinaryenConstGetValueF32(BinaryenExpressionRef expr) {
2108   auto* expression = (Expression*)expr;
2109   assert(expression->is<Const>());
2110   return static_cast<Const*>(expression)->value.getf32();
2111 }
BinaryenConstSetValueF32(BinaryenExpressionRef expr,float value)2112 void BinaryenConstSetValueF32(BinaryenExpressionRef expr, float value) {
2113   auto* expression = (Expression*)expr;
2114   assert(expression->is<Const>());
2115   static_cast<Const*>(expression)->value = Literal(value);
2116 }
BinaryenConstGetValueF64(BinaryenExpressionRef expr)2117 double BinaryenConstGetValueF64(BinaryenExpressionRef expr) {
2118   auto* expression = (Expression*)expr;
2119   assert(expression->is<Const>());
2120   return static_cast<Const*>(expression)->value.getf64();
2121 }
BinaryenConstSetValueF64(BinaryenExpressionRef expr,double value)2122 void BinaryenConstSetValueF64(BinaryenExpressionRef expr, double value) {
2123   auto* expression = (Expression*)expr;
2124   assert(expression->is<Const>());
2125   static_cast<Const*>(expression)->value = Literal(value);
2126 }
BinaryenConstGetValueV128(BinaryenExpressionRef expr,uint8_t * out)2127 void BinaryenConstGetValueV128(BinaryenExpressionRef expr, uint8_t* out) {
2128   auto* expression = (Expression*)expr;
2129   assert(expression->is<Const>());
2130   memcpy(out, static_cast<Const*>(expression)->value.getv128().data(), 16);
2131 }
BinaryenConstSetValueV128(BinaryenExpressionRef expr,const uint8_t value[16])2132 void BinaryenConstSetValueV128(BinaryenExpressionRef expr,
2133                                const uint8_t value[16]) {
2134   auto* expression = (Expression*)expr;
2135   assert(expression->is<Const>());
2136   assert(value); // nullptr would be wrong
2137   static_cast<Const*>(expression)->value = Literal(value);
2138 }
2139 // Unary
BinaryenUnaryGetOp(BinaryenExpressionRef expr)2140 BinaryenOp BinaryenUnaryGetOp(BinaryenExpressionRef expr) {
2141   auto* expression = (Expression*)expr;
2142   assert(expression->is<Unary>());
2143   return static_cast<Unary*>(expression)->op;
2144 }
BinaryenUnarySetOp(BinaryenExpressionRef expr,BinaryenOp op)2145 void BinaryenUnarySetOp(BinaryenExpressionRef expr, BinaryenOp op) {
2146   auto* expression = (Expression*)expr;
2147   assert(expression->is<Unary>());
2148   static_cast<Unary*>(expression)->op = UnaryOp(op);
2149 }
BinaryenUnaryGetValue(BinaryenExpressionRef expr)2150 BinaryenExpressionRef BinaryenUnaryGetValue(BinaryenExpressionRef expr) {
2151   auto* expression = (Expression*)expr;
2152   assert(expression->is<Unary>());
2153   return static_cast<Unary*>(expression)->value;
2154 }
BinaryenUnarySetValue(BinaryenExpressionRef expr,BinaryenExpressionRef valueExpr)2155 void BinaryenUnarySetValue(BinaryenExpressionRef expr,
2156                            BinaryenExpressionRef valueExpr) {
2157   auto* expression = (Expression*)expr;
2158   assert(expression->is<Unary>());
2159   assert(valueExpr);
2160   static_cast<Unary*>(expression)->value = (Expression*)valueExpr;
2161 }
2162 // Binary
BinaryenBinaryGetOp(BinaryenExpressionRef expr)2163 BinaryenOp BinaryenBinaryGetOp(BinaryenExpressionRef expr) {
2164   auto* expression = (Expression*)expr;
2165   assert(expression->is<Binary>());
2166   return static_cast<Binary*>(expression)->op;
2167 }
BinaryenBinarySetOp(BinaryenExpressionRef expr,BinaryenOp op)2168 void BinaryenBinarySetOp(BinaryenExpressionRef expr, BinaryenOp op) {
2169   auto* expression = (Expression*)expr;
2170   assert(expression->is<Binary>());
2171   static_cast<Binary*>(expression)->op = BinaryOp(op);
2172 }
BinaryenBinaryGetLeft(BinaryenExpressionRef expr)2173 BinaryenExpressionRef BinaryenBinaryGetLeft(BinaryenExpressionRef expr) {
2174   auto* expression = (Expression*)expr;
2175   assert(expression->is<Binary>());
2176   return static_cast<Binary*>(expression)->left;
2177 }
BinaryenBinarySetLeft(BinaryenExpressionRef expr,BinaryenExpressionRef leftExpr)2178 void BinaryenBinarySetLeft(BinaryenExpressionRef expr,
2179                            BinaryenExpressionRef leftExpr) {
2180   auto* expression = (Expression*)expr;
2181   assert(expression->is<Binary>());
2182   assert(leftExpr);
2183   static_cast<Binary*>(expression)->left = (Expression*)leftExpr;
2184 }
BinaryenBinaryGetRight(BinaryenExpressionRef expr)2185 BinaryenExpressionRef BinaryenBinaryGetRight(BinaryenExpressionRef expr) {
2186   auto* expression = (Expression*)expr;
2187   assert(expression->is<Binary>());
2188   return static_cast<Binary*>(expression)->right;
2189 }
BinaryenBinarySetRight(BinaryenExpressionRef expr,BinaryenExpressionRef rightExpr)2190 void BinaryenBinarySetRight(BinaryenExpressionRef expr,
2191                             BinaryenExpressionRef rightExpr) {
2192   auto* expression = (Expression*)expr;
2193   assert(expression->is<Binary>());
2194   assert(rightExpr);
2195   static_cast<Binary*>(expression)->right = (Expression*)rightExpr;
2196 }
2197 // Select
BinaryenSelectGetIfTrue(BinaryenExpressionRef expr)2198 BinaryenExpressionRef BinaryenSelectGetIfTrue(BinaryenExpressionRef expr) {
2199   auto* expression = (Expression*)expr;
2200   assert(expression->is<Select>());
2201   return static_cast<Select*>(expression)->ifTrue;
2202 }
BinaryenSelectSetIfTrue(BinaryenExpressionRef expr,BinaryenExpressionRef ifTrueExpr)2203 void BinaryenSelectSetIfTrue(BinaryenExpressionRef expr,
2204                              BinaryenExpressionRef ifTrueExpr) {
2205   auto* expression = (Expression*)expr;
2206   assert(expression->is<Select>());
2207   assert(ifTrueExpr);
2208   static_cast<Select*>(expression)->ifTrue = (Expression*)ifTrueExpr;
2209 }
BinaryenSelectGetIfFalse(BinaryenExpressionRef expr)2210 BinaryenExpressionRef BinaryenSelectGetIfFalse(BinaryenExpressionRef expr) {
2211   auto* expression = (Expression*)expr;
2212   assert(expression->is<Select>());
2213   return static_cast<Select*>(expression)->ifFalse;
2214 }
BinaryenSelectSetIfFalse(BinaryenExpressionRef expr,BinaryenExpressionRef ifFalseExpr)2215 void BinaryenSelectSetIfFalse(BinaryenExpressionRef expr,
2216                               BinaryenExpressionRef ifFalseExpr) {
2217   auto* expression = (Expression*)expr;
2218   assert(expression->is<Select>());
2219   assert(ifFalseExpr);
2220   static_cast<Select*>(expression)->ifFalse = (Expression*)ifFalseExpr;
2221 }
BinaryenSelectGetCondition(BinaryenExpressionRef expr)2222 BinaryenExpressionRef BinaryenSelectGetCondition(BinaryenExpressionRef expr) {
2223   auto* expression = (Expression*)expr;
2224   assert(expression->is<Select>());
2225   return static_cast<Select*>(expression)->condition;
2226 }
BinaryenSelectSetCondition(BinaryenExpressionRef expr,BinaryenExpressionRef condExpr)2227 void BinaryenSelectSetCondition(BinaryenExpressionRef expr,
2228                                 BinaryenExpressionRef condExpr) {
2229   auto* expression = (Expression*)expr;
2230   assert(expression->is<Select>());
2231   assert(condExpr);
2232   static_cast<Select*>(expression)->condition = (Expression*)condExpr;
2233 }
2234 // Drop
BinaryenDropGetValue(BinaryenExpressionRef expr)2235 BinaryenExpressionRef BinaryenDropGetValue(BinaryenExpressionRef expr) {
2236   auto* expression = (Expression*)expr;
2237   assert(expression->is<Drop>());
2238   return static_cast<Drop*>(expression)->value;
2239 }
BinaryenDropSetValue(BinaryenExpressionRef expr,BinaryenExpressionRef valueExpr)2240 void BinaryenDropSetValue(BinaryenExpressionRef expr,
2241                           BinaryenExpressionRef valueExpr) {
2242   auto* expression = (Expression*)expr;
2243   assert(expression->is<Drop>());
2244   assert(valueExpr);
2245   static_cast<Drop*>(expression)->value = (Expression*)valueExpr;
2246 }
2247 // Return
BinaryenReturnGetValue(BinaryenExpressionRef expr)2248 BinaryenExpressionRef BinaryenReturnGetValue(BinaryenExpressionRef expr) {
2249   auto* expression = (Expression*)expr;
2250   assert(expression->is<Return>());
2251   return static_cast<Return*>(expression)->value;
2252 }
BinaryenReturnSetValue(BinaryenExpressionRef expr,BinaryenExpressionRef valueExpr)2253 void BinaryenReturnSetValue(BinaryenExpressionRef expr,
2254                             BinaryenExpressionRef valueExpr) {
2255   auto* expression = (Expression*)expr;
2256   assert(expression->is<Return>());
2257   // may be null
2258   static_cast<Return*>(expression)->value = (Expression*)valueExpr;
2259 }
2260 // AtomicRMW
BinaryenAtomicRMWGetOp(BinaryenExpressionRef expr)2261 BinaryenOp BinaryenAtomicRMWGetOp(BinaryenExpressionRef expr) {
2262   auto* expression = (Expression*)expr;
2263   assert(expression->is<AtomicRMW>());
2264   return static_cast<AtomicRMW*>(expression)->op;
2265 }
BinaryenAtomicRMWSetOp(BinaryenExpressionRef expr,BinaryenOp op)2266 void BinaryenAtomicRMWSetOp(BinaryenExpressionRef expr, BinaryenOp op) {
2267   auto* expression = (Expression*)expr;
2268   assert(expression->is<AtomicRMW>());
2269   static_cast<AtomicRMW*>(expression)->op = AtomicRMWOp(op);
2270 }
BinaryenAtomicRMWGetBytes(BinaryenExpressionRef expr)2271 uint32_t BinaryenAtomicRMWGetBytes(BinaryenExpressionRef expr) {
2272   auto* expression = (Expression*)expr;
2273   assert(expression->is<AtomicRMW>());
2274   return static_cast<AtomicRMW*>(expression)->bytes;
2275 }
BinaryenAtomicRMWSetBytes(BinaryenExpressionRef expr,uint32_t bytes)2276 void BinaryenAtomicRMWSetBytes(BinaryenExpressionRef expr, uint32_t bytes) {
2277   auto* expression = (Expression*)expr;
2278   assert(expression->is<AtomicRMW>());
2279   static_cast<AtomicRMW*>(expression)->bytes = bytes;
2280 }
BinaryenAtomicRMWGetOffset(BinaryenExpressionRef expr)2281 uint32_t BinaryenAtomicRMWGetOffset(BinaryenExpressionRef expr) {
2282   auto* expression = (Expression*)expr;
2283   assert(expression->is<AtomicRMW>());
2284   return static_cast<AtomicRMW*>(expression)->offset;
2285 }
BinaryenAtomicRMWSetOffset(BinaryenExpressionRef expr,uint32_t offset)2286 void BinaryenAtomicRMWSetOffset(BinaryenExpressionRef expr, uint32_t offset) {
2287   auto* expression = (Expression*)expr;
2288   assert(expression->is<AtomicRMW>());
2289   static_cast<AtomicRMW*>(expression)->offset = offset;
2290 }
BinaryenAtomicRMWGetPtr(BinaryenExpressionRef expr)2291 BinaryenExpressionRef BinaryenAtomicRMWGetPtr(BinaryenExpressionRef expr) {
2292   auto* expression = (Expression*)expr;
2293   assert(expression->is<AtomicRMW>());
2294   return static_cast<AtomicRMW*>(expression)->ptr;
2295 }
BinaryenAtomicRMWSetPtr(BinaryenExpressionRef expr,BinaryenExpressionRef ptrExpr)2296 void BinaryenAtomicRMWSetPtr(BinaryenExpressionRef expr,
2297                              BinaryenExpressionRef ptrExpr) {
2298   auto* expression = (Expression*)expr;
2299   assert(expression->is<AtomicRMW>());
2300   assert(ptrExpr);
2301   static_cast<AtomicRMW*>(expression)->ptr = (Expression*)ptrExpr;
2302 }
BinaryenAtomicRMWGetValue(BinaryenExpressionRef expr)2303 BinaryenExpressionRef BinaryenAtomicRMWGetValue(BinaryenExpressionRef expr) {
2304   auto* expression = (Expression*)expr;
2305   assert(expression->is<AtomicRMW>());
2306   return static_cast<AtomicRMW*>(expression)->value;
2307 }
BinaryenAtomicRMWSetValue(BinaryenExpressionRef expr,BinaryenExpressionRef valueExpr)2308 void BinaryenAtomicRMWSetValue(BinaryenExpressionRef expr,
2309                                BinaryenExpressionRef valueExpr) {
2310   auto* expression = (Expression*)expr;
2311   assert(expression->is<AtomicRMW>());
2312   assert(valueExpr);
2313   static_cast<AtomicRMW*>(expression)->value = (Expression*)valueExpr;
2314 }
2315 // AtomicCmpxchg
BinaryenAtomicCmpxchgGetBytes(BinaryenExpressionRef expr)2316 uint32_t BinaryenAtomicCmpxchgGetBytes(BinaryenExpressionRef expr) {
2317   auto* expression = (Expression*)expr;
2318   assert(expression->is<AtomicCmpxchg>());
2319   return static_cast<AtomicCmpxchg*>(expression)->bytes;
2320 }
BinaryenAtomicCmpxchgSetBytes(BinaryenExpressionRef expr,uint32_t bytes)2321 void BinaryenAtomicCmpxchgSetBytes(BinaryenExpressionRef expr, uint32_t bytes) {
2322   auto* expression = (Expression*)expr;
2323   assert(expression->is<AtomicCmpxchg>());
2324   static_cast<AtomicCmpxchg*>(expression)->bytes = bytes;
2325 }
BinaryenAtomicCmpxchgGetOffset(BinaryenExpressionRef expr)2326 uint32_t BinaryenAtomicCmpxchgGetOffset(BinaryenExpressionRef expr) {
2327   auto* expression = (Expression*)expr;
2328   assert(expression->is<AtomicCmpxchg>());
2329   return static_cast<AtomicCmpxchg*>(expression)->offset;
2330 }
BinaryenAtomicCmpxchgSetOffset(BinaryenExpressionRef expr,uint32_t offset)2331 void BinaryenAtomicCmpxchgSetOffset(BinaryenExpressionRef expr,
2332                                     uint32_t offset) {
2333   auto* expression = (Expression*)expr;
2334   assert(expression->is<AtomicCmpxchg>());
2335   static_cast<AtomicCmpxchg*>(expression)->offset = offset;
2336 }
BinaryenAtomicCmpxchgGetPtr(BinaryenExpressionRef expr)2337 BinaryenExpressionRef BinaryenAtomicCmpxchgGetPtr(BinaryenExpressionRef expr) {
2338   auto* expression = (Expression*)expr;
2339   assert(expression->is<AtomicCmpxchg>());
2340   return static_cast<AtomicCmpxchg*>(expression)->ptr;
2341 }
BinaryenAtomicCmpxchgSetPtr(BinaryenExpressionRef expr,BinaryenExpressionRef ptrExpr)2342 void BinaryenAtomicCmpxchgSetPtr(BinaryenExpressionRef expr,
2343                                  BinaryenExpressionRef ptrExpr) {
2344   auto* expression = (Expression*)expr;
2345   assert(expression->is<AtomicCmpxchg>());
2346   assert(ptrExpr);
2347   static_cast<AtomicCmpxchg*>(expression)->ptr = (Expression*)ptrExpr;
2348 }
2349 BinaryenExpressionRef
BinaryenAtomicCmpxchgGetExpected(BinaryenExpressionRef expr)2350 BinaryenAtomicCmpxchgGetExpected(BinaryenExpressionRef expr) {
2351   auto* expression = (Expression*)expr;
2352   assert(expression->is<AtomicCmpxchg>());
2353   return static_cast<AtomicCmpxchg*>(expression)->expected;
2354 }
BinaryenAtomicCmpxchgSetExpected(BinaryenExpressionRef expr,BinaryenExpressionRef expectedExpr)2355 void BinaryenAtomicCmpxchgSetExpected(BinaryenExpressionRef expr,
2356                                       BinaryenExpressionRef expectedExpr) {
2357   auto* expression = (Expression*)expr;
2358   assert(expression->is<AtomicCmpxchg>());
2359   assert(expectedExpr);
2360   static_cast<AtomicCmpxchg*>(expression)->expected = (Expression*)expectedExpr;
2361 }
2362 BinaryenExpressionRef
BinaryenAtomicCmpxchgGetReplacement(BinaryenExpressionRef expr)2363 BinaryenAtomicCmpxchgGetReplacement(BinaryenExpressionRef expr) {
2364   auto* expression = (Expression*)expr;
2365   assert(expression->is<AtomicCmpxchg>());
2366   return static_cast<AtomicCmpxchg*>(expression)->replacement;
2367 }
BinaryenAtomicCmpxchgSetReplacement(BinaryenExpressionRef expr,BinaryenExpressionRef replacementExpr)2368 void BinaryenAtomicCmpxchgSetReplacement(
2369   BinaryenExpressionRef expr, BinaryenExpressionRef replacementExpr) {
2370   auto* expression = (Expression*)expr;
2371   assert(expression->is<AtomicCmpxchg>());
2372   assert(replacementExpr);
2373   static_cast<AtomicCmpxchg*>(expression)->replacement =
2374     (Expression*)replacementExpr;
2375 }
2376 // AtomicWait
BinaryenAtomicWaitGetPtr(BinaryenExpressionRef expr)2377 BinaryenExpressionRef BinaryenAtomicWaitGetPtr(BinaryenExpressionRef expr) {
2378   auto* expression = (Expression*)expr;
2379   assert(expression->is<AtomicWait>());
2380   return static_cast<AtomicWait*>(expression)->ptr;
2381 }
BinaryenAtomicWaitSetPtr(BinaryenExpressionRef expr,BinaryenExpressionRef ptrExpr)2382 void BinaryenAtomicWaitSetPtr(BinaryenExpressionRef expr,
2383                               BinaryenExpressionRef ptrExpr) {
2384   auto* expression = (Expression*)expr;
2385   assert(expression->is<AtomicWait>());
2386   assert(ptrExpr);
2387   static_cast<AtomicWait*>(expression)->ptr = (Expression*)ptrExpr;
2388 }
2389 BinaryenExpressionRef
BinaryenAtomicWaitGetExpected(BinaryenExpressionRef expr)2390 BinaryenAtomicWaitGetExpected(BinaryenExpressionRef expr) {
2391   auto* expression = (Expression*)expr;
2392   assert(expression->is<AtomicWait>());
2393   return static_cast<AtomicWait*>(expression)->expected;
2394 }
BinaryenAtomicWaitSetExpected(BinaryenExpressionRef expr,BinaryenExpressionRef expectedExpr)2395 void BinaryenAtomicWaitSetExpected(BinaryenExpressionRef expr,
2396                                    BinaryenExpressionRef expectedExpr) {
2397   auto* expression = (Expression*)expr;
2398   assert(expression->is<AtomicWait>());
2399   assert(expectedExpr);
2400   static_cast<AtomicWait*>(expression)->expected = (Expression*)expectedExpr;
2401 }
BinaryenAtomicWaitGetTimeout(BinaryenExpressionRef expr)2402 BinaryenExpressionRef BinaryenAtomicWaitGetTimeout(BinaryenExpressionRef expr) {
2403   auto* expression = (Expression*)expr;
2404   assert(expression->is<AtomicWait>());
2405   return static_cast<AtomicWait*>(expression)->timeout;
2406 }
BinaryenAtomicWaitSetTimeout(BinaryenExpressionRef expr,BinaryenExpressionRef timeoutExpr)2407 void BinaryenAtomicWaitSetTimeout(BinaryenExpressionRef expr,
2408                                   BinaryenExpressionRef timeoutExpr) {
2409   auto* expression = (Expression*)expr;
2410   assert(expression->is<AtomicWait>());
2411   assert(timeoutExpr);
2412   static_cast<AtomicWait*>(expression)->timeout = (Expression*)timeoutExpr;
2413 }
BinaryenAtomicWaitGetExpectedType(BinaryenExpressionRef expr)2414 BinaryenType BinaryenAtomicWaitGetExpectedType(BinaryenExpressionRef expr) {
2415   auto* expression = (Expression*)expr;
2416   assert(expression->is<AtomicWait>());
2417   return static_cast<AtomicWait*>(expression)->expectedType.getID();
2418 }
BinaryenAtomicWaitSetExpectedType(BinaryenExpressionRef expr,BinaryenType expectedType)2419 void BinaryenAtomicWaitSetExpectedType(BinaryenExpressionRef expr,
2420                                        BinaryenType expectedType) {
2421   auto* expression = (Expression*)expr;
2422   assert(expression->is<AtomicWait>());
2423   static_cast<AtomicWait*>(expression)->expectedType = Type(expectedType);
2424 }
2425 // AtomicNotify
BinaryenAtomicNotifyGetPtr(BinaryenExpressionRef expr)2426 BinaryenExpressionRef BinaryenAtomicNotifyGetPtr(BinaryenExpressionRef expr) {
2427   auto* expression = (Expression*)expr;
2428   assert(expression->is<AtomicNotify>());
2429   return static_cast<AtomicNotify*>(expression)->ptr;
2430 }
BinaryenAtomicNotifySetPtr(BinaryenExpressionRef expr,BinaryenExpressionRef ptrExpr)2431 void BinaryenAtomicNotifySetPtr(BinaryenExpressionRef expr,
2432                                 BinaryenExpressionRef ptrExpr) {
2433   auto* expression = (Expression*)expr;
2434   assert(expression->is<AtomicNotify>());
2435   assert(ptrExpr);
2436   static_cast<AtomicNotify*>(expression)->ptr = (Expression*)ptrExpr;
2437 }
2438 BinaryenExpressionRef
BinaryenAtomicNotifyGetNotifyCount(BinaryenExpressionRef expr)2439 BinaryenAtomicNotifyGetNotifyCount(BinaryenExpressionRef expr) {
2440   auto* expression = (Expression*)expr;
2441   assert(expression->is<AtomicNotify>());
2442   return static_cast<AtomicNotify*>(expression)->notifyCount;
2443 }
BinaryenAtomicNotifySetNotifyCount(BinaryenExpressionRef expr,BinaryenExpressionRef notifyCountExpr)2444 void BinaryenAtomicNotifySetNotifyCount(BinaryenExpressionRef expr,
2445                                         BinaryenExpressionRef notifyCountExpr) {
2446   auto* expression = (Expression*)expr;
2447   assert(expression->is<AtomicNotify>());
2448   assert(notifyCountExpr);
2449   static_cast<AtomicNotify*>(expression)->notifyCount =
2450     (Expression*)notifyCountExpr;
2451 }
2452 // AtomicFence
BinaryenAtomicFenceGetOrder(BinaryenExpressionRef expr)2453 uint8_t BinaryenAtomicFenceGetOrder(BinaryenExpressionRef expr) {
2454   auto* expression = (Expression*)expr;
2455   assert(expression->is<AtomicFence>());
2456   return static_cast<AtomicFence*>(expression)->order;
2457 }
BinaryenAtomicFenceSetOrder(BinaryenExpressionRef expr,uint8_t order)2458 void BinaryenAtomicFenceSetOrder(BinaryenExpressionRef expr, uint8_t order) {
2459   auto* expression = (Expression*)expr;
2460   assert(expression->is<AtomicFence>());
2461   static_cast<AtomicFence*>(expression)->order = order;
2462 }
2463 // SIMDExtract
BinaryenSIMDExtractGetOp(BinaryenExpressionRef expr)2464 BinaryenOp BinaryenSIMDExtractGetOp(BinaryenExpressionRef expr) {
2465   auto* expression = (Expression*)expr;
2466   assert(expression->is<SIMDExtract>());
2467   return static_cast<SIMDExtract*>(expression)->op;
2468 }
BinaryenSIMDExtractSetOp(BinaryenExpressionRef expr,BinaryenOp op)2469 void BinaryenSIMDExtractSetOp(BinaryenExpressionRef expr, BinaryenOp op) {
2470   auto* expression = (Expression*)expr;
2471   assert(expression->is<SIMDExtract>());
2472   static_cast<SIMDExtract*>(expression)->op = SIMDExtractOp(op);
2473 }
BinaryenSIMDExtractGetVec(BinaryenExpressionRef expr)2474 BinaryenExpressionRef BinaryenSIMDExtractGetVec(BinaryenExpressionRef expr) {
2475   auto* expression = (Expression*)expr;
2476   assert(expression->is<SIMDExtract>());
2477   return static_cast<SIMDExtract*>(expression)->vec;
2478 }
BinaryenSIMDExtractSetVec(BinaryenExpressionRef expr,BinaryenExpressionRef vecExpr)2479 void BinaryenSIMDExtractSetVec(BinaryenExpressionRef expr,
2480                                BinaryenExpressionRef vecExpr) {
2481   auto* expression = (Expression*)expr;
2482   assert(expression->is<SIMDExtract>());
2483   assert(vecExpr);
2484   static_cast<SIMDExtract*>(expression)->vec = (Expression*)vecExpr;
2485 }
BinaryenSIMDExtractGetIndex(BinaryenExpressionRef expr)2486 uint8_t BinaryenSIMDExtractGetIndex(BinaryenExpressionRef expr) {
2487   auto* expression = (Expression*)expr;
2488   assert(expression->is<SIMDExtract>());
2489   return static_cast<SIMDExtract*>(expression)->index;
2490 }
BinaryenSIMDExtractSetIndex(BinaryenExpressionRef expr,uint8_t index)2491 void BinaryenSIMDExtractSetIndex(BinaryenExpressionRef expr, uint8_t index) {
2492   auto* expression = (Expression*)expr;
2493   assert(expression->is<SIMDExtract>());
2494   static_cast<SIMDExtract*>(expression)->index = index;
2495 }
2496 // SIMDReplace
BinaryenSIMDReplaceGetOp(BinaryenExpressionRef expr)2497 BinaryenOp BinaryenSIMDReplaceGetOp(BinaryenExpressionRef expr) {
2498   auto* expression = (Expression*)expr;
2499   assert(expression->is<SIMDReplace>());
2500   return static_cast<SIMDReplace*>(expression)->op;
2501 }
BinaryenSIMDReplaceSetOp(BinaryenExpressionRef expr,BinaryenOp op)2502 void BinaryenSIMDReplaceSetOp(BinaryenExpressionRef expr, BinaryenOp op) {
2503   auto* expression = (Expression*)expr;
2504   assert(expression->is<SIMDReplace>());
2505   static_cast<SIMDReplace*>(expression)->op = SIMDReplaceOp(op);
2506 }
BinaryenSIMDReplaceGetVec(BinaryenExpressionRef expr)2507 BinaryenExpressionRef BinaryenSIMDReplaceGetVec(BinaryenExpressionRef expr) {
2508   auto* expression = (Expression*)expr;
2509   assert(expression->is<SIMDReplace>());
2510   return static_cast<SIMDReplace*>(expression)->vec;
2511 }
BinaryenSIMDReplaceSetVec(BinaryenExpressionRef expr,BinaryenExpressionRef vecExpr)2512 void BinaryenSIMDReplaceSetVec(BinaryenExpressionRef expr,
2513                                BinaryenExpressionRef vecExpr) {
2514   auto* expression = (Expression*)expr;
2515   assert(expression->is<SIMDReplace>());
2516   assert(vecExpr);
2517   static_cast<SIMDReplace*>(expression)->vec = (Expression*)vecExpr;
2518 }
BinaryenSIMDReplaceGetIndex(BinaryenExpressionRef expr)2519 uint8_t BinaryenSIMDReplaceGetIndex(BinaryenExpressionRef expr) {
2520   auto* expression = (Expression*)expr;
2521   assert(expression->is<SIMDReplace>());
2522   return static_cast<SIMDReplace*>(expression)->index;
2523 }
BinaryenSIMDReplaceSetIndex(BinaryenExpressionRef expr,uint8_t index)2524 void BinaryenSIMDReplaceSetIndex(BinaryenExpressionRef expr, uint8_t index) {
2525   auto* expression = (Expression*)expr;
2526   assert(expression->is<SIMDReplace>());
2527   static_cast<SIMDReplace*>(expression)->index = index;
2528 }
BinaryenSIMDReplaceGetValue(BinaryenExpressionRef expr)2529 BinaryenExpressionRef BinaryenSIMDReplaceGetValue(BinaryenExpressionRef expr) {
2530   auto* expression = (Expression*)expr;
2531   assert(expression->is<SIMDReplace>());
2532   return static_cast<SIMDReplace*>(expression)->value;
2533 }
BinaryenSIMDReplaceSetValue(BinaryenExpressionRef expr,BinaryenExpressionRef valueExpr)2534 void BinaryenSIMDReplaceSetValue(BinaryenExpressionRef expr,
2535                                  BinaryenExpressionRef valueExpr) {
2536   auto* expression = (Expression*)expr;
2537   assert(expression->is<SIMDReplace>());
2538   assert(valueExpr);
2539   static_cast<SIMDReplace*>(expression)->value = (Expression*)valueExpr;
2540 }
2541 // SIMDShuffle
BinaryenSIMDShuffleGetLeft(BinaryenExpressionRef expr)2542 BinaryenExpressionRef BinaryenSIMDShuffleGetLeft(BinaryenExpressionRef expr) {
2543   auto* expression = (Expression*)expr;
2544   assert(expression->is<SIMDShuffle>());
2545   return static_cast<SIMDShuffle*>(expression)->left;
2546 }
BinaryenSIMDShuffleSetLeft(BinaryenExpressionRef expr,BinaryenExpressionRef leftExpr)2547 void BinaryenSIMDShuffleSetLeft(BinaryenExpressionRef expr,
2548                                 BinaryenExpressionRef leftExpr) {
2549   auto* expression = (Expression*)expr;
2550   assert(expression->is<SIMDShuffle>());
2551   assert(leftExpr);
2552   static_cast<SIMDShuffle*>(expression)->left = (Expression*)leftExpr;
2553 }
BinaryenSIMDShuffleGetRight(BinaryenExpressionRef expr)2554 BinaryenExpressionRef BinaryenSIMDShuffleGetRight(BinaryenExpressionRef expr) {
2555   auto* expression = (Expression*)expr;
2556   assert(expression->is<SIMDShuffle>());
2557   return static_cast<SIMDShuffle*>(expression)->right;
2558 }
BinaryenSIMDShuffleSetRight(BinaryenExpressionRef expr,BinaryenExpressionRef rightExpr)2559 void BinaryenSIMDShuffleSetRight(BinaryenExpressionRef expr,
2560                                  BinaryenExpressionRef rightExpr) {
2561   auto* expression = (Expression*)expr;
2562   assert(expression->is<SIMDShuffle>());
2563   assert(rightExpr);
2564   static_cast<SIMDShuffle*>(expression)->right = (Expression*)rightExpr;
2565 }
BinaryenSIMDShuffleGetMask(BinaryenExpressionRef expr,uint8_t * mask)2566 void BinaryenSIMDShuffleGetMask(BinaryenExpressionRef expr, uint8_t* mask) {
2567   auto* expression = (Expression*)expr;
2568   assert(expression->is<SIMDShuffle>());
2569   assert(mask); // nullptr would be wrong
2570   memcpy(mask, static_cast<SIMDShuffle*>(expression)->mask.data(), 16);
2571 }
BinaryenSIMDShuffleSetMask(BinaryenExpressionRef expr,const uint8_t mask_[16])2572 void BinaryenSIMDShuffleSetMask(BinaryenExpressionRef expr,
2573                                 const uint8_t mask_[16]) {
2574   auto* expression = (Expression*)expr;
2575   assert(expression->is<SIMDShuffle>());
2576   assert(mask_); // nullptr would be wrong
2577   auto& mask = static_cast<SIMDShuffle*>(expression)->mask;
2578   memcpy(mask.data(), mask_, 16);
2579 }
2580 // SIMDTernary
BinaryenSIMDTernaryGetOp(BinaryenExpressionRef expr)2581 BinaryenOp BinaryenSIMDTernaryGetOp(BinaryenExpressionRef expr) {
2582   auto* expression = (Expression*)expr;
2583   assert(expression->is<SIMDTernary>());
2584   return static_cast<SIMDTernary*>(expression)->op;
2585 }
BinaryenSIMDTernarySetOp(BinaryenExpressionRef expr,BinaryenOp op)2586 void BinaryenSIMDTernarySetOp(BinaryenExpressionRef expr, BinaryenOp op) {
2587   auto* expression = (Expression*)expr;
2588   assert(expression->is<SIMDTernary>());
2589   static_cast<SIMDTernary*>(expression)->op = SIMDTernaryOp(op);
2590 }
BinaryenSIMDTernaryGetA(BinaryenExpressionRef expr)2591 BinaryenExpressionRef BinaryenSIMDTernaryGetA(BinaryenExpressionRef expr) {
2592   auto* expression = (Expression*)expr;
2593   assert(expression->is<SIMDTernary>());
2594   return static_cast<SIMDTernary*>(expression)->a;
2595 }
BinaryenSIMDTernarySetA(BinaryenExpressionRef expr,BinaryenExpressionRef aExpr)2596 void BinaryenSIMDTernarySetA(BinaryenExpressionRef expr,
2597                              BinaryenExpressionRef aExpr) {
2598   auto* expression = (Expression*)expr;
2599   assert(expression->is<SIMDTernary>());
2600   assert(aExpr);
2601   static_cast<SIMDTernary*>(expression)->a = (Expression*)aExpr;
2602 }
BinaryenSIMDTernaryGetB(BinaryenExpressionRef expr)2603 BinaryenExpressionRef BinaryenSIMDTernaryGetB(BinaryenExpressionRef expr) {
2604   auto* expression = (Expression*)expr;
2605   assert(expression->is<SIMDTernary>());
2606   return static_cast<SIMDTernary*>(expression)->b;
2607 }
BinaryenSIMDTernarySetB(BinaryenExpressionRef expr,BinaryenExpressionRef bExpr)2608 void BinaryenSIMDTernarySetB(BinaryenExpressionRef expr,
2609                              BinaryenExpressionRef bExpr) {
2610   auto* expression = (Expression*)expr;
2611   assert(expression->is<SIMDTernary>());
2612   assert(bExpr);
2613   static_cast<SIMDTernary*>(expression)->b = (Expression*)bExpr;
2614 }
BinaryenSIMDTernaryGetC(BinaryenExpressionRef expr)2615 BinaryenExpressionRef BinaryenSIMDTernaryGetC(BinaryenExpressionRef expr) {
2616   auto* expression = (Expression*)expr;
2617   assert(expression->is<SIMDTernary>());
2618   return static_cast<SIMDTernary*>(expression)->c;
2619 }
BinaryenSIMDTernarySetC(BinaryenExpressionRef expr,BinaryenExpressionRef cExpr)2620 void BinaryenSIMDTernarySetC(BinaryenExpressionRef expr,
2621                              BinaryenExpressionRef cExpr) {
2622   auto* expression = (Expression*)expr;
2623   assert(expression->is<SIMDTernary>());
2624   assert(cExpr);
2625   static_cast<SIMDTernary*>(expression)->c = (Expression*)cExpr;
2626 }
2627 // SIMDShift
BinaryenSIMDShiftGetOp(BinaryenExpressionRef expr)2628 BinaryenOp BinaryenSIMDShiftGetOp(BinaryenExpressionRef expr) {
2629   auto* expression = (Expression*)expr;
2630   assert(expression->is<SIMDShift>());
2631   return static_cast<SIMDShift*>(expression)->op;
2632 }
BinaryenSIMDShiftSetOp(BinaryenExpressionRef expr,BinaryenOp op)2633 void BinaryenSIMDShiftSetOp(BinaryenExpressionRef expr, BinaryenOp op) {
2634   auto* expression = (Expression*)expr;
2635   assert(expression->is<SIMDShift>());
2636   static_cast<SIMDShift*>(expression)->op = SIMDShiftOp(op);
2637 }
BinaryenSIMDShiftGetVec(BinaryenExpressionRef expr)2638 BinaryenExpressionRef BinaryenSIMDShiftGetVec(BinaryenExpressionRef expr) {
2639   auto* expression = (Expression*)expr;
2640   assert(expression->is<SIMDShift>());
2641   return static_cast<SIMDShift*>(expression)->vec;
2642 }
BinaryenSIMDShiftSetVec(BinaryenExpressionRef expr,BinaryenExpressionRef vecExpr)2643 void BinaryenSIMDShiftSetVec(BinaryenExpressionRef expr,
2644                              BinaryenExpressionRef vecExpr) {
2645   auto* expression = (Expression*)expr;
2646   assert(expression->is<SIMDShift>());
2647   assert(vecExpr);
2648   static_cast<SIMDShift*>(expression)->vec = (Expression*)vecExpr;
2649 }
BinaryenSIMDShiftGetShift(BinaryenExpressionRef expr)2650 BinaryenExpressionRef BinaryenSIMDShiftGetShift(BinaryenExpressionRef expr) {
2651   auto* expression = (Expression*)expr;
2652   assert(expression->is<SIMDShift>());
2653   return static_cast<SIMDShift*>(expression)->shift;
2654 }
BinaryenSIMDShiftSetShift(BinaryenExpressionRef expr,BinaryenExpressionRef shiftExpr)2655 void BinaryenSIMDShiftSetShift(BinaryenExpressionRef expr,
2656                                BinaryenExpressionRef shiftExpr) {
2657   auto* expression = (Expression*)expr;
2658   assert(expression->is<SIMDShift>());
2659   assert(shiftExpr);
2660   static_cast<SIMDShift*>(expression)->shift = (Expression*)shiftExpr;
2661 }
2662 // SIMDLoad
BinaryenSIMDLoadGetOp(BinaryenExpressionRef expr)2663 BinaryenOp BinaryenSIMDLoadGetOp(BinaryenExpressionRef expr) {
2664   auto* expression = (Expression*)expr;
2665   assert(expression->is<SIMDLoad>());
2666   return static_cast<SIMDLoad*>(expression)->op;
2667 }
BinaryenSIMDLoadSetOp(BinaryenExpressionRef expr,BinaryenOp op)2668 void BinaryenSIMDLoadSetOp(BinaryenExpressionRef expr, BinaryenOp op) {
2669   auto* expression = (Expression*)expr;
2670   assert(expression->is<SIMDLoad>());
2671   static_cast<SIMDLoad*>(expression)->op = SIMDLoadOp(op);
2672 }
BinaryenSIMDLoadGetOffset(BinaryenExpressionRef expr)2673 uint32_t BinaryenSIMDLoadGetOffset(BinaryenExpressionRef expr) {
2674   auto* expression = (Expression*)expr;
2675   assert(expression->is<SIMDLoad>());
2676   return static_cast<SIMDLoad*>(expression)->offset;
2677 }
BinaryenSIMDLoadSetOffset(BinaryenExpressionRef expr,uint32_t offset)2678 void BinaryenSIMDLoadSetOffset(BinaryenExpressionRef expr, uint32_t offset) {
2679   auto* expression = (Expression*)expr;
2680   assert(expression->is<SIMDLoad>());
2681   static_cast<SIMDLoad*>(expression)->offset = offset;
2682 }
BinaryenSIMDLoadGetAlign(BinaryenExpressionRef expr)2683 uint32_t BinaryenSIMDLoadGetAlign(BinaryenExpressionRef expr) {
2684   auto* expression = (Expression*)expr;
2685   assert(expression->is<SIMDLoad>());
2686   return static_cast<SIMDLoad*>(expression)->align;
2687 }
BinaryenSIMDLoadSetAlign(BinaryenExpressionRef expr,uint32_t align)2688 void BinaryenSIMDLoadSetAlign(BinaryenExpressionRef expr, uint32_t align) {
2689   auto* expression = (Expression*)expr;
2690   assert(expression->is<SIMDLoad>());
2691   static_cast<SIMDLoad*>(expression)->align = align;
2692 }
BinaryenSIMDLoadGetPtr(BinaryenExpressionRef expr)2693 BinaryenExpressionRef BinaryenSIMDLoadGetPtr(BinaryenExpressionRef expr) {
2694   auto* expression = (Expression*)expr;
2695   assert(expression->is<SIMDLoad>());
2696   return static_cast<SIMDLoad*>(expression)->ptr;
2697 }
BinaryenSIMDLoadSetPtr(BinaryenExpressionRef expr,BinaryenExpressionRef ptrExpr)2698 void BinaryenSIMDLoadSetPtr(BinaryenExpressionRef expr,
2699                             BinaryenExpressionRef ptrExpr) {
2700   auto* expression = (Expression*)expr;
2701   assert(expression->is<SIMDLoad>());
2702   assert(ptrExpr);
2703   static_cast<SIMDLoad*>(expression)->ptr = (Expression*)ptrExpr;
2704 }
2705 // MemoryInit
BinaryenMemoryInitGetSegment(BinaryenExpressionRef expr)2706 uint32_t BinaryenMemoryInitGetSegment(BinaryenExpressionRef expr) {
2707   auto* expression = (Expression*)expr;
2708   assert(expression->is<MemoryInit>());
2709   return static_cast<MemoryInit*>(expression)->segment;
2710 }
BinaryenMemoryInitSetSegment(BinaryenExpressionRef expr,uint32_t segment)2711 void BinaryenMemoryInitSetSegment(BinaryenExpressionRef expr,
2712                                   uint32_t segment) {
2713   auto* expression = (Expression*)expr;
2714   assert(expression->is<MemoryInit>());
2715   static_cast<MemoryInit*>(expression)->segment = segment;
2716 }
BinaryenMemoryInitGetDest(BinaryenExpressionRef expr)2717 BinaryenExpressionRef BinaryenMemoryInitGetDest(BinaryenExpressionRef expr) {
2718   auto* expression = (Expression*)expr;
2719   assert(expression->is<MemoryInit>());
2720   return static_cast<MemoryInit*>(expression)->dest;
2721 }
BinaryenMemoryInitSetDest(BinaryenExpressionRef expr,BinaryenExpressionRef destExpr)2722 void BinaryenMemoryInitSetDest(BinaryenExpressionRef expr,
2723                                BinaryenExpressionRef destExpr) {
2724   auto* expression = (Expression*)expr;
2725   assert(expression->is<MemoryInit>());
2726   assert(destExpr);
2727   static_cast<MemoryInit*>(expression)->dest = (Expression*)destExpr;
2728 }
BinaryenMemoryInitGetOffset(BinaryenExpressionRef expr)2729 BinaryenExpressionRef BinaryenMemoryInitGetOffset(BinaryenExpressionRef expr) {
2730   auto* expression = (Expression*)expr;
2731   assert(expression->is<MemoryInit>());
2732   return static_cast<MemoryInit*>(expression)->offset;
2733 }
BinaryenMemoryInitSetOffset(BinaryenExpressionRef expr,BinaryenExpressionRef offsetExpr)2734 void BinaryenMemoryInitSetOffset(BinaryenExpressionRef expr,
2735                                  BinaryenExpressionRef offsetExpr) {
2736   auto* expression = (Expression*)expr;
2737   assert(expression->is<MemoryInit>());
2738   assert(offsetExpr);
2739   static_cast<MemoryInit*>(expression)->offset = (Expression*)offsetExpr;
2740 }
BinaryenMemoryInitGetSize(BinaryenExpressionRef expr)2741 BinaryenExpressionRef BinaryenMemoryInitGetSize(BinaryenExpressionRef expr) {
2742   auto* expression = (Expression*)expr;
2743   assert(expression->is<MemoryInit>());
2744   return static_cast<MemoryInit*>(expression)->size;
2745 }
BinaryenMemoryInitSetSize(BinaryenExpressionRef expr,BinaryenExpressionRef sizeExpr)2746 void BinaryenMemoryInitSetSize(BinaryenExpressionRef expr,
2747                                BinaryenExpressionRef sizeExpr) {
2748   auto* expression = (Expression*)expr;
2749   assert(expression->is<MemoryInit>());
2750   assert(sizeExpr);
2751   static_cast<MemoryInit*>(expression)->size = (Expression*)sizeExpr;
2752 }
2753 // DataDrop
BinaryenDataDropGetSegment(BinaryenExpressionRef expr)2754 uint32_t BinaryenDataDropGetSegment(BinaryenExpressionRef expr) {
2755   auto* expression = (Expression*)expr;
2756   assert(expression->is<DataDrop>());
2757   return static_cast<DataDrop*>(expression)->segment;
2758 }
BinaryenDataDropSetSegment(BinaryenExpressionRef expr,uint32_t segment)2759 void BinaryenDataDropSetSegment(BinaryenExpressionRef expr, uint32_t segment) {
2760   auto* expression = (Expression*)expr;
2761   assert(expression->is<DataDrop>());
2762   static_cast<DataDrop*>(expression)->segment = segment;
2763 }
2764 // MemoryCopy
BinaryenMemoryCopyGetDest(BinaryenExpressionRef expr)2765 BinaryenExpressionRef BinaryenMemoryCopyGetDest(BinaryenExpressionRef expr) {
2766   auto* expression = (Expression*)expr;
2767   assert(expression->is<MemoryCopy>());
2768   return static_cast<MemoryCopy*>(expression)->dest;
2769 }
BinaryenMemoryCopySetDest(BinaryenExpressionRef expr,BinaryenExpressionRef destExpr)2770 void BinaryenMemoryCopySetDest(BinaryenExpressionRef expr,
2771                                BinaryenExpressionRef destExpr) {
2772   auto* expression = (Expression*)expr;
2773   assert(expression->is<MemoryCopy>());
2774   assert(destExpr);
2775   static_cast<MemoryCopy*>(expression)->dest = (Expression*)destExpr;
2776 }
BinaryenMemoryCopyGetSource(BinaryenExpressionRef expr)2777 BinaryenExpressionRef BinaryenMemoryCopyGetSource(BinaryenExpressionRef expr) {
2778   auto* expression = (Expression*)expr;
2779   assert(expression->is<MemoryCopy>());
2780   return static_cast<MemoryCopy*>(expression)->source;
2781 }
BinaryenMemoryCopySetSource(BinaryenExpressionRef expr,BinaryenExpressionRef sourceExpr)2782 void BinaryenMemoryCopySetSource(BinaryenExpressionRef expr,
2783                                  BinaryenExpressionRef sourceExpr) {
2784   auto* expression = (Expression*)expr;
2785   assert(expression->is<MemoryCopy>());
2786   assert(sourceExpr);
2787   static_cast<MemoryCopy*>(expression)->source = (Expression*)sourceExpr;
2788 }
BinaryenMemoryCopyGetSize(BinaryenExpressionRef expr)2789 BinaryenExpressionRef BinaryenMemoryCopyGetSize(BinaryenExpressionRef expr) {
2790   auto* expression = (Expression*)expr;
2791   assert(expression->is<MemoryCopy>());
2792   return static_cast<MemoryCopy*>(expression)->size;
2793 }
BinaryenMemoryCopySetSize(BinaryenExpressionRef expr,BinaryenExpressionRef sizeExpr)2794 void BinaryenMemoryCopySetSize(BinaryenExpressionRef expr,
2795                                BinaryenExpressionRef sizeExpr) {
2796   auto* expression = (Expression*)expr;
2797   assert(expression->is<MemoryCopy>());
2798   assert(sizeExpr);
2799   static_cast<MemoryCopy*>(expression)->size = (Expression*)sizeExpr;
2800 }
2801 // MemoryFill
BinaryenMemoryFillGetDest(BinaryenExpressionRef expr)2802 BinaryenExpressionRef BinaryenMemoryFillGetDest(BinaryenExpressionRef expr) {
2803   auto* expression = (Expression*)expr;
2804   assert(expression->is<MemoryFill>());
2805   return static_cast<MemoryFill*>(expression)->dest;
2806 }
BinaryenMemoryFillSetDest(BinaryenExpressionRef expr,BinaryenExpressionRef destExpr)2807 void BinaryenMemoryFillSetDest(BinaryenExpressionRef expr,
2808                                BinaryenExpressionRef destExpr) {
2809   auto* expression = (Expression*)expr;
2810   assert(expression->is<MemoryFill>());
2811   assert(destExpr);
2812   static_cast<MemoryFill*>(expression)->dest = (Expression*)destExpr;
2813 }
BinaryenMemoryFillGetValue(BinaryenExpressionRef expr)2814 BinaryenExpressionRef BinaryenMemoryFillGetValue(BinaryenExpressionRef expr) {
2815   auto* expression = (Expression*)expr;
2816   assert(expression->is<MemoryFill>());
2817   return static_cast<MemoryFill*>(expression)->value;
2818 }
BinaryenMemoryFillSetValue(BinaryenExpressionRef expr,BinaryenExpressionRef valueExpr)2819 void BinaryenMemoryFillSetValue(BinaryenExpressionRef expr,
2820                                 BinaryenExpressionRef valueExpr) {
2821   auto* expression = (Expression*)expr;
2822   assert(expression->is<MemoryFill>());
2823   assert(valueExpr);
2824   static_cast<MemoryFill*>(expression)->value = (Expression*)valueExpr;
2825 }
BinaryenMemoryFillGetSize(BinaryenExpressionRef expr)2826 BinaryenExpressionRef BinaryenMemoryFillGetSize(BinaryenExpressionRef expr) {
2827   auto* expression = (Expression*)expr;
2828   assert(expression->is<MemoryFill>());
2829   return static_cast<MemoryFill*>(expression)->size;
2830 }
BinaryenMemoryFillSetSize(BinaryenExpressionRef expr,BinaryenExpressionRef sizeExpr)2831 void BinaryenMemoryFillSetSize(BinaryenExpressionRef expr,
2832                                BinaryenExpressionRef sizeExpr) {
2833   auto* expression = (Expression*)expr;
2834   assert(expression->is<MemoryFill>());
2835   assert(sizeExpr);
2836   static_cast<MemoryFill*>(expression)->size = (Expression*)sizeExpr;
2837 }
2838 // RefIsNull
BinaryenRefIsNullGetValue(BinaryenExpressionRef expr)2839 BinaryenExpressionRef BinaryenRefIsNullGetValue(BinaryenExpressionRef expr) {
2840   auto* expression = (Expression*)expr;
2841   assert(expression->is<RefIsNull>());
2842   return static_cast<RefIsNull*>(expression)->value;
2843 }
BinaryenRefIsNullSetValue(BinaryenExpressionRef expr,BinaryenExpressionRef valueExpr)2844 void BinaryenRefIsNullSetValue(BinaryenExpressionRef expr,
2845                                BinaryenExpressionRef valueExpr) {
2846   auto* expression = (Expression*)expr;
2847   assert(expression->is<RefIsNull>());
2848   assert(valueExpr);
2849   static_cast<RefIsNull*>(expression)->value = (Expression*)valueExpr;
2850 }
2851 // RefFunc
BinaryenRefFuncGetFunc(BinaryenExpressionRef expr)2852 const char* BinaryenRefFuncGetFunc(BinaryenExpressionRef expr) {
2853   auto* expression = (Expression*)expr;
2854   assert(expression->is<RefFunc>());
2855   return static_cast<RefFunc*>(expression)->func.c_str();
2856 }
BinaryenRefFuncSetFunc(BinaryenExpressionRef expr,const char * funcName)2857 void BinaryenRefFuncSetFunc(BinaryenExpressionRef expr, const char* funcName) {
2858   auto* expression = (Expression*)expr;
2859   assert(expression->is<RefFunc>());
2860   static_cast<RefFunc*>(expression)->func = funcName;
2861 }
2862 // RefEq
BinaryenRefEqGetLeft(BinaryenExpressionRef expr)2863 BinaryenExpressionRef BinaryenRefEqGetLeft(BinaryenExpressionRef expr) {
2864   auto* expression = (Expression*)expr;
2865   assert(expression->is<RefEq>());
2866   return static_cast<RefEq*>(expression)->left;
2867 }
BinaryenRefEqSetLeft(BinaryenExpressionRef expr,BinaryenExpressionRef left)2868 void BinaryenRefEqSetLeft(BinaryenExpressionRef expr,
2869                           BinaryenExpressionRef left) {
2870   auto* expression = (Expression*)expr;
2871   assert(expression->is<RefEq>());
2872   static_cast<RefEq*>(expression)->left = (Expression*)left;
2873 }
BinaryenRefEqGetRight(BinaryenExpressionRef expr)2874 BinaryenExpressionRef BinaryenRefEqGetRight(BinaryenExpressionRef expr) {
2875   auto* expression = (Expression*)expr;
2876   assert(expression->is<RefEq>());
2877   return static_cast<RefEq*>(expression)->right;
2878 }
BinaryenRefEqSetRight(BinaryenExpressionRef expr,BinaryenExpressionRef right)2879 void BinaryenRefEqSetRight(BinaryenExpressionRef expr,
2880                            BinaryenExpressionRef right) {
2881   auto* expression = (Expression*)expr;
2882   assert(expression->is<RefEq>());
2883   static_cast<RefEq*>(expression)->right = (Expression*)right;
2884 }
2885 // Try
BinaryenTryGetBody(BinaryenExpressionRef expr)2886 BinaryenExpressionRef BinaryenTryGetBody(BinaryenExpressionRef expr) {
2887   auto* expression = (Expression*)expr;
2888   assert(expression->is<Try>());
2889   return static_cast<Try*>(expression)->body;
2890 }
BinaryenTrySetBody(BinaryenExpressionRef expr,BinaryenExpressionRef bodyExpr)2891 void BinaryenTrySetBody(BinaryenExpressionRef expr,
2892                         BinaryenExpressionRef bodyExpr) {
2893   auto* expression = (Expression*)expr;
2894   assert(expression->is<Try>());
2895   assert(bodyExpr);
2896   static_cast<Try*>(expression)->body = (Expression*)bodyExpr;
2897 }
BinaryenTryGetCatchBody(BinaryenExpressionRef expr)2898 BinaryenExpressionRef BinaryenTryGetCatchBody(BinaryenExpressionRef expr) {
2899   auto* expression = (Expression*)expr;
2900   assert(expression->is<Try>());
2901   return static_cast<Try*>(expression)->catchBody;
2902 }
BinaryenTrySetCatchBody(BinaryenExpressionRef expr,BinaryenExpressionRef catchBodyExpr)2903 void BinaryenTrySetCatchBody(BinaryenExpressionRef expr,
2904                              BinaryenExpressionRef catchBodyExpr) {
2905   auto* expression = (Expression*)expr;
2906   assert(expression->is<Try>());
2907   assert(catchBodyExpr);
2908   static_cast<Try*>(expression)->catchBody = (Expression*)catchBodyExpr;
2909 }
2910 // Throw
BinaryenThrowGetEvent(BinaryenExpressionRef expr)2911 const char* BinaryenThrowGetEvent(BinaryenExpressionRef expr) {
2912   auto* expression = (Expression*)expr;
2913   assert(expression->is<Throw>());
2914   return static_cast<Throw*>(expression)->event.c_str();
2915 }
BinaryenThrowSetEvent(BinaryenExpressionRef expr,const char * eventName)2916 void BinaryenThrowSetEvent(BinaryenExpressionRef expr, const char* eventName) {
2917   auto* expression = (Expression*)expr;
2918   assert(expression->is<Throw>());
2919   static_cast<Throw*>(expression)->event = eventName;
2920 }
BinaryenThrowGetNumOperands(BinaryenExpressionRef expr)2921 BinaryenIndex BinaryenThrowGetNumOperands(BinaryenExpressionRef expr) {
2922   auto* expression = (Expression*)expr;
2923   assert(expression->is<Throw>());
2924   return static_cast<Throw*>(expression)->operands.size();
2925 }
BinaryenThrowGetOperandAt(BinaryenExpressionRef expr,BinaryenIndex index)2926 BinaryenExpressionRef BinaryenThrowGetOperandAt(BinaryenExpressionRef expr,
2927                                                 BinaryenIndex index) {
2928   auto* expression = (Expression*)expr;
2929   assert(expression->is<Throw>());
2930   assert(index < static_cast<Throw*>(expression)->operands.size());
2931   return static_cast<Throw*>(expression)->operands[index];
2932 }
BinaryenThrowSetOperandAt(BinaryenExpressionRef expr,BinaryenIndex index,BinaryenExpressionRef operandExpr)2933 void BinaryenThrowSetOperandAt(BinaryenExpressionRef expr,
2934                                BinaryenIndex index,
2935                                BinaryenExpressionRef operandExpr) {
2936   auto* expression = (Expression*)expr;
2937   assert(expression->is<Throw>());
2938   assert(index < static_cast<Throw*>(expression)->operands.size());
2939   assert(operandExpr);
2940   static_cast<Throw*>(expression)->operands[index] = (Expression*)operandExpr;
2941 }
BinaryenThrowAppendOperand(BinaryenExpressionRef expr,BinaryenExpressionRef operandExpr)2942 BinaryenIndex BinaryenThrowAppendOperand(BinaryenExpressionRef expr,
2943                                          BinaryenExpressionRef operandExpr) {
2944   auto* expression = (Expression*)expr;
2945   assert(expression->is<Throw>());
2946   assert(operandExpr);
2947   auto& list = static_cast<Throw*>(expression)->operands;
2948   auto index = list.size();
2949   list.push_back((Expression*)operandExpr);
2950   return index;
2951 }
BinaryenThrowInsertOperandAt(BinaryenExpressionRef expr,BinaryenIndex index,BinaryenExpressionRef operandExpr)2952 void BinaryenThrowInsertOperandAt(BinaryenExpressionRef expr,
2953                                   BinaryenIndex index,
2954                                   BinaryenExpressionRef operandExpr) {
2955   auto* expression = (Expression*)expr;
2956   assert(expression->is<Throw>());
2957   assert(operandExpr);
2958   static_cast<Throw*>(expression)
2959     ->operands.insertAt(index, (Expression*)operandExpr);
2960 }
BinaryenThrowRemoveOperandAt(BinaryenExpressionRef expr,BinaryenIndex index)2961 BinaryenExpressionRef BinaryenThrowRemoveOperandAt(BinaryenExpressionRef expr,
2962                                                    BinaryenIndex index) {
2963   auto* expression = (Expression*)expr;
2964   assert(expression->is<Throw>());
2965   return static_cast<Throw*>(expression)->operands.removeAt(index);
2966 }
2967 // Rethrow
BinaryenRethrowGetExnref(BinaryenExpressionRef expr)2968 BinaryenExpressionRef BinaryenRethrowGetExnref(BinaryenExpressionRef expr) {
2969   auto* expression = (Expression*)expr;
2970   assert(expression->is<Rethrow>());
2971   return static_cast<Rethrow*>(expression)->exnref;
2972 }
BinaryenRethrowSetExnref(BinaryenExpressionRef expr,BinaryenExpressionRef exnrefExpr)2973 void BinaryenRethrowSetExnref(BinaryenExpressionRef expr,
2974                               BinaryenExpressionRef exnrefExpr) {
2975   auto* expression = (Expression*)expr;
2976   assert(expression->is<Rethrow>());
2977   assert(exnrefExpr);
2978   static_cast<Rethrow*>(expression)->exnref = (Expression*)exnrefExpr;
2979 }
2980 // BrOnExn
BinaryenBrOnExnGetEvent(BinaryenExpressionRef expr)2981 const char* BinaryenBrOnExnGetEvent(BinaryenExpressionRef expr) {
2982   auto* expression = (Expression*)expr;
2983   assert(expression->is<BrOnExn>());
2984   return static_cast<BrOnExn*>(expression)->event.c_str();
2985 }
BinaryenBrOnExnSetEvent(BinaryenExpressionRef expr,const char * eventName)2986 void BinaryenBrOnExnSetEvent(BinaryenExpressionRef expr,
2987                              const char* eventName) {
2988   auto* expression = (Expression*)expr;
2989   assert(expression->is<BrOnExn>());
2990   static_cast<BrOnExn*>(expression)->event = eventName;
2991 }
BinaryenBrOnExnGetName(BinaryenExpressionRef expr)2992 const char* BinaryenBrOnExnGetName(BinaryenExpressionRef expr) {
2993   auto* expression = (Expression*)expr;
2994   assert(expression->is<BrOnExn>());
2995   return static_cast<BrOnExn*>(expression)->name.c_str();
2996 }
BinaryenBrOnExnSetName(BinaryenExpressionRef expr,const char * name)2997 void BinaryenBrOnExnSetName(BinaryenExpressionRef expr, const char* name) {
2998   auto* expression = (Expression*)expr;
2999   assert(expression->is<BrOnExn>());
3000   static_cast<BrOnExn*>(expression)->name = name;
3001 }
BinaryenBrOnExnGetExnref(BinaryenExpressionRef expr)3002 BinaryenExpressionRef BinaryenBrOnExnGetExnref(BinaryenExpressionRef expr) {
3003   auto* expression = (Expression*)expr;
3004   assert(expression->is<BrOnExn>());
3005   return static_cast<BrOnExn*>(expression)->exnref;
3006 }
BinaryenBrOnExnSetExnref(BinaryenExpressionRef expr,BinaryenExpressionRef exnrefExpr)3007 void BinaryenBrOnExnSetExnref(BinaryenExpressionRef expr,
3008                               BinaryenExpressionRef exnrefExpr) {
3009   auto* expression = (Expression*)expr;
3010   assert(expression->is<BrOnExn>());
3011   assert(exnrefExpr);
3012   static_cast<BrOnExn*>(expression)->exnref = (Expression*)exnrefExpr;
3013 }
3014 // TupleMake
BinaryenTupleMakeGetNumOperands(BinaryenExpressionRef expr)3015 BinaryenIndex BinaryenTupleMakeGetNumOperands(BinaryenExpressionRef expr) {
3016   auto* expression = (Expression*)expr;
3017   assert(expression->is<TupleMake>());
3018   return static_cast<TupleMake*>(expression)->operands.size();
3019 }
BinaryenTupleMakeGetOperandAt(BinaryenExpressionRef expr,BinaryenIndex index)3020 BinaryenExpressionRef BinaryenTupleMakeGetOperandAt(BinaryenExpressionRef expr,
3021                                                     BinaryenIndex index) {
3022   auto* expression = (Expression*)expr;
3023   assert(expression->is<TupleMake>());
3024   return static_cast<TupleMake*>(expression)->operands[index];
3025 }
BinaryenTupleMakeSetOperandAt(BinaryenExpressionRef expr,BinaryenIndex index,BinaryenExpressionRef operandExpr)3026 void BinaryenTupleMakeSetOperandAt(BinaryenExpressionRef expr,
3027                                    BinaryenIndex index,
3028                                    BinaryenExpressionRef operandExpr) {
3029   auto* expression = (Expression*)expr;
3030   assert(expression->is<TupleMake>());
3031   assert(index < static_cast<TupleMake*>(expression)->operands.size());
3032   assert(operandExpr);
3033   static_cast<TupleMake*>(expression)->operands[index] =
3034     (Expression*)operandExpr;
3035 }
3036 BinaryenIndex
BinaryenTupleMakeAppendOperand(BinaryenExpressionRef expr,BinaryenExpressionRef operandExpr)3037 BinaryenTupleMakeAppendOperand(BinaryenExpressionRef expr,
3038                                BinaryenExpressionRef operandExpr) {
3039   auto* expression = (Expression*)expr;
3040   assert(expression->is<TupleMake>());
3041   assert(operandExpr);
3042   auto& list = static_cast<TupleMake*>(expression)->operands;
3043   auto index = list.size();
3044   list.push_back((Expression*)operandExpr);
3045   return index;
3046 }
BinaryenTupleMakeInsertOperandAt(BinaryenExpressionRef expr,BinaryenIndex index,BinaryenExpressionRef operandExpr)3047 void BinaryenTupleMakeInsertOperandAt(BinaryenExpressionRef expr,
3048                                       BinaryenIndex index,
3049                                       BinaryenExpressionRef operandExpr) {
3050   auto* expression = (Expression*)expr;
3051   assert(expression->is<TupleMake>());
3052   assert(operandExpr);
3053   static_cast<TupleMake*>(expression)
3054     ->operands.insertAt(index, (Expression*)operandExpr);
3055 }
3056 BinaryenExpressionRef
BinaryenTupleMakeRemoveOperandAt(BinaryenExpressionRef expr,BinaryenIndex index)3057 BinaryenTupleMakeRemoveOperandAt(BinaryenExpressionRef expr,
3058                                  BinaryenIndex index) {
3059   auto* expression = (Expression*)expr;
3060   assert(expression->is<TupleMake>());
3061   return static_cast<TupleMake*>(expression)->operands.removeAt(index);
3062 }
3063 // TupleExtract
BinaryenTupleExtractGetTuple(BinaryenExpressionRef expr)3064 BinaryenExpressionRef BinaryenTupleExtractGetTuple(BinaryenExpressionRef expr) {
3065   auto* expression = (Expression*)expr;
3066   assert(expression->is<TupleExtract>());
3067   return static_cast<TupleExtract*>(expression)->tuple;
3068 }
BinaryenTupleExtractSetTuple(BinaryenExpressionRef expr,BinaryenExpressionRef tupleExpr)3069 void BinaryenTupleExtractSetTuple(BinaryenExpressionRef expr,
3070                                   BinaryenExpressionRef tupleExpr) {
3071   auto* expression = (Expression*)expr;
3072   assert(expression->is<TupleExtract>());
3073   assert(tupleExpr);
3074   static_cast<TupleExtract*>(expression)->tuple = (Expression*)tupleExpr;
3075 }
BinaryenTupleExtractGetIndex(BinaryenExpressionRef expr)3076 BinaryenIndex BinaryenTupleExtractGetIndex(BinaryenExpressionRef expr) {
3077   auto* expression = (Expression*)expr;
3078   assert(expression->is<TupleExtract>());
3079   return static_cast<TupleExtract*>(expression)->index;
3080 }
BinaryenTupleExtractSetIndex(BinaryenExpressionRef expr,BinaryenIndex index)3081 void BinaryenTupleExtractSetIndex(BinaryenExpressionRef expr,
3082                                   BinaryenIndex index) {
3083   auto* expression = (Expression*)expr;
3084   assert(expression->is<TupleExtract>());
3085   static_cast<TupleExtract*>(expression)->index = index;
3086 }
3087 // I31New
BinaryenI31NewGetValue(BinaryenExpressionRef expr)3088 BinaryenExpressionRef BinaryenI31NewGetValue(BinaryenExpressionRef expr) {
3089   auto* expression = (Expression*)expr;
3090   assert(expression->is<I31New>());
3091   return static_cast<I31New*>(expression)->value;
3092 }
BinaryenI31NewSetValue(BinaryenExpressionRef expr,BinaryenExpressionRef valueExpr)3093 void BinaryenI31NewSetValue(BinaryenExpressionRef expr,
3094                             BinaryenExpressionRef valueExpr) {
3095   auto* expression = (Expression*)expr;
3096   assert(expression->is<I31New>());
3097   assert(valueExpr);
3098   static_cast<I31New*>(expression)->value = (Expression*)valueExpr;
3099 }
3100 // I31Get
BinaryenI31GetGetI31(BinaryenExpressionRef expr)3101 BinaryenExpressionRef BinaryenI31GetGetI31(BinaryenExpressionRef expr) {
3102   auto* expression = (Expression*)expr;
3103   assert(expression->is<I31Get>());
3104   return static_cast<I31Get*>(expression)->i31;
3105 }
BinaryenI31GetSetI31(BinaryenExpressionRef expr,BinaryenExpressionRef i31Expr)3106 void BinaryenI31GetSetI31(BinaryenExpressionRef expr,
3107                           BinaryenExpressionRef i31Expr) {
3108   auto* expression = (Expression*)expr;
3109   assert(expression->is<I31Get>());
3110   assert(i31Expr);
3111   static_cast<I31Get*>(expression)->i31 = (Expression*)i31Expr;
3112 }
BinaryenI31GetIsSigned(BinaryenExpressionRef expr)3113 int BinaryenI31GetIsSigned(BinaryenExpressionRef expr) {
3114   auto* expression = (Expression*)expr;
3115   assert(expression->is<I31Get>());
3116   return static_cast<I31Get*>(expression)->signed_;
3117 }
BinaryenI31GetSetSigned(BinaryenExpressionRef expr,int signed_)3118 void BinaryenI31GetSetSigned(BinaryenExpressionRef expr, int signed_) {
3119   auto* expression = (Expression*)expr;
3120   assert(expression->is<I31Get>());
3121   static_cast<I31Get*>(expression)->signed_ = signed_ != 0;
3122 }
3123 
3124 // Functions
3125 
BinaryenAddFunction(BinaryenModuleRef module,const char * name,BinaryenType params,BinaryenType results,BinaryenType * varTypes,BinaryenIndex numVarTypes,BinaryenExpressionRef body)3126 BinaryenFunctionRef BinaryenAddFunction(BinaryenModuleRef module,
3127                                         const char* name,
3128                                         BinaryenType params,
3129                                         BinaryenType results,
3130                                         BinaryenType* varTypes,
3131                                         BinaryenIndex numVarTypes,
3132                                         BinaryenExpressionRef body) {
3133   auto* ret = new Function;
3134   ret->name = name;
3135   ret->sig = Signature(Type(params), Type(results));
3136   for (BinaryenIndex i = 0; i < numVarTypes; i++) {
3137     ret->vars.push_back(Type(varTypes[i]));
3138   }
3139   ret->body = (Expression*)body;
3140 
3141   // Lock. This can be called from multiple threads at once, and is a
3142   // point where they all access and modify the module.
3143   {
3144     std::lock_guard<std::mutex> lock(BinaryenFunctionMutex);
3145     ((Module*)module)->addFunction(ret);
3146   }
3147 
3148   return ret;
3149 }
BinaryenGetFunction(BinaryenModuleRef module,const char * name)3150 BinaryenFunctionRef BinaryenGetFunction(BinaryenModuleRef module,
3151                                         const char* name) {
3152   return ((Module*)module)->getFunction(name);
3153 }
BinaryenRemoveFunction(BinaryenModuleRef module,const char * name)3154 void BinaryenRemoveFunction(BinaryenModuleRef module, const char* name) {
3155   ((Module*)module)->removeFunction(name);
3156 }
BinaryenGetNumFunctions(BinaryenModuleRef module)3157 uint32_t BinaryenGetNumFunctions(BinaryenModuleRef module) {
3158   return ((Module*)module)->functions.size();
3159 }
BinaryenGetFunctionByIndex(BinaryenModuleRef module,BinaryenIndex id)3160 BinaryenFunctionRef BinaryenGetFunctionByIndex(BinaryenModuleRef module,
3161                                                BinaryenIndex id) {
3162   const auto& functions = ((Module*)module)->functions;
3163   if (functions.size() <= id) {
3164     Fatal() << "invalid function id.";
3165   }
3166   return functions[id].get();
3167 }
3168 
3169 // Globals
3170 
BinaryenAddGlobal(BinaryenModuleRef module,const char * name,BinaryenType type,int8_t mutable_,BinaryenExpressionRef init)3171 BinaryenGlobalRef BinaryenAddGlobal(BinaryenModuleRef module,
3172                                     const char* name,
3173                                     BinaryenType type,
3174                                     int8_t mutable_,
3175                                     BinaryenExpressionRef init) {
3176   auto* ret = new Global();
3177   ret->name = name;
3178   ret->type = Type(type);
3179   ret->mutable_ = !!mutable_;
3180   ret->init = (Expression*)init;
3181   ((Module*)module)->addGlobal(ret);
3182   return ret;
3183 }
BinaryenGetGlobal(BinaryenModuleRef module,const char * name)3184 BinaryenGlobalRef BinaryenGetGlobal(BinaryenModuleRef module,
3185                                     const char* name) {
3186   return ((Module*)module)->getGlobal(name);
3187 }
BinaryenRemoveGlobal(BinaryenModuleRef module,const char * name)3188 void BinaryenRemoveGlobal(BinaryenModuleRef module, const char* name) {
3189   ((Module*)module)->removeGlobal(name);
3190 }
3191 
3192 // Events
3193 
BinaryenAddEvent(BinaryenModuleRef module,const char * name,uint32_t attribute,BinaryenType params,BinaryenType results)3194 BinaryenEventRef BinaryenAddEvent(BinaryenModuleRef module,
3195                                   const char* name,
3196                                   uint32_t attribute,
3197                                   BinaryenType params,
3198                                   BinaryenType results) {
3199   auto* ret = new Event();
3200   ret->name = name;
3201   ret->attribute = attribute;
3202   ret->sig = Signature(Type(params), Type(results));
3203   ((Module*)module)->addEvent(ret);
3204   return ret;
3205 }
3206 
BinaryenGetEvent(BinaryenModuleRef module,const char * name)3207 BinaryenEventRef BinaryenGetEvent(BinaryenModuleRef module, const char* name) {
3208   return ((Module*)module)->getEvent(name);
3209 }
BinaryenRemoveEvent(BinaryenModuleRef module,const char * name)3210 void BinaryenRemoveEvent(BinaryenModuleRef module, const char* name) {
3211   ((Module*)module)->removeEvent(name);
3212 }
3213 
3214 // Imports
3215 
BinaryenAddFunctionImport(BinaryenModuleRef module,const char * internalName,const char * externalModuleName,const char * externalBaseName,BinaryenType params,BinaryenType results)3216 void BinaryenAddFunctionImport(BinaryenModuleRef module,
3217                                const char* internalName,
3218                                const char* externalModuleName,
3219                                const char* externalBaseName,
3220                                BinaryenType params,
3221                                BinaryenType results) {
3222   auto* ret = new Function();
3223   ret->name = internalName;
3224   ret->module = externalModuleName;
3225   ret->base = externalBaseName;
3226   ret->sig = Signature(Type(params), Type(results));
3227   ((Module*)module)->addFunction(ret);
3228 }
BinaryenAddTableImport(BinaryenModuleRef module,const char * internalName,const char * externalModuleName,const char * externalBaseName)3229 void BinaryenAddTableImport(BinaryenModuleRef module,
3230                             const char* internalName,
3231                             const char* externalModuleName,
3232                             const char* externalBaseName) {
3233   auto& table = ((Module*)module)->table;
3234   table.module = externalModuleName;
3235   table.base = externalBaseName;
3236 }
BinaryenAddMemoryImport(BinaryenModuleRef module,const char * internalName,const char * externalModuleName,const char * externalBaseName,uint8_t shared)3237 void BinaryenAddMemoryImport(BinaryenModuleRef module,
3238                              const char* internalName,
3239                              const char* externalModuleName,
3240                              const char* externalBaseName,
3241                              uint8_t shared) {
3242   auto& memory = ((Module*)module)->memory;
3243   memory.module = externalModuleName;
3244   memory.base = externalBaseName;
3245   memory.shared = shared;
3246 }
BinaryenAddGlobalImport(BinaryenModuleRef module,const char * internalName,const char * externalModuleName,const char * externalBaseName,BinaryenType globalType,int mutable_)3247 void BinaryenAddGlobalImport(BinaryenModuleRef module,
3248                              const char* internalName,
3249                              const char* externalModuleName,
3250                              const char* externalBaseName,
3251                              BinaryenType globalType,
3252                              int mutable_) {
3253   auto* ret = new Global();
3254   ret->name = internalName;
3255   ret->module = externalModuleName;
3256   ret->base = externalBaseName;
3257   ret->type = Type(globalType);
3258   ret->mutable_ = mutable_ != 0;
3259   ((Module*)module)->addGlobal(ret);
3260 }
BinaryenAddEventImport(BinaryenModuleRef module,const char * internalName,const char * externalModuleName,const char * externalBaseName,uint32_t attribute,BinaryenType params,BinaryenType results)3261 void BinaryenAddEventImport(BinaryenModuleRef module,
3262                             const char* internalName,
3263                             const char* externalModuleName,
3264                             const char* externalBaseName,
3265                             uint32_t attribute,
3266                             BinaryenType params,
3267                             BinaryenType results) {
3268   auto* ret = new Event();
3269   ret->name = internalName;
3270   ret->module = externalModuleName;
3271   ret->base = externalBaseName;
3272   ret->sig = Signature(Type(params), Type(results));
3273   ((Module*)module)->addEvent(ret);
3274 }
3275 
3276 // Exports
3277 
BinaryenAddExport(BinaryenModuleRef module,const char * internalName,const char * externalName)3278 WASM_DEPRECATED BinaryenExportRef BinaryenAddExport(BinaryenModuleRef module,
3279                                                     const char* internalName,
3280                                                     const char* externalName) {
3281   return BinaryenAddFunctionExport(module, internalName, externalName);
3282 }
BinaryenAddFunctionExport(BinaryenModuleRef module,const char * internalName,const char * externalName)3283 BinaryenExportRef BinaryenAddFunctionExport(BinaryenModuleRef module,
3284                                             const char* internalName,
3285                                             const char* externalName) {
3286   auto* ret = new Export();
3287   ret->value = internalName;
3288   ret->name = externalName;
3289   ret->kind = ExternalKind::Function;
3290   ((Module*)module)->addExport(ret);
3291   return ret;
3292 }
BinaryenAddTableExport(BinaryenModuleRef module,const char * internalName,const char * externalName)3293 BinaryenExportRef BinaryenAddTableExport(BinaryenModuleRef module,
3294                                          const char* internalName,
3295                                          const char* externalName) {
3296   auto* ret = new Export();
3297   ret->value = internalName;
3298   ret->name = externalName;
3299   ret->kind = ExternalKind::Table;
3300   ((Module*)module)->addExport(ret);
3301   return ret;
3302 }
BinaryenAddMemoryExport(BinaryenModuleRef module,const char * internalName,const char * externalName)3303 BinaryenExportRef BinaryenAddMemoryExport(BinaryenModuleRef module,
3304                                           const char* internalName,
3305                                           const char* externalName) {
3306   auto* ret = new Export();
3307   ret->value = internalName;
3308   ret->name = externalName;
3309   ret->kind = ExternalKind::Memory;
3310   ((Module*)module)->addExport(ret);
3311   return ret;
3312 }
BinaryenAddGlobalExport(BinaryenModuleRef module,const char * internalName,const char * externalName)3313 BinaryenExportRef BinaryenAddGlobalExport(BinaryenModuleRef module,
3314                                           const char* internalName,
3315                                           const char* externalName) {
3316   auto* ret = new Export();
3317   ret->value = internalName;
3318   ret->name = externalName;
3319   ret->kind = ExternalKind::Global;
3320   ((Module*)module)->addExport(ret);
3321   return ret;
3322 }
BinaryenAddEventExport(BinaryenModuleRef module,const char * internalName,const char * externalName)3323 BinaryenExportRef BinaryenAddEventExport(BinaryenModuleRef module,
3324                                          const char* internalName,
3325                                          const char* externalName) {
3326   auto* ret = new Export();
3327   ret->value = internalName;
3328   ret->name = externalName;
3329   ret->kind = ExternalKind::Event;
3330   ((Module*)module)->addExport(ret);
3331   return ret;
3332 }
BinaryenRemoveExport(BinaryenModuleRef module,const char * externalName)3333 void BinaryenRemoveExport(BinaryenModuleRef module, const char* externalName) {
3334   ((Module*)module)->removeExport(externalName);
3335 }
3336 
3337 // Function table. One per module
3338 
BinaryenSetFunctionTable(BinaryenModuleRef module,BinaryenIndex initial,BinaryenIndex maximum,const char ** funcNames,BinaryenIndex numFuncNames,BinaryenExpressionRef offset)3339 void BinaryenSetFunctionTable(BinaryenModuleRef module,
3340                               BinaryenIndex initial,
3341                               BinaryenIndex maximum,
3342                               const char** funcNames,
3343                               BinaryenIndex numFuncNames,
3344                               BinaryenExpressionRef offset) {
3345   Table::Segment segment((Expression*)offset);
3346   for (BinaryenIndex i = 0; i < numFuncNames; i++) {
3347     segment.data.push_back(funcNames[i]);
3348   }
3349   auto& table = ((Module*)module)->table;
3350   table.initial = initial;
3351   table.max = maximum;
3352   table.exists = true;
3353   table.segments.push_back(segment);
3354 }
3355 
BinaryenIsFunctionTableImported(BinaryenModuleRef module)3356 int BinaryenIsFunctionTableImported(BinaryenModuleRef module) {
3357   return ((Module*)module)->table.imported();
3358 }
BinaryenGetNumFunctionTableSegments(BinaryenModuleRef module)3359 BinaryenIndex BinaryenGetNumFunctionTableSegments(BinaryenModuleRef module) {
3360   return ((Module*)module)->table.segments.size();
3361 }
3362 BinaryenExpressionRef
BinaryenGetFunctionTableSegmentOffset(BinaryenModuleRef module,BinaryenIndex segmentId)3363 BinaryenGetFunctionTableSegmentOffset(BinaryenModuleRef module,
3364                                       BinaryenIndex segmentId) {
3365   const auto& segments = ((Module*)module)->table.segments;
3366   if (segments.size() <= segmentId) {
3367     Fatal() << "invalid function table segment id.";
3368   }
3369   return segments[segmentId].offset;
3370 }
BinaryenGetFunctionTableSegmentLength(BinaryenModuleRef module,BinaryenIndex segmentId)3371 BinaryenIndex BinaryenGetFunctionTableSegmentLength(BinaryenModuleRef module,
3372                                                     BinaryenIndex segmentId) {
3373   const auto& segments = ((Module*)module)->table.segments;
3374   if (segments.size() <= segmentId) {
3375     Fatal() << "invalid function table segment id.";
3376   }
3377   return segments[segmentId].data.size();
3378 }
BinaryenGetFunctionTableSegmentData(BinaryenModuleRef module,BinaryenIndex segmentId,BinaryenIndex dataId)3379 const char* BinaryenGetFunctionTableSegmentData(BinaryenModuleRef module,
3380                                                 BinaryenIndex segmentId,
3381                                                 BinaryenIndex dataId) {
3382   const auto& segments = ((Module*)module)->table.segments;
3383   if (segments.size() <= segmentId ||
3384       segments[segmentId].data.size() <= dataId) {
3385     Fatal() << "invalid function table segment or data id.";
3386   }
3387   return segments[segmentId].data[dataId].c_str();
3388 }
3389 
3390 // Memory. One per module
3391 
BinaryenSetMemory(BinaryenModuleRef module,BinaryenIndex initial,BinaryenIndex maximum,const char * exportName,const char ** segments,int8_t * segmentPassive,BinaryenExpressionRef * segmentOffsets,BinaryenIndex * segmentSizes,BinaryenIndex numSegments,uint8_t shared)3392 void BinaryenSetMemory(BinaryenModuleRef module,
3393                        BinaryenIndex initial,
3394                        BinaryenIndex maximum,
3395                        const char* exportName,
3396                        const char** segments,
3397                        int8_t* segmentPassive,
3398                        BinaryenExpressionRef* segmentOffsets,
3399                        BinaryenIndex* segmentSizes,
3400                        BinaryenIndex numSegments,
3401                        uint8_t shared) {
3402   auto* wasm = (Module*)module;
3403   wasm->memory.initial = initial;
3404   wasm->memory.max = int32_t(maximum); // Make sure -1 extends.
3405   wasm->memory.exists = true;
3406   wasm->memory.shared = shared;
3407   if (exportName) {
3408     auto memoryExport = make_unique<Export>();
3409     memoryExport->name = exportName;
3410     memoryExport->value = Name::fromInt(0);
3411     memoryExport->kind = ExternalKind::Memory;
3412     wasm->addExport(memoryExport.release());
3413   }
3414   for (BinaryenIndex i = 0; i < numSegments; i++) {
3415     wasm->memory.segments.emplace_back(segmentPassive[i],
3416                                        (Expression*)segmentOffsets[i],
3417                                        segments[i],
3418                                        segmentSizes[i]);
3419   }
3420 }
3421 
3422 // Memory segments
3423 
BinaryenGetNumMemorySegments(BinaryenModuleRef module)3424 uint32_t BinaryenGetNumMemorySegments(BinaryenModuleRef module) {
3425   return ((Module*)module)->memory.segments.size();
3426 }
BinaryenGetMemorySegmentByteOffset(BinaryenModuleRef module,BinaryenIndex id)3427 uint32_t BinaryenGetMemorySegmentByteOffset(BinaryenModuleRef module,
3428                                             BinaryenIndex id) {
3429   auto* wasm = (Module*)module;
3430   if (wasm->memory.segments.size() <= id) {
3431     Fatal() << "invalid segment id.";
3432   }
3433 
3434   auto globalOffset = [&](const Expression* const& expr,
3435                           int64_t& result) -> bool {
3436     if (auto* c = expr->dynCast<Const>()) {
3437       result = c->value.getInteger();
3438       return true;
3439     }
3440     return false;
3441   };
3442 
3443   const auto& segment = wasm->memory.segments[id];
3444 
3445   int64_t ret;
3446   if (globalOffset(segment.offset, ret)) {
3447     return ret;
3448   }
3449   if (auto* get = segment.offset->dynCast<GlobalGet>()) {
3450     Global* global = wasm->getGlobal(get->name);
3451     if (globalOffset(global->init, ret)) {
3452       return ret;
3453     }
3454   }
3455 
3456   Fatal() << "non-constant offsets aren't supported yet";
3457   return 0;
3458 }
BinaryenGetMemorySegmentByteLength(BinaryenModuleRef module,BinaryenIndex id)3459 size_t BinaryenGetMemorySegmentByteLength(BinaryenModuleRef module,
3460                                           BinaryenIndex id) {
3461   const auto& segments = ((Module*)module)->memory.segments;
3462   if (segments.size() <= id) {
3463     Fatal() << "invalid segment id.";
3464   }
3465   return segments[id].data.size();
3466 }
BinaryenGetMemorySegmentPassive(BinaryenModuleRef module,BinaryenIndex id)3467 int BinaryenGetMemorySegmentPassive(BinaryenModuleRef module,
3468                                     BinaryenIndex id) {
3469   const auto& segments = ((Module*)module)->memory.segments;
3470   if (segments.size() <= id) {
3471     Fatal() << "invalid segment id.";
3472   }
3473   return segments[id].isPassive;
3474 }
BinaryenCopyMemorySegmentData(BinaryenModuleRef module,BinaryenIndex id,char * buffer)3475 void BinaryenCopyMemorySegmentData(BinaryenModuleRef module,
3476                                    BinaryenIndex id,
3477                                    char* buffer) {
3478   const auto& segments = ((Module*)module)->memory.segments;
3479   if (segments.size() <= id) {
3480     Fatal() << "invalid segment id.";
3481   }
3482   const auto& segment = segments[id];
3483   std::copy(segment.data.cbegin(), segment.data.cend(), buffer);
3484 }
3485 
3486 // Start function. One per module
3487 
BinaryenSetStart(BinaryenModuleRef module,BinaryenFunctionRef start)3488 void BinaryenSetStart(BinaryenModuleRef module, BinaryenFunctionRef start) {
3489   ((Module*)module)->addStart(((Function*)start)->name);
3490 }
3491 
3492 // Features
3493 
BinaryenModuleGetFeatures(BinaryenModuleRef module)3494 BinaryenFeatures BinaryenModuleGetFeatures(BinaryenModuleRef module) {
3495   return ((Module*)module)->features.features;
3496 }
3497 
BinaryenModuleSetFeatures(BinaryenModuleRef module,BinaryenFeatures features)3498 void BinaryenModuleSetFeatures(BinaryenModuleRef module,
3499                                BinaryenFeatures features) {
3500   ((Module*)module)->features.features = features;
3501 }
3502 
3503 //
3504 // ========== Module Operations ==========
3505 //
3506 
BinaryenModuleParse(const char * text)3507 BinaryenModuleRef BinaryenModuleParse(const char* text) {
3508   auto* wasm = new Module;
3509   try {
3510     SExpressionParser parser(const_cast<char*>(text));
3511     Element& root = *parser.root;
3512     SExpressionWasmBuilder builder(*wasm, *root[0], IRProfile::Normal);
3513   } catch (ParseException& p) {
3514     p.dump(std::cerr);
3515     Fatal() << "error in parsing wasm text";
3516   }
3517   return wasm;
3518 }
3519 
BinaryenModulePrint(BinaryenModuleRef module)3520 void BinaryenModulePrint(BinaryenModuleRef module) {
3521   WasmPrinter::printModule((Module*)module);
3522 }
3523 
BinaryenModulePrintAsmjs(BinaryenModuleRef module)3524 void BinaryenModulePrintAsmjs(BinaryenModuleRef module) {
3525   auto* wasm = (Module*)module;
3526   Wasm2JSBuilder::Flags flags;
3527   Wasm2JSBuilder wasm2js(flags, globalPassOptions);
3528   auto asmjs = wasm2js.processWasm(wasm);
3529   JSPrinter jser(true, true, asmjs);
3530   Output out("", Flags::Text); // stdout
3531   Wasm2JSGlue glue(*wasm, out, flags, "asmFunc");
3532   glue.emitPre();
3533   jser.printAst();
3534   std::cout << jser.buffer << std::endl;
3535   glue.emitPost();
3536 }
3537 
BinaryenModuleValidate(BinaryenModuleRef module)3538 int BinaryenModuleValidate(BinaryenModuleRef module) {
3539   return WasmValidator().validate(*(Module*)module) ? 1 : 0;
3540 }
3541 
BinaryenModuleOptimize(BinaryenModuleRef module)3542 void BinaryenModuleOptimize(BinaryenModuleRef module) {
3543   PassRunner passRunner((Module*)module);
3544   passRunner.options = globalPassOptions;
3545   passRunner.addDefaultOptimizationPasses();
3546   passRunner.run();
3547 }
3548 
BinaryenGetOptimizeLevel(void)3549 int BinaryenGetOptimizeLevel(void) { return globalPassOptions.optimizeLevel; }
3550 
BinaryenSetOptimizeLevel(int level)3551 void BinaryenSetOptimizeLevel(int level) {
3552   globalPassOptions.optimizeLevel = level;
3553 }
3554 
BinaryenGetShrinkLevel(void)3555 int BinaryenGetShrinkLevel(void) { return globalPassOptions.shrinkLevel; }
3556 
BinaryenSetShrinkLevel(int level)3557 void BinaryenSetShrinkLevel(int level) {
3558   globalPassOptions.shrinkLevel = level;
3559 }
3560 
BinaryenGetDebugInfo(void)3561 int BinaryenGetDebugInfo(void) { return globalPassOptions.debugInfo; }
3562 
BinaryenSetDebugInfo(int on)3563 void BinaryenSetDebugInfo(int on) { globalPassOptions.debugInfo = on != 0; }
3564 
BinaryenGetLowMemoryUnused(void)3565 int BinaryenGetLowMemoryUnused(void) {
3566   return globalPassOptions.lowMemoryUnused;
3567 }
3568 
BinaryenSetLowMemoryUnused(int on)3569 void BinaryenSetLowMemoryUnused(int on) {
3570   globalPassOptions.lowMemoryUnused = on != 0;
3571 }
3572 
BinaryenGetFastMath(void)3573 int BinaryenGetFastMath(void) { return globalPassOptions.fastMath; }
3574 
BinaryenSetFastMath(int value)3575 void BinaryenSetFastMath(int value) { globalPassOptions.fastMath = value != 0; }
3576 
BinaryenGetPassArgument(const char * key)3577 const char* BinaryenGetPassArgument(const char* key) {
3578   assert(key);
3579   const auto& args = globalPassOptions.arguments;
3580   auto it = args.find(key);
3581   if (it == args.end()) {
3582     return nullptr;
3583   }
3584   // internalize the string so it remains valid while the module is
3585   return Name(it->second).c_str();
3586 }
3587 
BinaryenSetPassArgument(const char * key,const char * value)3588 void BinaryenSetPassArgument(const char* key, const char* value) {
3589   assert(key);
3590   if (value) {
3591     globalPassOptions.arguments[key] = value;
3592   } else {
3593     globalPassOptions.arguments.erase(key);
3594   }
3595 }
3596 
BinaryenClearPassArguments(void)3597 void BinaryenClearPassArguments(void) { globalPassOptions.arguments.clear(); }
3598 
BinaryenGetAlwaysInlineMaxSize(void)3599 BinaryenIndex BinaryenGetAlwaysInlineMaxSize(void) {
3600   return globalPassOptions.inlining.alwaysInlineMaxSize;
3601 }
3602 
BinaryenSetAlwaysInlineMaxSize(BinaryenIndex size)3603 void BinaryenSetAlwaysInlineMaxSize(BinaryenIndex size) {
3604   globalPassOptions.inlining.alwaysInlineMaxSize = size;
3605 }
3606 
BinaryenGetFlexibleInlineMaxSize(void)3607 BinaryenIndex BinaryenGetFlexibleInlineMaxSize(void) {
3608   return globalPassOptions.inlining.flexibleInlineMaxSize;
3609 }
3610 
BinaryenSetFlexibleInlineMaxSize(BinaryenIndex size)3611 void BinaryenSetFlexibleInlineMaxSize(BinaryenIndex size) {
3612   globalPassOptions.inlining.flexibleInlineMaxSize = size;
3613 }
3614 
BinaryenGetOneCallerInlineMaxSize(void)3615 BinaryenIndex BinaryenGetOneCallerInlineMaxSize(void) {
3616   return globalPassOptions.inlining.oneCallerInlineMaxSize;
3617 }
3618 
BinaryenSetOneCallerInlineMaxSize(BinaryenIndex size)3619 void BinaryenSetOneCallerInlineMaxSize(BinaryenIndex size) {
3620   globalPassOptions.inlining.oneCallerInlineMaxSize = size;
3621 }
3622 
BinaryenGetAllowInliningFunctionsWithLoops(void)3623 int BinaryenGetAllowInliningFunctionsWithLoops(void) {
3624   return globalPassOptions.inlining.allowFunctionsWithLoops;
3625 }
3626 
BinaryenSetAllowInliningFunctionsWithLoops(int enabled)3627 void BinaryenSetAllowInliningFunctionsWithLoops(int enabled) {
3628   globalPassOptions.inlining.allowFunctionsWithLoops = enabled;
3629 }
3630 
BinaryenModuleRunPasses(BinaryenModuleRef module,const char ** passes,BinaryenIndex numPasses)3631 void BinaryenModuleRunPasses(BinaryenModuleRef module,
3632                              const char** passes,
3633                              BinaryenIndex numPasses) {
3634   PassRunner passRunner((Module*)module);
3635   passRunner.options = globalPassOptions;
3636   for (BinaryenIndex i = 0; i < numPasses; i++) {
3637     passRunner.add(passes[i]);
3638   }
3639   passRunner.run();
3640 }
3641 
BinaryenModuleAutoDrop(BinaryenModuleRef module)3642 void BinaryenModuleAutoDrop(BinaryenModuleRef module) {
3643   auto* wasm = (Module*)module;
3644   PassRunner runner(wasm, globalPassOptions);
3645   AutoDrop().run(&runner, wasm);
3646 }
3647 
writeModule(BinaryenModuleRef module,char * output,size_t outputSize,const char * sourceMapUrl,char * sourceMap,size_t sourceMapSize)3648 static BinaryenBufferSizes writeModule(BinaryenModuleRef module,
3649                                        char* output,
3650                                        size_t outputSize,
3651                                        const char* sourceMapUrl,
3652                                        char* sourceMap,
3653                                        size_t sourceMapSize) {
3654   BufferWithRandomAccess buffer;
3655   WasmBinaryWriter writer((Module*)module, buffer);
3656   writer.setNamesSection(globalPassOptions.debugInfo);
3657   std::ostringstream os;
3658   if (sourceMapUrl) {
3659     writer.setSourceMap(&os, sourceMapUrl);
3660   }
3661   writer.write();
3662   size_t bytes = std::min(buffer.size(), outputSize);
3663   std::copy_n(buffer.begin(), bytes, output);
3664   size_t sourceMapBytes = 0;
3665   if (sourceMapUrl) {
3666     auto str = os.str();
3667     sourceMapBytes = std::min(str.length(), sourceMapSize);
3668     std::copy_n(str.c_str(), sourceMapBytes, sourceMap);
3669   }
3670   return {bytes, sourceMapBytes};
3671 }
3672 
3673 size_t
BinaryenModuleWrite(BinaryenModuleRef module,char * output,size_t outputSize)3674 BinaryenModuleWrite(BinaryenModuleRef module, char* output, size_t outputSize) {
3675   return writeModule((Module*)module, output, outputSize, nullptr, nullptr, 0)
3676     .outputBytes;
3677 }
3678 
BinaryenModuleWriteText(BinaryenModuleRef module,char * output,size_t outputSize)3679 size_t BinaryenModuleWriteText(BinaryenModuleRef module,
3680                                char* output,
3681                                size_t outputSize) {
3682   // use a stringstream as an std::ostream. Extract the std::string
3683   // representation, and then store in the output.
3684   std::stringstream ss;
3685   WasmPrinter::printModule((Module*)module, ss);
3686 
3687   const auto temp = ss.str();
3688   const auto ctemp = temp.c_str();
3689 
3690   strncpy(output, ctemp, outputSize);
3691   return std::min(outputSize, temp.size());
3692 }
3693 
BinaryenModuleWriteWithSourceMap(BinaryenModuleRef module,const char * url,char * output,size_t outputSize,char * sourceMap,size_t sourceMapSize)3694 BinaryenBufferSizes BinaryenModuleWriteWithSourceMap(BinaryenModuleRef module,
3695                                                      const char* url,
3696                                                      char* output,
3697                                                      size_t outputSize,
3698                                                      char* sourceMap,
3699                                                      size_t sourceMapSize) {
3700   assert(url);
3701   assert(sourceMap);
3702   return writeModule(
3703     (Module*)module, output, outputSize, url, sourceMap, sourceMapSize);
3704 }
3705 
3706 BinaryenModuleAllocateAndWriteResult
BinaryenModuleAllocateAndWrite(BinaryenModuleRef module,const char * sourceMapUrl)3707 BinaryenModuleAllocateAndWrite(BinaryenModuleRef module,
3708                                const char* sourceMapUrl) {
3709   BufferWithRandomAccess buffer;
3710   WasmBinaryWriter writer((Module*)module, buffer);
3711   writer.setNamesSection(globalPassOptions.debugInfo);
3712   std::ostringstream os;
3713   if (sourceMapUrl) {
3714     writer.setSourceMap(&os, sourceMapUrl);
3715   }
3716   writer.write();
3717   void* binary = malloc(buffer.size());
3718   std::copy_n(buffer.begin(), buffer.size(), static_cast<char*>(binary));
3719   char* sourceMap = nullptr;
3720   if (sourceMapUrl) {
3721     auto str = os.str();
3722     sourceMap = (char*)malloc(str.length() + 1);
3723     std::copy_n(str.c_str(), str.length() + 1, sourceMap);
3724   }
3725   return {binary, buffer.size(), sourceMap};
3726 }
3727 
BinaryenModuleAllocateAndWriteText(BinaryenModuleRef module)3728 char* BinaryenModuleAllocateAndWriteText(BinaryenModuleRef module) {
3729   std::stringstream ss;
3730   WasmPrinter::printModule((Module*)module, ss);
3731 
3732   const std::string out = ss.str();
3733   const int len = out.length() + 1;
3734   char* cout = (char*)malloc(len);
3735   strncpy(cout, out.c_str(), len);
3736   return cout;
3737 }
3738 
BinaryenModuleRead(char * input,size_t inputSize)3739 BinaryenModuleRef BinaryenModuleRead(char* input, size_t inputSize) {
3740   auto* wasm = new Module;
3741   std::vector<char> buffer(false);
3742   buffer.resize(inputSize);
3743   std::copy_n(input, inputSize, buffer.begin());
3744   try {
3745     WasmBinaryBuilder parser(*wasm, buffer);
3746     parser.read();
3747   } catch (ParseException& p) {
3748     p.dump(std::cerr);
3749     Fatal() << "error in parsing wasm binary";
3750   }
3751   return wasm;
3752 }
3753 
BinaryenModuleInterpret(BinaryenModuleRef module)3754 void BinaryenModuleInterpret(BinaryenModuleRef module) {
3755   ShellExternalInterface interface;
3756   ModuleInstance instance(*(Module*)module, &interface);
3757 }
3758 
BinaryenModuleAddDebugInfoFileName(BinaryenModuleRef module,const char * filename)3759 BinaryenIndex BinaryenModuleAddDebugInfoFileName(BinaryenModuleRef module,
3760                                                  const char* filename) {
3761   auto& debugInfoFileNames = ((Module*)module)->debugInfoFileNames;
3762   BinaryenIndex index = debugInfoFileNames.size();
3763   debugInfoFileNames.push_back(filename);
3764   return index;
3765 }
3766 
BinaryenModuleGetDebugInfoFileName(BinaryenModuleRef module,BinaryenIndex index)3767 const char* BinaryenModuleGetDebugInfoFileName(BinaryenModuleRef module,
3768                                                BinaryenIndex index) {
3769   const auto& debugInfoFileNames = ((Module*)module)->debugInfoFileNames;
3770   return index < debugInfoFileNames.size()
3771            ? debugInfoFileNames.at(index).c_str()
3772            : nullptr;
3773 }
3774 
3775 //
3776 // ========== Function Operations ==========
3777 //
3778 
BinaryenFunctionGetName(BinaryenFunctionRef func)3779 const char* BinaryenFunctionGetName(BinaryenFunctionRef func) {
3780   return ((Function*)func)->name.c_str();
3781 }
BinaryenFunctionGetParams(BinaryenFunctionRef func)3782 BinaryenType BinaryenFunctionGetParams(BinaryenFunctionRef func) {
3783   return ((Function*)func)->sig.params.getID();
3784 }
BinaryenFunctionGetResults(BinaryenFunctionRef func)3785 BinaryenType BinaryenFunctionGetResults(BinaryenFunctionRef func) {
3786   return ((Function*)func)->sig.results.getID();
3787 }
BinaryenFunctionGetNumVars(BinaryenFunctionRef func)3788 BinaryenIndex BinaryenFunctionGetNumVars(BinaryenFunctionRef func) {
3789   return ((Function*)func)->vars.size();
3790 }
BinaryenFunctionGetVar(BinaryenFunctionRef func,BinaryenIndex index)3791 BinaryenType BinaryenFunctionGetVar(BinaryenFunctionRef func,
3792                                     BinaryenIndex index) {
3793   const auto& vars = ((Function*)func)->vars;
3794   assert(index < vars.size());
3795   return vars[index].getID();
3796 }
BinaryenFunctionGetNumLocals(BinaryenFunctionRef func)3797 BinaryenIndex BinaryenFunctionGetNumLocals(BinaryenFunctionRef func) {
3798   return ((Function*)func)->getNumLocals();
3799 }
BinaryenFunctionHasLocalName(BinaryenFunctionRef func,BinaryenIndex index)3800 int BinaryenFunctionHasLocalName(BinaryenFunctionRef func,
3801                                  BinaryenIndex index) {
3802   return ((Function*)func)->hasLocalName(index);
3803 }
BinaryenFunctionGetLocalName(BinaryenFunctionRef func,BinaryenIndex index)3804 const char* BinaryenFunctionGetLocalName(BinaryenFunctionRef func,
3805                                          BinaryenIndex index) {
3806   return ((Function*)func)->getLocalName(index).str;
3807 }
BinaryenFunctionSetLocalName(BinaryenFunctionRef func,BinaryenIndex index,const char * name)3808 void BinaryenFunctionSetLocalName(BinaryenFunctionRef func,
3809                                   BinaryenIndex index,
3810                                   const char* name) {
3811   ((Function*)func)->setLocalName(index, name);
3812 }
BinaryenFunctionGetBody(BinaryenFunctionRef func)3813 BinaryenExpressionRef BinaryenFunctionGetBody(BinaryenFunctionRef func) {
3814   return ((Function*)func)->body;
3815 }
BinaryenFunctionSetBody(BinaryenFunctionRef func,BinaryenExpressionRef body)3816 void BinaryenFunctionSetBody(BinaryenFunctionRef func,
3817                              BinaryenExpressionRef body) {
3818   assert(body);
3819   ((Function*)func)->body = (Expression*)body;
3820 }
BinaryenFunctionOptimize(BinaryenFunctionRef func,BinaryenModuleRef module)3821 void BinaryenFunctionOptimize(BinaryenFunctionRef func,
3822                               BinaryenModuleRef module) {
3823   PassRunner passRunner((Module*)module);
3824   passRunner.options = globalPassOptions;
3825   passRunner.addDefaultOptimizationPasses();
3826   passRunner.runOnFunction((Function*)func);
3827 }
BinaryenFunctionRunPasses(BinaryenFunctionRef func,BinaryenModuleRef module,const char ** passes,BinaryenIndex numPasses)3828 void BinaryenFunctionRunPasses(BinaryenFunctionRef func,
3829                                BinaryenModuleRef module,
3830                                const char** passes,
3831                                BinaryenIndex numPasses) {
3832   PassRunner passRunner((Module*)module);
3833   passRunner.options = globalPassOptions;
3834   for (BinaryenIndex i = 0; i < numPasses; i++) {
3835     passRunner.add(passes[i]);
3836   }
3837   passRunner.runOnFunction((Function*)func);
3838 }
BinaryenFunctionSetDebugLocation(BinaryenFunctionRef func,BinaryenExpressionRef expr,BinaryenIndex fileIndex,BinaryenIndex lineNumber,BinaryenIndex columnNumber)3839 void BinaryenFunctionSetDebugLocation(BinaryenFunctionRef func,
3840                                       BinaryenExpressionRef expr,
3841                                       BinaryenIndex fileIndex,
3842                                       BinaryenIndex lineNumber,
3843                                       BinaryenIndex columnNumber) {
3844   Function::DebugLocation loc;
3845   loc.fileIndex = fileIndex;
3846   loc.lineNumber = lineNumber;
3847   loc.columnNumber = columnNumber;
3848   ((Function*)func)->debugLocations[(Expression*)expr] = loc;
3849 }
3850 
3851 //
3852 // =========== Global operations ===========
3853 //
3854 
BinaryenGlobalGetName(BinaryenGlobalRef global)3855 const char* BinaryenGlobalGetName(BinaryenGlobalRef global) {
3856   return ((Global*)global)->name.c_str();
3857 }
BinaryenGlobalGetType(BinaryenGlobalRef global)3858 BinaryenType BinaryenGlobalGetType(BinaryenGlobalRef global) {
3859   return ((Global*)global)->type.getID();
3860 }
BinaryenGlobalIsMutable(BinaryenGlobalRef global)3861 int BinaryenGlobalIsMutable(BinaryenGlobalRef global) {
3862   return ((Global*)global)->mutable_;
3863 }
BinaryenGlobalGetInitExpr(BinaryenGlobalRef global)3864 BinaryenExpressionRef BinaryenGlobalGetInitExpr(BinaryenGlobalRef global) {
3865   return ((Global*)global)->init;
3866 }
3867 
3868 //
3869 // =========== Event operations ===========
3870 //
3871 
BinaryenEventGetName(BinaryenEventRef event)3872 const char* BinaryenEventGetName(BinaryenEventRef event) {
3873   return ((Event*)event)->name.c_str();
3874 }
BinaryenEventGetAttribute(BinaryenEventRef event)3875 int BinaryenEventGetAttribute(BinaryenEventRef event) {
3876   return ((Event*)event)->attribute;
3877 }
BinaryenEventGetParams(BinaryenEventRef event)3878 BinaryenType BinaryenEventGetParams(BinaryenEventRef event) {
3879   return ((Event*)event)->sig.params.getID();
3880 }
3881 
BinaryenEventGetResults(BinaryenEventRef event)3882 BinaryenType BinaryenEventGetResults(BinaryenEventRef event) {
3883   return ((Event*)event)->sig.results.getID();
3884 }
3885 
3886 //
3887 // =========== Import operations ===========
3888 //
3889 
BinaryenFunctionImportGetModule(BinaryenFunctionRef import)3890 const char* BinaryenFunctionImportGetModule(BinaryenFunctionRef import) {
3891   auto* func = (Function*)import;
3892   if (func->imported()) {
3893     return func->module.c_str();
3894   } else {
3895     return "";
3896   }
3897 }
BinaryenGlobalImportGetModule(BinaryenGlobalRef import)3898 const char* BinaryenGlobalImportGetModule(BinaryenGlobalRef import) {
3899   auto* global = (Global*)import;
3900   if (global->imported()) {
3901     return global->module.c_str();
3902   } else {
3903     return "";
3904   }
3905 }
BinaryenEventImportGetModule(BinaryenEventRef import)3906 const char* BinaryenEventImportGetModule(BinaryenEventRef import) {
3907   auto* event = (Event*)import;
3908   if (event->imported()) {
3909     return event->module.c_str();
3910   } else {
3911     return "";
3912   }
3913 }
BinaryenFunctionImportGetBase(BinaryenFunctionRef import)3914 const char* BinaryenFunctionImportGetBase(BinaryenFunctionRef import) {
3915   auto* func = (Function*)import;
3916   if (func->imported()) {
3917     return func->base.c_str();
3918   } else {
3919     return "";
3920   }
3921 }
BinaryenGlobalImportGetBase(BinaryenGlobalRef import)3922 const char* BinaryenGlobalImportGetBase(BinaryenGlobalRef import) {
3923   auto* global = (Global*)import;
3924   if (global->imported()) {
3925     return global->base.c_str();
3926   } else {
3927     return "";
3928   }
3929 }
BinaryenEventImportGetBase(BinaryenEventRef import)3930 const char* BinaryenEventImportGetBase(BinaryenEventRef import) {
3931   auto* event = (Event*)import;
3932   if (event->imported()) {
3933     return event->base.c_str();
3934   } else {
3935     return "";
3936   }
3937 }
3938 
3939 //
3940 // =========== Export operations ===========
3941 //
3942 
BinaryenExportGetKind(BinaryenExportRef export_)3943 BinaryenExternalKind BinaryenExportGetKind(BinaryenExportRef export_) {
3944   return BinaryenExternalKind(((Export*)export_)->kind);
3945 }
BinaryenExportGetName(BinaryenExportRef export_)3946 const char* BinaryenExportGetName(BinaryenExportRef export_) {
3947   return ((Export*)export_)->name.c_str();
3948 }
BinaryenExportGetValue(BinaryenExportRef export_)3949 const char* BinaryenExportGetValue(BinaryenExportRef export_) {
3950   return ((Export*)export_)->value.c_str();
3951 }
BinaryenGetNumExports(BinaryenModuleRef module)3952 uint32_t BinaryenGetNumExports(BinaryenModuleRef module) {
3953   return ((Module*)module)->exports.size();
3954 }
BinaryenGetExportByIndex(BinaryenModuleRef module,BinaryenIndex id)3955 BinaryenExportRef BinaryenGetExportByIndex(BinaryenModuleRef module,
3956                                            BinaryenIndex id) {
3957   const auto& exports = ((Module*)module)->exports;
3958   if (exports.size() <= id) {
3959     Fatal() << "invalid export id.";
3960   }
3961   return exports[id].get();
3962 }
3963 
3964 //
3965 // ========= Custom sections =========
3966 //
3967 
BinaryenAddCustomSection(BinaryenModuleRef module,const char * name,const char * contents,BinaryenIndex contentsSize)3968 void BinaryenAddCustomSection(BinaryenModuleRef module,
3969                               const char* name,
3970                               const char* contents,
3971                               BinaryenIndex contentsSize) {
3972   wasm::UserSection customSection;
3973   customSection.name = name;
3974   customSection.data = std::vector<char>(contents, contents + contentsSize);
3975   ((Module*)module)->userSections.push_back(customSection);
3976 }
3977 
3978 //
3979 // ========= Effect analyzer =========
3980 //
3981 
BinaryenSideEffectNone(void)3982 BinaryenSideEffects BinaryenSideEffectNone(void) {
3983   return static_cast<BinaryenSideEffects>(EffectAnalyzer::SideEffects::None);
3984 }
BinaryenSideEffectBranches(void)3985 BinaryenSideEffects BinaryenSideEffectBranches(void) {
3986   return static_cast<BinaryenSideEffects>(
3987     EffectAnalyzer::SideEffects::Branches);
3988 }
BinaryenSideEffectCalls(void)3989 BinaryenSideEffects BinaryenSideEffectCalls(void) {
3990   return static_cast<BinaryenSideEffects>(EffectAnalyzer::SideEffects::Calls);
3991 }
BinaryenSideEffectReadsLocal(void)3992 BinaryenSideEffects BinaryenSideEffectReadsLocal(void) {
3993   return static_cast<BinaryenSideEffects>(
3994     EffectAnalyzer::SideEffects::ReadsLocal);
3995 }
BinaryenSideEffectWritesLocal(void)3996 BinaryenSideEffects BinaryenSideEffectWritesLocal(void) {
3997   return static_cast<BinaryenSideEffects>(
3998     EffectAnalyzer::SideEffects::WritesLocal);
3999 }
BinaryenSideEffectReadsGlobal(void)4000 BinaryenSideEffects BinaryenSideEffectReadsGlobal(void) {
4001   return static_cast<BinaryenSideEffects>(
4002     EffectAnalyzer::SideEffects::ReadsGlobal);
4003 }
BinaryenSideEffectWritesGlobal(void)4004 BinaryenSideEffects BinaryenSideEffectWritesGlobal(void) {
4005   return static_cast<BinaryenSideEffects>(
4006     EffectAnalyzer::SideEffects::WritesGlobal);
4007 }
BinaryenSideEffectReadsMemory(void)4008 BinaryenSideEffects BinaryenSideEffectReadsMemory(void) {
4009   return static_cast<BinaryenSideEffects>(
4010     EffectAnalyzer::SideEffects::ReadsMemory);
4011 }
BinaryenSideEffectWritesMemory(void)4012 BinaryenSideEffects BinaryenSideEffectWritesMemory(void) {
4013   return static_cast<BinaryenSideEffects>(
4014     EffectAnalyzer::SideEffects::WritesMemory);
4015 }
BinaryenSideEffectImplicitTrap(void)4016 BinaryenSideEffects BinaryenSideEffectImplicitTrap(void) {
4017   return static_cast<BinaryenSideEffects>(
4018     EffectAnalyzer::SideEffects::ImplicitTrap);
4019 }
BinaryenSideEffectIsAtomic(void)4020 BinaryenSideEffects BinaryenSideEffectIsAtomic(void) {
4021   return static_cast<BinaryenSideEffects>(
4022     EffectAnalyzer::SideEffects::IsAtomic);
4023 }
BinaryenSideEffectThrows(void)4024 BinaryenSideEffects BinaryenSideEffectThrows(void) {
4025   return static_cast<BinaryenSideEffects>(EffectAnalyzer::SideEffects::Throws);
4026 }
BinaryenSideEffectDanglingPop(void)4027 BinaryenSideEffects BinaryenSideEffectDanglingPop(void) {
4028   return static_cast<BinaryenSideEffects>(
4029     EffectAnalyzer::SideEffects::DanglingPop);
4030 }
BinaryenSideEffectAny(void)4031 BinaryenSideEffects BinaryenSideEffectAny(void) {
4032   return static_cast<BinaryenSideEffects>(EffectAnalyzer::SideEffects::Any);
4033 }
4034 
4035 BinaryenSideEffects
BinaryenExpressionGetSideEffects(BinaryenExpressionRef expr,BinaryenFeatures features)4036 BinaryenExpressionGetSideEffects(BinaryenExpressionRef expr,
4037                                  BinaryenFeatures features) {
4038   return EffectAnalyzer(globalPassOptions, features, (Expression*)expr)
4039     .getSideEffects();
4040 }
4041 
4042 //
4043 // ========== CFG / Relooper ==========
4044 //
4045 
RelooperCreate(BinaryenModuleRef module)4046 RelooperRef RelooperCreate(BinaryenModuleRef module) {
4047   return RelooperRef(new CFG::Relooper((Module*)module));
4048 }
4049 
RelooperAddBlock(RelooperRef relooper,BinaryenExpressionRef code)4050 RelooperBlockRef RelooperAddBlock(RelooperRef relooper,
4051                                   BinaryenExpressionRef code) {
4052   return RelooperBlockRef(
4053     ((CFG::Relooper*)relooper)->AddBlock((Expression*)code));
4054 }
4055 
RelooperAddBranch(RelooperBlockRef from,RelooperBlockRef to,BinaryenExpressionRef condition,BinaryenExpressionRef code)4056 void RelooperAddBranch(RelooperBlockRef from,
4057                        RelooperBlockRef to,
4058                        BinaryenExpressionRef condition,
4059                        BinaryenExpressionRef code) {
4060   ((CFG::Block*)from)
4061     ->AddBranchTo((CFG::Block*)to, (Expression*)condition, (Expression*)code);
4062 }
4063 
RelooperAddBlockWithSwitch(RelooperRef relooper,BinaryenExpressionRef code,BinaryenExpressionRef condition)4064 RelooperBlockRef RelooperAddBlockWithSwitch(RelooperRef relooper,
4065                                             BinaryenExpressionRef code,
4066                                             BinaryenExpressionRef condition) {
4067   return RelooperBlockRef(
4068     ((CFG::Relooper*)relooper)
4069       ->AddBlock((Expression*)code, (Expression*)condition));
4070 }
4071 
RelooperAddBranchForSwitch(RelooperBlockRef from,RelooperBlockRef to,BinaryenIndex * indexes,BinaryenIndex numIndexes,BinaryenExpressionRef code)4072 void RelooperAddBranchForSwitch(RelooperBlockRef from,
4073                                 RelooperBlockRef to,
4074                                 BinaryenIndex* indexes,
4075                                 BinaryenIndex numIndexes,
4076                                 BinaryenExpressionRef code) {
4077   std::vector<Index> values;
4078   for (Index i = 0; i < numIndexes; i++) {
4079     values.push_back(indexes[i]);
4080   }
4081   ((CFG::Block*)from)
4082     ->AddSwitchBranchTo((CFG::Block*)to, std::move(values), (Expression*)code);
4083 }
4084 
RelooperRenderAndDispose(RelooperRef relooper,RelooperBlockRef entry,BinaryenIndex labelHelper)4085 BinaryenExpressionRef RelooperRenderAndDispose(RelooperRef relooper,
4086                                                RelooperBlockRef entry,
4087                                                BinaryenIndex labelHelper) {
4088   auto* R = (CFG::Relooper*)relooper;
4089   R->Calculate((CFG::Block*)entry);
4090   CFG::RelooperBuilder builder(*R->Module, labelHelper);
4091   auto* ret = R->Render(builder);
4092   delete R;
4093   return BinaryenExpressionRef(ret);
4094 }
4095 
4096 //
4097 // ========= ExpressionRunner =========
4098 //
4099 
4100 namespace wasm {
4101 
4102 // Evaluates a suspected constant expression via the C-API. Inherits most of its
4103 // functionality from ConstantExpressionRunner, which it shares with the
4104 // precompute pass, but must be `final` so we can `delete` its instances.
4105 class CExpressionRunner final
4106   : public ConstantExpressionRunner<CExpressionRunner> {
4107 public:
CExpressionRunner(Module * module,CExpressionRunner::Flags flags,Index maxDepth,Index maxLoopIterations)4108   CExpressionRunner(Module* module,
4109                     CExpressionRunner::Flags flags,
4110                     Index maxDepth,
4111                     Index maxLoopIterations)
4112     : ConstantExpressionRunner<CExpressionRunner>(
4113         module, flags, maxDepth, maxLoopIterations) {}
4114 };
4115 
4116 } // namespace wasm
4117 
ExpressionRunnerFlagsDefault()4118 ExpressionRunnerFlags ExpressionRunnerFlagsDefault() {
4119   return CExpressionRunner::FlagValues::DEFAULT;
4120 }
4121 
ExpressionRunnerFlagsPreserveSideeffects()4122 ExpressionRunnerFlags ExpressionRunnerFlagsPreserveSideeffects() {
4123   return CExpressionRunner::FlagValues::PRESERVE_SIDEEFFECTS;
4124 }
4125 
ExpressionRunnerFlagsTraverseCalls()4126 ExpressionRunnerFlags ExpressionRunnerFlagsTraverseCalls() {
4127   return CExpressionRunner::FlagValues::TRAVERSE_CALLS;
4128 }
4129 
ExpressionRunnerCreate(BinaryenModuleRef module,ExpressionRunnerFlags flags,BinaryenIndex maxDepth,BinaryenIndex maxLoopIterations)4130 ExpressionRunnerRef ExpressionRunnerCreate(BinaryenModuleRef module,
4131                                            ExpressionRunnerFlags flags,
4132                                            BinaryenIndex maxDepth,
4133                                            BinaryenIndex maxLoopIterations) {
4134   return static_cast<ExpressionRunnerRef>(
4135     new CExpressionRunner((Module*)module, flags, maxDepth, maxLoopIterations));
4136 }
4137 
ExpressionRunnerSetLocalValue(ExpressionRunnerRef runner,BinaryenIndex index,BinaryenExpressionRef value)4138 int ExpressionRunnerSetLocalValue(ExpressionRunnerRef runner,
4139                                   BinaryenIndex index,
4140                                   BinaryenExpressionRef value) {
4141   auto* R = (CExpressionRunner*)runner;
4142   auto setFlow = R->visit(value);
4143   if (!setFlow.breaking()) {
4144     R->setLocalValue(index, setFlow.values);
4145     return 1;
4146   }
4147   return 0;
4148 }
4149 
ExpressionRunnerSetGlobalValue(ExpressionRunnerRef runner,const char * name,BinaryenExpressionRef value)4150 int ExpressionRunnerSetGlobalValue(ExpressionRunnerRef runner,
4151                                    const char* name,
4152                                    BinaryenExpressionRef value) {
4153   auto* R = (CExpressionRunner*)runner;
4154   auto setFlow = R->visit(value);
4155   if (!setFlow.breaking()) {
4156     R->setGlobalValue(name, setFlow.values);
4157     return 1;
4158   }
4159   return 0;
4160 }
4161 
4162 BinaryenExpressionRef
ExpressionRunnerRunAndDispose(ExpressionRunnerRef runner,BinaryenExpressionRef expr)4163 ExpressionRunnerRunAndDispose(ExpressionRunnerRef runner,
4164                               BinaryenExpressionRef expr) {
4165   auto* R = (CExpressionRunner*)runner;
4166   Expression* ret = nullptr;
4167   try {
4168     auto flow = R->visit(expr);
4169     if (!flow.breaking() && !flow.values.empty()) {
4170       ret = flow.getConstExpression(*R->getModule());
4171     }
4172   } catch (CExpressionRunner::NonconstantException&) {
4173   }
4174   delete R;
4175   return ret;
4176 }
4177 
4178 //
4179 // ========= Utilities =========
4180 //
4181 
BinaryenSetColorsEnabled(int enabled)4182 void BinaryenSetColorsEnabled(int enabled) { Colors::setEnabled(enabled); }
4183 
BinaryenAreColorsEnabled()4184 int BinaryenAreColorsEnabled() { return Colors::isEnabled(); }
4185 
4186 #ifdef __EMSCRIPTEN__
4187 // Override atexit - we don't need any global ctors to actually run, and
4188 // otherwise we get clutter in the output in debug builds
atexit(void (* function)(void))4189 int atexit(void (*function)(void)) { return 0; }
4190 
4191 // Internal binaryen.js APIs
4192 
4193 // Returns the size of a Literal object.
4194 EMSCRIPTEN_KEEPALIVE
BinaryenSizeofLiteral(void)4195 size_t BinaryenSizeofLiteral(void) { return sizeof(Literal); }
4196 
4197 // Returns the size of an allocate and write result object.
4198 EMSCRIPTEN_KEEPALIVE
BinaryenSizeofAllocateAndWriteResult(void)4199 size_t BinaryenSizeofAllocateAndWriteResult(void) {
4200   return sizeof(BinaryenModuleAllocateAndWriteResult);
4201 }
4202 
4203 // Helpers for accessing Binaryen's memory from another module without the
4204 // need to round-trip through JS, e.g. when allocating and initializing
4205 // strings passed to / reading strings returned by the C-API.
4206 
4207 // TODO: Remove these once Wasm supports multiple memories.
4208 
4209 // Stores an 8-bit integer to Binaryen memory.
4210 EMSCRIPTEN_KEEPALIVE
_i32_store8(int8_t * ptr,int8_t value)4211 void _i32_store8(int8_t* ptr, int8_t value) { *ptr = value; }
4212 
4213 // Stores a 16-bit integer to Binaryen memory.
4214 EMSCRIPTEN_KEEPALIVE
_i32_store16(int16_t * ptr,int16_t value)4215 void _i32_store16(int16_t* ptr, int16_t value) { *ptr = value; }
4216 
4217 // Stores a 32-bit integer to Binaryen memory.
4218 EMSCRIPTEN_KEEPALIVE
_i32_store(int32_t * ptr,int32_t value)4219 void _i32_store(int32_t* ptr, int32_t value) { *ptr = value; }
4220 
4221 // Stores a 32-bit float to Binaryen memory.
4222 EMSCRIPTEN_KEEPALIVE
_f32_store(float * ptr,float value)4223 void _f32_store(float* ptr, float value) { *ptr = value; }
4224 
4225 // Stores a 64-bit float to Binaryen memory.
4226 EMSCRIPTEN_KEEPALIVE
_f64_store(double * ptr,double value)4227 void _f64_store(double* ptr, double value) { *ptr = value; }
4228 
4229 // Loads an 8-bit signed integer from Binaryen memory.
4230 EMSCRIPTEN_KEEPALIVE
_i32_load8_s(int8_t * ptr)4231 int8_t _i32_load8_s(int8_t* ptr) { return *ptr; }
4232 
4233 // Loads an 8-bit unsigned integer from Binaryen memory.
4234 EMSCRIPTEN_KEEPALIVE
_i32_load8_u(uint8_t * ptr)4235 uint8_t _i32_load8_u(uint8_t* ptr) { return *ptr; }
4236 
4237 // Loads a 16-bit signed integer from Binaryen memory.
4238 EMSCRIPTEN_KEEPALIVE
_i32_load16_s(int16_t * ptr)4239 int16_t _i32_load16_s(int16_t* ptr) { return *ptr; }
4240 
4241 // Loads a 16-bit unsigned integer from Binaryen memory.
4242 EMSCRIPTEN_KEEPALIVE
_i32_load16_u(uint16_t * ptr)4243 uint16_t _i32_load16_u(uint16_t* ptr) { return *ptr; }
4244 
4245 // Loads a 32-bit integer from Binaryen memory.
4246 EMSCRIPTEN_KEEPALIVE
_i32_load(int32_t * ptr)4247 int32_t _i32_load(int32_t* ptr) { return *ptr; }
4248 
4249 // Loads a 32-bit float from Binaryen memory.
4250 EMSCRIPTEN_KEEPALIVE
_f32_load(float * ptr)4251 float _f32_load(float* ptr) { return *ptr; }
4252 
4253 // Loads a 64-bit float from Binaryen memory.
4254 EMSCRIPTEN_KEEPALIVE
_f64_load(double * ptr)4255 double _f64_load(double* ptr) { return *ptr; }
4256 
4257 #endif // __EMSCRIPTEN__
4258 
4259 } // extern "C"
4260