Skip to content

Commit 2a0f44c

Browse files
committed
Set correct order of elem and data link actions in Instantiator
These actions have side effects and their ordering can matter insofar as one link action can fail and only the effects of those that came before should be observable.
1 parent a347f3a commit 2a0f44c

File tree

2 files changed

+104
-104
lines changed

2 files changed

+104
-104
lines changed

wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/Linker.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1357,7 +1357,7 @@ static class ImportTableSym extends Sym {
13571357

13581358
@Override
13591359
public String toString() {
1360-
return String.format("(import memory %s from %s into %s)", importDescriptor.memberName(), importDescriptor.moduleName(), moduleName);
1360+
return String.format("(import table %s from %s into %s)", importDescriptor.memberName(), importDescriptor.moduleName(), moduleName);
13611361
}
13621362

13631363
@Override
@@ -1435,7 +1435,7 @@ static class ElemSym extends Sym {
14351435

14361436
@Override
14371437
public String toString() {
1438-
return String.format(Locale.ROOT, "(data %d in %s)", elemSegmentId, moduleName);
1438+
return String.format(Locale.ROOT, "(elem %d in %s)", elemSegmentId, moduleName);
14391439
}
14401440

14411441
@Override

wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/WasmInstantiator.java

Lines changed: 102 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -229,108 +229,6 @@ static List<LinkAction> recreateLinkActions(WasmModule module) {
229229

230230
final byte[] bytecode = module.bytecode();
231231

232-
for (int i = 0; i < module.dataInstanceCount(); i++) {
233-
final int dataIndex = i;
234-
final int dataOffset = module.dataInstanceOffset(dataIndex);
235-
final int encoding = bytecode[dataOffset];
236-
int effectiveOffset = dataOffset + 1;
237-
238-
final int dataMode = encoding & BytecodeBitEncoding.DATA_SEG_MODE_VALUE;
239-
final int dataLength;
240-
switch (encoding & BytecodeBitEncoding.DATA_SEG_LENGTH_MASK) {
241-
case BytecodeBitEncoding.DATA_SEG_LENGTH_U8:
242-
dataLength = BinaryStreamParser.rawPeekU8(bytecode, effectiveOffset);
243-
effectiveOffset++;
244-
break;
245-
case BytecodeBitEncoding.DATA_SEG_LENGTH_U16:
246-
dataLength = BinaryStreamParser.rawPeekU16(bytecode, effectiveOffset);
247-
effectiveOffset += 2;
248-
break;
249-
case BytecodeBitEncoding.DATA_SEG_LENGTH_I32:
250-
dataLength = BinaryStreamParser.rawPeekI32(bytecode, effectiveOffset);
251-
effectiveOffset += 4;
252-
break;
253-
default:
254-
throw CompilerDirectives.shouldNotReachHere();
255-
}
256-
if (dataMode == SegmentMode.ACTIVE) {
257-
final long value;
258-
switch (encoding & BytecodeBitEncoding.DATA_SEG_VALUE_MASK) {
259-
case BytecodeBitEncoding.DATA_SEG_VALUE_UNDEFINED:
260-
value = -1;
261-
break;
262-
case BytecodeBitEncoding.DATA_SEG_VALUE_U8:
263-
value = BinaryStreamParser.rawPeekU8(bytecode, effectiveOffset);
264-
effectiveOffset++;
265-
break;
266-
case BytecodeBitEncoding.DATA_SEG_VALUE_U16:
267-
value = BinaryStreamParser.rawPeekU16(bytecode, effectiveOffset);
268-
effectiveOffset += 2;
269-
break;
270-
case BytecodeBitEncoding.DATA_SEG_VALUE_U32:
271-
value = BinaryStreamParser.rawPeekU32(bytecode, effectiveOffset);
272-
effectiveOffset += 4;
273-
break;
274-
case BytecodeBitEncoding.DATA_SEG_VALUE_I64:
275-
value = BinaryStreamParser.rawPeekI64(bytecode, effectiveOffset);
276-
effectiveOffset += 8;
277-
break;
278-
default:
279-
throw CompilerDirectives.shouldNotReachHere();
280-
}
281-
final byte[] dataOffsetBytecode;
282-
final long dataOffsetAddress;
283-
if ((encoding & BytecodeBitEncoding.DATA_SEG_BYTECODE_OR_OFFSET_MASK) == BytecodeBitEncoding.DATA_SEG_BYTECODE &&
284-
((encoding & BytecodeBitEncoding.DATA_SEG_VALUE_MASK) != BytecodeBitEncoding.DATA_SEG_VALUE_UNDEFINED)) {
285-
int dataOffsetBytecodeLength = (int) value;
286-
dataOffsetBytecode = Arrays.copyOfRange(bytecode, effectiveOffset, effectiveOffset + dataOffsetBytecodeLength);
287-
effectiveOffset += dataOffsetBytecodeLength;
288-
dataOffsetAddress = -1;
289-
} else {
290-
dataOffsetBytecode = null;
291-
dataOffsetAddress = value;
292-
}
293-
294-
final int memoryIndex;
295-
if ((encoding & BytecodeBitEncoding.DATA_SEG_HAS_MEMORY_INDEX_ZERO) != 0) {
296-
memoryIndex = 0;
297-
} else {
298-
final int memoryIndexEncoding = bytecode[effectiveOffset];
299-
effectiveOffset++;
300-
switch (memoryIndexEncoding & BytecodeBitEncoding.DATA_SEG_MEMORY_INDEX_MASK) {
301-
case BytecodeBitEncoding.DATA_SEG_MEMORY_INDEX_U6:
302-
memoryIndex = memoryIndexEncoding & BytecodeBitEncoding.DATA_SEG_MEMORY_INDEX_VALUE;
303-
break;
304-
case BytecodeBitEncoding.DATA_SEG_MEMORY_INDEX_U8:
305-
memoryIndex = BinaryStreamParser.rawPeekU8(bytecode, effectiveOffset);
306-
effectiveOffset++;
307-
break;
308-
case BytecodeBitEncoding.DATA_SEG_MEMORY_INDEX_U16:
309-
memoryIndex = BinaryStreamParser.rawPeekU16(bytecode, effectiveOffset);
310-
effectiveOffset += 2;
311-
break;
312-
case BytecodeBitEncoding.DATA_SEG_MEMORY_INDEX_I32:
313-
memoryIndex = BinaryStreamParser.rawPeekI32(bytecode, effectiveOffset);
314-
effectiveOffset += 4;
315-
break;
316-
default:
317-
throw CompilerDirectives.shouldNotReachHere();
318-
}
319-
}
320-
321-
final int dataBytecodeOffset = effectiveOffset;
322-
linkActions.add((context, store, instance, imports) -> {
323-
store.linker().resolveDataSegment(store, instance, dataIndex, memoryIndex, dataOffsetAddress, dataOffsetBytecode, dataLength,
324-
dataBytecodeOffset, instance.droppedDataInstanceOffset());
325-
});
326-
} else {
327-
final int dataBytecodeOffset = effectiveOffset;
328-
linkActions.add((context, store, instance, imports) -> {
329-
store.linker().resolvePassiveDataSegment(store, instance, dataIndex, dataBytecodeOffset);
330-
});
331-
}
332-
}
333-
334232
for (int i = 0; i < module.elemInstanceCount(); i++) {
335233
final int elemIndex = i;
336234
final int elemOffset = module.elemInstanceOffset(elemIndex);
@@ -450,6 +348,108 @@ static List<LinkAction> recreateLinkActions(WasmModule module) {
450348
}
451349
}
452350

351+
for (int i = 0; i < module.dataInstanceCount(); i++) {
352+
final int dataIndex = i;
353+
final int dataOffset = module.dataInstanceOffset(dataIndex);
354+
final int encoding = bytecode[dataOffset];
355+
int effectiveOffset = dataOffset + 1;
356+
357+
final int dataMode = encoding & BytecodeBitEncoding.DATA_SEG_MODE_VALUE;
358+
final int dataLength;
359+
switch (encoding & BytecodeBitEncoding.DATA_SEG_LENGTH_MASK) {
360+
case BytecodeBitEncoding.DATA_SEG_LENGTH_U8:
361+
dataLength = BinaryStreamParser.rawPeekU8(bytecode, effectiveOffset);
362+
effectiveOffset++;
363+
break;
364+
case BytecodeBitEncoding.DATA_SEG_LENGTH_U16:
365+
dataLength = BinaryStreamParser.rawPeekU16(bytecode, effectiveOffset);
366+
effectiveOffset += 2;
367+
break;
368+
case BytecodeBitEncoding.DATA_SEG_LENGTH_I32:
369+
dataLength = BinaryStreamParser.rawPeekI32(bytecode, effectiveOffset);
370+
effectiveOffset += 4;
371+
break;
372+
default:
373+
throw CompilerDirectives.shouldNotReachHere();
374+
}
375+
if (dataMode == SegmentMode.ACTIVE) {
376+
final long value;
377+
switch (encoding & BytecodeBitEncoding.DATA_SEG_VALUE_MASK) {
378+
case BytecodeBitEncoding.DATA_SEG_VALUE_UNDEFINED:
379+
value = -1;
380+
break;
381+
case BytecodeBitEncoding.DATA_SEG_VALUE_U8:
382+
value = BinaryStreamParser.rawPeekU8(bytecode, effectiveOffset);
383+
effectiveOffset++;
384+
break;
385+
case BytecodeBitEncoding.DATA_SEG_VALUE_U16:
386+
value = BinaryStreamParser.rawPeekU16(bytecode, effectiveOffset);
387+
effectiveOffset += 2;
388+
break;
389+
case BytecodeBitEncoding.DATA_SEG_VALUE_U32:
390+
value = BinaryStreamParser.rawPeekU32(bytecode, effectiveOffset);
391+
effectiveOffset += 4;
392+
break;
393+
case BytecodeBitEncoding.DATA_SEG_VALUE_I64:
394+
value = BinaryStreamParser.rawPeekI64(bytecode, effectiveOffset);
395+
effectiveOffset += 8;
396+
break;
397+
default:
398+
throw CompilerDirectives.shouldNotReachHere();
399+
}
400+
final byte[] dataOffsetBytecode;
401+
final long dataOffsetAddress;
402+
if ((encoding & BytecodeBitEncoding.DATA_SEG_BYTECODE_OR_OFFSET_MASK) == BytecodeBitEncoding.DATA_SEG_BYTECODE &&
403+
((encoding & BytecodeBitEncoding.DATA_SEG_VALUE_MASK) != BytecodeBitEncoding.DATA_SEG_VALUE_UNDEFINED)) {
404+
int dataOffsetBytecodeLength = (int) value;
405+
dataOffsetBytecode = Arrays.copyOfRange(bytecode, effectiveOffset, effectiveOffset + dataOffsetBytecodeLength);
406+
effectiveOffset += dataOffsetBytecodeLength;
407+
dataOffsetAddress = -1;
408+
} else {
409+
dataOffsetBytecode = null;
410+
dataOffsetAddress = value;
411+
}
412+
413+
final int memoryIndex;
414+
if ((encoding & BytecodeBitEncoding.DATA_SEG_HAS_MEMORY_INDEX_ZERO) != 0) {
415+
memoryIndex = 0;
416+
} else {
417+
final int memoryIndexEncoding = bytecode[effectiveOffset];
418+
effectiveOffset++;
419+
switch (memoryIndexEncoding & BytecodeBitEncoding.DATA_SEG_MEMORY_INDEX_MASK) {
420+
case BytecodeBitEncoding.DATA_SEG_MEMORY_INDEX_U6:
421+
memoryIndex = memoryIndexEncoding & BytecodeBitEncoding.DATA_SEG_MEMORY_INDEX_VALUE;
422+
break;
423+
case BytecodeBitEncoding.DATA_SEG_MEMORY_INDEX_U8:
424+
memoryIndex = BinaryStreamParser.rawPeekU8(bytecode, effectiveOffset);
425+
effectiveOffset++;
426+
break;
427+
case BytecodeBitEncoding.DATA_SEG_MEMORY_INDEX_U16:
428+
memoryIndex = BinaryStreamParser.rawPeekU16(bytecode, effectiveOffset);
429+
effectiveOffset += 2;
430+
break;
431+
case BytecodeBitEncoding.DATA_SEG_MEMORY_INDEX_I32:
432+
memoryIndex = BinaryStreamParser.rawPeekI32(bytecode, effectiveOffset);
433+
effectiveOffset += 4;
434+
break;
435+
default:
436+
throw CompilerDirectives.shouldNotReachHere();
437+
}
438+
}
439+
440+
final int dataBytecodeOffset = effectiveOffset;
441+
linkActions.add((context, store, instance, imports) -> {
442+
store.linker().resolveDataSegment(store, instance, dataIndex, memoryIndex, dataOffsetAddress, dataOffsetBytecode, dataLength,
443+
dataBytecodeOffset, instance.droppedDataInstanceOffset());
444+
});
445+
} else {
446+
final int dataBytecodeOffset = effectiveOffset;
447+
linkActions.add((context, store, instance, imports) -> {
448+
store.linker().resolvePassiveDataSegment(store, instance, dataIndex, dataBytecodeOffset);
449+
});
450+
}
451+
}
452+
453453
return linkActions;
454454
}
455455

0 commit comments

Comments
 (0)