Skip to content

Commit f99e5d5

Browse files
manoskoukV8 LUCI CQ
authored andcommitted
[wasm] WasmModuleBuilder should emit 'end' after an init. expr.
WriteInitializerExpressions did not emit the final 'end' opcode, and expected call sites to do so, which they did not do consistently. We move this functionality to WriteInitializerExpression. Change-Id: Idf42272a3dbdfd0d7f22675731e193584f75c41f Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3122159 Commit-Queue: Manos Koukoutos <manoskouk@chromium.org> Reviewed-by: Andreas Haas <ahaas@chromium.org> Cr-Commit-Position: refs/heads/main@{#76532}
1 parent 0f2d13f commit f99e5d5

1 file changed

Lines changed: 12 additions & 6 deletions

File tree

src/wasm/wasm-module-builder.cc

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -454,8 +454,9 @@ void WasmModuleBuilder::SetMaxMemorySize(uint32_t value) {
454454
void WasmModuleBuilder::SetHasSharedMemory() { has_shared_memory_ = true; }
455455

456456
namespace {
457-
void WriteInitializerExpression(ZoneBuffer* buffer, const WasmInitExpr& init,
458-
ValueType type) {
457+
void WriteInitializerExpressionWithEnd(ZoneBuffer* buffer,
458+
const WasmInitExpr& init,
459+
ValueType type) {
459460
switch (init.kind()) {
460461
case WasmInitExpr::kI32Const:
461462
buffer->write_u8(kExprI32Const);
@@ -534,7 +535,7 @@ void WriteInitializerExpression(ZoneBuffer* buffer, const WasmInitExpr& init,
534535
case WasmInitExpr::kStructNewWithRtt:
535536
STATIC_ASSERT((kExprStructNewWithRtt >> 8) == kGCPrefix);
536537
for (const WasmInitExpr& operand : init.operands()) {
537-
WriteInitializerExpression(buffer, operand, kWasmBottom);
538+
WriteInitializerExpressionWithEnd(buffer, operand, kWasmBottom);
538539
}
539540
buffer->write_u8(kGCPrefix);
540541
buffer->write_u8(static_cast<uint8_t>(kExprStructNewWithRtt));
@@ -543,7 +544,7 @@ void WriteInitializerExpression(ZoneBuffer* buffer, const WasmInitExpr& init,
543544
case WasmInitExpr::kArrayInit:
544545
STATIC_ASSERT((kExprArrayInit >> 8) == kGCPrefix);
545546
for (const WasmInitExpr& operand : init.operands()) {
546-
WriteInitializerExpression(buffer, operand, kWasmBottom);
547+
WriteInitializerExpressionWithEnd(buffer, operand, kWasmBottom);
547548
}
548549
buffer->write_u8(kGCPrefix);
549550
buffer->write_u8(static_cast<uint8_t>(kExprArrayInit));
@@ -559,7 +560,8 @@ void WriteInitializerExpression(ZoneBuffer* buffer, const WasmInitExpr& init,
559560
case WasmInitExpr::kRttSub:
560561
case WasmInitExpr::kRttFreshSub:
561562
// The operand to rtt.sub must be emitted first.
562-
WriteInitializerExpression(buffer, init.operands()[0], kWasmBottom);
563+
WriteInitializerExpressionWithEnd(buffer, init.operands()[0],
564+
kWasmBottom);
563565
STATIC_ASSERT((kExprRttSub >> 8) == kGCPrefix);
564566
STATIC_ASSERT((kExprRttFreshSub >> 8) == kGCPrefix);
565567
buffer->write_u8(kGCPrefix);
@@ -571,6 +573,11 @@ void WriteInitializerExpression(ZoneBuffer* buffer, const WasmInitExpr& init,
571573
}
572574
}
573575

576+
void WriteInitializerExpression(ZoneBuffer* buffer, const WasmInitExpr& init,
577+
ValueType type) {
578+
WriteInitializerExpressionWithEnd(buffer, init, type);
579+
buffer->write_u8(kExprEnd);
580+
}
574581
} // namespace
575582

576583
void WasmModuleBuilder::WriteTo(ZoneBuffer* buffer) const {
@@ -705,7 +712,6 @@ void WasmModuleBuilder::WriteTo(ZoneBuffer* buffer) const {
705712
WriteValueType(buffer, global.type);
706713
buffer->write_u8(global.mutability ? 1 : 0);
707714
WriteInitializerExpression(buffer, global.init, global.type);
708-
buffer->write_u8(kExprEnd);
709715
}
710716
FixupSection(buffer, start);
711717
}

0 commit comments

Comments
 (0)