Skip to content

Commit b08108e

Browse files
Library changes for relaxed atomics
1 parent f844de0 commit b08108e

File tree

8 files changed

+528
-161
lines changed

8 files changed

+528
-161
lines changed

src/binaryen-c.cpp

Lines changed: 94 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,18 @@ BinaryenExternalKind BinaryenExternalTag(void) {
419419
return static_cast<BinaryenExternalKind>(ExternalKind::Tag);
420420
}
421421

422+
// MemoryOrder for atomic operations
423+
424+
BINARYEN_API BinaryenMemoryOrder BinaryenMemoryOrderUnordered(void) {
425+
return static_cast<BinaryenMemoryOrder>(MemoryOrder::Unordered);
426+
}
427+
BINARYEN_API BinaryenMemoryOrder BinaryenMemoryOrderAcqRel(void) {
428+
return static_cast<BinaryenMemoryOrder>(MemoryOrder::AcqRel);
429+
}
430+
BINARYEN_API BinaryenMemoryOrder BinaryenMemoryOrderSeqCst(void) {
431+
return static_cast<BinaryenMemoryOrder>(MemoryOrder::SeqCst);
432+
}
433+
422434
// Features
423435

424436
BinaryenFeatures BinaryenFeatureMVP(void) {
@@ -1347,23 +1359,25 @@ BinaryenExpressionRef BinaryenAtomicLoad(BinaryenModuleRef module,
13471359
uint32_t offset,
13481360
BinaryenType type,
13491361
BinaryenExpressionRef ptr,
1350-
const char* memoryName) {
1362+
const char* memoryName,
1363+
BinaryenMemoryOrder order) {
13511364
return static_cast<Expression*>(
13521365
Builder(*(Module*)module)
13531366
.makeAtomicLoad(bytes,
13541367
offset,
13551368
(Expression*)ptr,
13561369
Type(type),
13571370
getMemoryName(module, memoryName),
1358-
MemoryOrder::SeqCst));
1371+
static_cast<MemoryOrder>(order)));
13591372
}
13601373
BinaryenExpressionRef BinaryenAtomicStore(BinaryenModuleRef module,
13611374
uint32_t bytes,
13621375
uint32_t offset,
13631376
BinaryenExpressionRef ptr,
13641377
BinaryenExpressionRef value,
13651378
BinaryenType type,
1366-
const char* memoryName) {
1379+
const char* memoryName,
1380+
BinaryenMemoryOrder order) {
13671381
return static_cast<Expression*>(
13681382
Builder(*(Module*)module)
13691383
.makeAtomicStore(bytes,
@@ -1372,7 +1386,7 @@ BinaryenExpressionRef BinaryenAtomicStore(BinaryenModuleRef module,
13721386
(Expression*)value,
13731387
Type(type),
13741388
getMemoryName(module, memoryName),
1375-
MemoryOrder::SeqCst));
1389+
static_cast<MemoryOrder>(order)));
13761390
}
13771391
BinaryenExpressionRef BinaryenAtomicRMW(BinaryenModuleRef module,
13781392
BinaryenOp op,
@@ -1381,7 +1395,8 @@ BinaryenExpressionRef BinaryenAtomicRMW(BinaryenModuleRef module,
13811395
BinaryenExpressionRef ptr,
13821396
BinaryenExpressionRef value,
13831397
BinaryenType type,
1384-
const char* memoryName) {
1398+
const char* memoryName,
1399+
BinaryenMemoryOrder order) {
13851400
return Builder(*(Module*)module)
13861401
.makeAtomicRMW(AtomicRMWOp(op),
13871402
bytes,
@@ -1390,7 +1405,7 @@ BinaryenExpressionRef BinaryenAtomicRMW(BinaryenModuleRef module,
13901405
(Expression*)value,
13911406
Type(type),
13921407
getMemoryName(module, memoryName),
1393-
MemoryOrder::SeqCst);
1408+
static_cast<MemoryOrder>(order));
13941409
}
13951410
BinaryenExpressionRef BinaryenAtomicCmpxchg(BinaryenModuleRef module,
13961411
BinaryenIndex bytes,
@@ -1399,16 +1414,18 @@ BinaryenExpressionRef BinaryenAtomicCmpxchg(BinaryenModuleRef module,
13991414
BinaryenExpressionRef expected,
14001415
BinaryenExpressionRef replacement,
14011416
BinaryenType type,
1402-
const char* memoryName) {
1403-
return Builder(*(Module*)module)
1404-
.makeAtomicCmpxchg(bytes,
1405-
offset,
1406-
(Expression*)ptr,
1407-
(Expression*)expected,
1408-
(Expression*)replacement,
1409-
Type(type),
1410-
getMemoryName(module, memoryName),
1411-
MemoryOrder::SeqCst);
1417+
const char* memoryName,
1418+
BinaryenMemoryOrder order) {
1419+
return static_cast<Expression*>(
1420+
Builder(*(Module*)module)
1421+
.makeAtomicCmpxchg(bytes,
1422+
offset,
1423+
(Expression*)ptr,
1424+
(Expression*)expected,
1425+
(Expression*)replacement,
1426+
Type(type),
1427+
getMemoryName(module, memoryName),
1428+
static_cast<MemoryOrder>(order)));
14121429
}
14131430
BinaryenExpressionRef BinaryenAtomicWait(BinaryenModuleRef module,
14141431
BinaryenExpressionRef ptr,
@@ -2647,6 +2664,21 @@ void BinaryenLoadSetAtomic(BinaryenExpressionRef expr, bool isAtomic) {
26472664
static_cast<Load*>(expression)->order =
26482665
isAtomic ? MemoryOrder::SeqCst : MemoryOrder::Unordered;
26492666
}
2667+
2668+
BinaryenMemoryOrder BinaryenLoadGetMemoryOrder(BinaryenExpressionRef expr) {
2669+
auto* expression = (Expression*)expr;
2670+
assert(expression->is<Load>());
2671+
return static_cast<BinaryenMemoryOrder>(
2672+
static_cast<Load*>(expression)->order);
2673+
}
2674+
2675+
void BinaryenLoadSetMemoryOrder(BinaryenExpressionRef expr,
2676+
BinaryenMemoryOrder order) {
2677+
auto* expression = (Expression*)expr;
2678+
assert(expression->is<Load>());
2679+
static_cast<Load*>(expression)->order = static_cast<MemoryOrder>(order);
2680+
}
2681+
26502682
bool BinaryenLoadIsSigned(BinaryenExpressionRef expr) {
26512683
auto* expression = (Expression*)expr;
26522684
assert(expression->is<Load>());
@@ -2711,6 +2743,21 @@ void BinaryenStoreSetAtomic(BinaryenExpressionRef expr, bool isAtomic) {
27112743
static_cast<Store*>(expression)->order =
27122744
isAtomic ? MemoryOrder::SeqCst : MemoryOrder::Unordered;
27132745
}
2746+
2747+
BinaryenMemoryOrder BinaryenStoreGetMemoryOrder(BinaryenExpressionRef expr) {
2748+
auto* expression = (Expression*)expr;
2749+
assert(expression->is<Store>());
2750+
return static_cast<BinaryenMemoryOrder>(
2751+
static_cast<Store*>(expression)->order);
2752+
}
2753+
2754+
void BinaryenStoreSetMemoryOrder(BinaryenExpressionRef expr,
2755+
BinaryenMemoryOrder order) {
2756+
auto* expression = (Expression*)expr;
2757+
assert(expression->is<Store>());
2758+
static_cast<Store*>(expression)->order = static_cast<MemoryOrder>(order);
2759+
}
2760+
27142761
uint32_t BinaryenStoreGetBytes(BinaryenExpressionRef expr) {
27152762
auto* expression = (Expression*)expr;
27162763
assert(expression->is<Store>());
@@ -3033,6 +3080,21 @@ void BinaryenAtomicRMWSetValue(BinaryenExpressionRef expr,
30333080
assert(valueExpr);
30343081
static_cast<AtomicRMW*>(expression)->value = (Expression*)valueExpr;
30353082
}
3083+
3084+
BinaryenMemoryOrder
3085+
BinaryenAtomicRMWGetMemoryOrder(BinaryenExpressionRef expr) {
3086+
auto* expression = (Expression*)expr;
3087+
assert(expression->is<AtomicRMW>());
3088+
return static_cast<BinaryenMemoryOrder>(
3089+
static_cast<AtomicRMW*>(expression)->order);
3090+
}
3091+
3092+
void BinaryenAtomicRMWSetMemoryOrder(BinaryenExpressionRef expr,
3093+
BinaryenMemoryOrder order) {
3094+
auto* expression = (Expression*)expr;
3095+
assert(expression->is<AtomicRMW>());
3096+
static_cast<AtomicRMW*>(expression)->order = static_cast<MemoryOrder>(order);
3097+
}
30363098
// AtomicCmpxchg
30373099
uint32_t BinaryenAtomicCmpxchgGetBytes(BinaryenExpressionRef expr) {
30383100
auto* expression = (Expression*)expr;
@@ -3094,6 +3156,22 @@ void BinaryenAtomicCmpxchgSetReplacement(
30943156
static_cast<AtomicCmpxchg*>(expression)->replacement =
30953157
(Expression*)replacementExpr;
30963158
}
3159+
3160+
BinaryenMemoryOrder
3161+
BinaryenAtomicCmpxchgGetMemoryOrder(BinaryenExpressionRef expr) {
3162+
auto* expression = (Expression*)expr;
3163+
assert(expression->is<AtomicCmpxchg>());
3164+
return static_cast<BinaryenMemoryOrder>(
3165+
static_cast<AtomicCmpxchg*>(expression)->order);
3166+
}
3167+
3168+
void BinaryenAtomicCmpxchgSetMemoryOrder(BinaryenExpressionRef expr,
3169+
BinaryenMemoryOrder order) {
3170+
auto* expression = (Expression*)expr;
3171+
assert(expression->is<AtomicCmpxchg>());
3172+
static_cast<AtomicCmpxchg*>(expression)->order =
3173+
static_cast<MemoryOrder>(order);
3174+
}
30973175
// AtomicWait
30983176
BinaryenExpressionRef BinaryenAtomicWaitGetPtr(BinaryenExpressionRef expr) {
30993177
auto* expression = (Expression*)expr;

src/binaryen-c.h

Lines changed: 71 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,19 @@ BINARYEN_API BinaryenExternalKind BinaryenExternalMemory(void);
203203
BINARYEN_API BinaryenExternalKind BinaryenExternalGlobal(void);
204204
BINARYEN_API BinaryenExternalKind BinaryenExternalTag(void);
205205

206+
// MemoryOrder for atomic operations
207+
208+
typedef uint8_t BinaryenMemoryOrder;
209+
210+
BINARYEN_API BinaryenMemoryOrder BinaryenMemoryOrderUnordered(void);
211+
212+
// Acquire/Release atomic memory operation; acquire for loads, release for
213+
// stores.
214+
BINARYEN_API BinaryenMemoryOrder BinaryenMemoryOrderAcqRel(void);
215+
216+
// Sequentially consistent atomic memory operation.
217+
BINARYEN_API BinaryenMemoryOrder BinaryenMemoryOrderSeqCst(void);
218+
206219
// Features. Call to get the value of each; you can cache them. Use bitwise
207220
// operators to combine and test particular features.
208221

@@ -844,20 +857,23 @@ BinaryenMemoryGrow(BinaryenModuleRef module,
844857
BINARYEN_API BinaryenExpressionRef BinaryenNop(BinaryenModuleRef module);
845858
BINARYEN_API BinaryenExpressionRef
846859
BinaryenUnreachable(BinaryenModuleRef module);
847-
BINARYEN_API BinaryenExpressionRef BinaryenAtomicLoad(BinaryenModuleRef module,
848-
uint32_t bytes,
849-
uint32_t offset,
850-
BinaryenType type,
851-
BinaryenExpressionRef ptr,
852-
const char* memoryName);
860+
BINARYEN_API BinaryenExpressionRef
861+
BinaryenAtomicLoad(BinaryenModuleRef module,
862+
uint32_t bytes,
863+
uint32_t offset,
864+
BinaryenType type,
865+
BinaryenExpressionRef ptr,
866+
const char* memoryName,
867+
BinaryenMemoryOrder order);
853868
BINARYEN_API BinaryenExpressionRef
854869
BinaryenAtomicStore(BinaryenModuleRef module,
855870
uint32_t bytes,
856871
uint32_t offset,
857872
BinaryenExpressionRef ptr,
858873
BinaryenExpressionRef value,
859874
BinaryenType type,
860-
const char* memoryName);
875+
const char* memoryName,
876+
BinaryenMemoryOrder order);
861877
BINARYEN_API BinaryenExpressionRef
862878
BinaryenAtomicRMW(BinaryenModuleRef module,
863879
BinaryenOp op,
@@ -866,7 +882,8 @@ BinaryenAtomicRMW(BinaryenModuleRef module,
866882
BinaryenExpressionRef ptr,
867883
BinaryenExpressionRef value,
868884
BinaryenType type,
869-
const char* memoryName);
885+
const char* memoryName,
886+
BinaryenMemoryOrder order);
870887
BINARYEN_API BinaryenExpressionRef
871888
BinaryenAtomicCmpxchg(BinaryenModuleRef module,
872889
BinaryenIndex bytes,
@@ -875,7 +892,8 @@ BinaryenAtomicCmpxchg(BinaryenModuleRef module,
875892
BinaryenExpressionRef expected,
876893
BinaryenExpressionRef replacement,
877894
BinaryenType type,
878-
const char* memoryName);
895+
const char* memoryName,
896+
BinaryenMemoryOrder order);
879897
BINARYEN_API BinaryenExpressionRef
880898
BinaryenAtomicWait(BinaryenModuleRef module,
881899
BinaryenExpressionRef ptr,
@@ -1536,11 +1554,21 @@ BINARYEN_API void BinaryenMemoryGrowSetDelta(BinaryenExpressionRef expr,
15361554

15371555
// Load
15381556

1539-
// Gets whether a `load` expression is atomic (is an `atomic.load`).
1557+
// Gets whether a `load` expression is atomic (is an `atomic.load`). See also
1558+
// `BinaryenLoadGetMemoryOrder`.
15401559
BINARYEN_API bool BinaryenLoadIsAtomic(BinaryenExpressionRef expr);
1541-
// Sets whether a `load` expression is atomic (is an `atomic.load`).
1542-
BINARYEN_API void BinaryenLoadSetAtomic(BinaryenExpressionRef expr,
1543-
bool isAtomic);
1560+
// Deprecated in favor of `BinaryenLoadSetMemoryOrder`. Sets a `load`'s memory
1561+
// ordering to `BinaryenMemoryOrderSeqCst`.
1562+
WASM_DEPRECATED BINARYEN_API void
1563+
BinaryenLoadSetAtomic(BinaryenExpressionRef expr, bool isAtomic);
1564+
// Get the (atomic / non-atomic) memory order of a Load. See
1565+
// `BinaryenMemoryOrder`.
1566+
BINARYEN_API BinaryenMemoryOrder
1567+
BinaryenLoadGetMemoryOrder(BinaryenExpressionRef expr);
1568+
// Set the (atomic / non-atomic) memory order of a Load. See
1569+
// `BinaryenMemoryOrder`.
1570+
BINARYEN_API void BinaryenLoadSetMemoryOrder(BinaryenExpressionRef expr,
1571+
BinaryenMemoryOrder order);
15441572
// Gets whether a `load` expression operates on a signed value (`_s`).
15451573
BINARYEN_API bool BinaryenLoadIsSigned(BinaryenExpressionRef expr);
15461574
// Sets whether a `load` expression operates on a signed value (`_s`).
@@ -1570,11 +1598,21 @@ BINARYEN_API void BinaryenLoadSetPtr(BinaryenExpressionRef expr,
15701598

15711599
// Store
15721600

1573-
// Gets whether a `store` expression is atomic (is an `atomic.store`).
1601+
// Gets whether a `store` expression is atomic (is an `atomic.store`). See also
1602+
// `BinaryenStoreGetMemoryOrder`.
15741603
BINARYEN_API bool BinaryenStoreIsAtomic(BinaryenExpressionRef expr);
1575-
// Sets whether a `store` expression is atomic (is an `atomic.store`).
1576-
BINARYEN_API void BinaryenStoreSetAtomic(BinaryenExpressionRef expr,
1577-
bool isAtomic);
1604+
// Deprecated in favtor of `BinaryenStoreSetMemoryOrder`. Sets a `store`'s
1605+
// memory ordering to `BinaryenMemoryOrderSeqCst`.
1606+
WASM_DEPRECATED BINARYEN_API void
1607+
BinaryenStoreSetAtomic(BinaryenExpressionRef expr, bool isAtomic);
1608+
// Get the (atomic / non-atomic) memory order of a Store. See
1609+
// `BinaryenMemoryOrder`.
1610+
BINARYEN_API BinaryenMemoryOrder
1611+
BinaryenStoreGetMemoryOrder(BinaryenExpressionRef expr);
1612+
// Set the (atomic / non-atomic) memory order of a Store. See
1613+
// `BinaryenMemoryOrder`.
1614+
BINARYEN_API void BinaryenStoreSetMemoryOrder(BinaryenExpressionRef expr,
1615+
BinaryenMemoryOrder order);
15781616
// Gets the number of bytes stored by a `store` expression.
15791617
BINARYEN_API uint32_t BinaryenStoreGetBytes(BinaryenExpressionRef expr);
15801618
// Sets the number of bytes stored by a `store` expression.
@@ -1756,6 +1794,13 @@ BinaryenAtomicRMWGetValue(BinaryenExpressionRef expr);
17561794
// Sets the value expression of an atomic read-modify-write expression.
17571795
BINARYEN_API void BinaryenAtomicRMWSetValue(BinaryenExpressionRef expr,
17581796
BinaryenExpressionRef valueExpr);
1797+
// Gets the memory order of an atomic read-modify-write expression. See
1798+
// `BinaryenMemoryOrder`.
1799+
BINARYEN_API BinaryenMemoryOrder
1800+
BinaryenAtomicRMWGetMemoryOrder(BinaryenExpressionRef expr);
1801+
// Sets the atomic memory order of a Store. See `BinaryenMemoryOrder`.
1802+
BINARYEN_API void BinaryenAtomicRMWSetMemoryOrder(BinaryenExpressionRef expr,
1803+
BinaryenMemoryOrder order);
17591804

17601805
// AtomicCmpxchg
17611806

@@ -1794,6 +1839,15 @@ BinaryenAtomicCmpxchgGetReplacement(BinaryenExpressionRef expr);
17941839
BINARYEN_API void
17951840
BinaryenAtomicCmpxchgSetReplacement(BinaryenExpressionRef expr,
17961841
BinaryenExpressionRef replacementExpr);
1842+
// Gets the memory order of an atomic compare and exchange expression. See
1843+
// `BinaryenMemoryOrder`.
1844+
BINARYEN_API BinaryenMemoryOrder
1845+
BinaryenAtomicCmpxchgGetMemoryOrder(BinaryenExpressionRef expr);
1846+
// Sets the memory order of an atomic compare and exchange expression. See
1847+
// `BinaryenMemoryOrder`.
1848+
BINARYEN_API void
1849+
BinaryenAtomicCmpxchgSetMemoryOrder(BinaryenExpressionRef expr,
1850+
BinaryenMemoryOrder order);
17971851

17981852
// AtomicWait
17991853

0 commit comments

Comments
 (0)