@@ -526,6 +526,7 @@ struct FunctionValidator : public WalkerPass<PostWalker<FunctionValidator>> {
526526 return info.shouldBeSubType (left, right, curr, text, getFunction ());
527527 }
528528
529+ void validateOffset (Address offset, Memory* mem, Expression* curr);
529530 void validateAlignment (
530531 size_t align, Type type, Index bytes, bool isAtomic, Expression* curr);
531532 void validateMemBytes (uint8_t bytes, Type type, Expression* curr);
@@ -1046,6 +1047,7 @@ void FunctionValidator::visitLoad(Load* curr) {
10461047 " SIMD operations require SIMD [--enable-simd]" );
10471048 }
10481049 validateMemBytes (curr->bytes , curr->type , curr);
1050+ validateOffset (curr->offset , memory, curr);
10491051 validateAlignment (curr->align , curr->type , curr->bytes , curr->isAtomic , curr);
10501052 shouldBeEqualOrFirstIsUnreachable (
10511053 curr->ptr ->type ,
@@ -1077,6 +1079,7 @@ void FunctionValidator::visitStore(Store* curr) {
10771079 " SIMD operations require SIMD [--enable-simd]" );
10781080 }
10791081 validateMemBytes (curr->bytes , curr->valueType , curr);
1082+ validateOffset (curr->offset , memory, curr);
10801083 validateAlignment (
10811084 curr->align , curr->valueType , curr->bytes , curr->isAtomic , curr);
10821085 shouldBeEqualOrFirstIsUnreachable (
@@ -1370,6 +1373,7 @@ void FunctionValidator::visitSIMDLoad(SIMDLoad* curr) {
13701373 break ;
13711374 }
13721375 Index bytes = curr->getMemBytes ();
1376+ validateOffset (curr->offset , memory, curr);
13731377 validateAlignment (curr->align , memAlignType, bytes, /* isAtomic=*/ false , curr);
13741378}
13751379
@@ -1423,6 +1427,7 @@ void FunctionValidator::visitSIMDLoadStoreLane(SIMDLoadStoreLane* curr) {
14231427 WASM_UNREACHABLE (" Unexpected SIMDLoadStoreLane op" );
14241428 }
14251429 Index bytes = curr->getMemBytes ();
1430+ validateOffset (curr->offset , memory, curr);
14261431 validateAlignment (curr->align , memAlignType, bytes, /* isAtomic=*/ false , curr);
14271432 shouldBeTrue (curr->index < lanes, curr, " invalid lane index" );
14281433}
@@ -3457,6 +3462,13 @@ void FunctionValidator::visitFunction(Function* curr) {
34573462 }
34583463}
34593464
3465+ void FunctionValidator::validateOffset (Address offset,
3466+ Memory* mem,
3467+ Expression* curr) {
3468+ shouldBeTrue (
3469+ mem->is64 () || offset < (1ull << 32 ), curr, " offset must be u32" );
3470+ }
3471+
34603472void FunctionValidator::validateAlignment (
34613473 size_t align, Type type, Index bytes, bool isAtomic, Expression* curr) {
34623474 if (isAtomic) {
0 commit comments