use of org.graalvm.wasm.Linker.ResolutionDag.Sym in project graal by oracle.
the class Linker method resolveGlobalImport.
void resolveGlobalImport(WasmContext context, WasmInstance instance, ImportDescriptor importDescriptor, int globalIndex, byte valueType, byte mutability) {
final String importedGlobalName = importDescriptor.memberName;
final String importedModuleName = importDescriptor.moduleName;
final Runnable resolveAction = () -> {
final WasmInstance importedInstance = context.moduleInstances().get(importedModuleName);
if (importedInstance == null) {
throw WasmException.create(Failure.UNKNOWN_IMPORT, "Module '" + importedModuleName + "', referenced in the import of global variable '" + importedGlobalName + "' into module '" + instance.name() + "', does not exist.");
}
// Check that the imported global is resolved in the imported module.
Integer exportedGlobalIndex = importedInstance.symbolTable().exportedGlobals().get(importedGlobalName);
if (exportedGlobalIndex == null) {
throw WasmException.create(Failure.UNKNOWN_IMPORT, "Global variable '" + importedGlobalName + "', imported into module '" + instance.name() + "', was not exported in the module '" + importedModuleName + "'.");
}
int exportedValueType = importedInstance.symbolTable().globalValueType(exportedGlobalIndex);
if (exportedValueType != valueType) {
throw WasmException.create(Failure.INCOMPATIBLE_IMPORT_TYPE, "Global variable '" + importedGlobalName + "' is imported into module '" + instance.name() + "' with the type " + WasmType.toString(valueType) + ", " + "'but it was exported in the module '" + importedModuleName + "' with the type " + WasmType.toString(exportedValueType) + ".");
}
int exportedMutability = importedInstance.symbolTable().globalMutability(exportedGlobalIndex);
if (exportedMutability != mutability) {
throw WasmException.create(Failure.INCOMPATIBLE_IMPORT_TYPE, "Global variable '" + importedGlobalName + "' is imported into module '" + instance.name() + "' with the modifier " + GlobalModifier.asString(mutability) + ", " + "'but it was exported in the module '" + importedModuleName + "' with the modifier " + GlobalModifier.asString(exportedMutability) + ".");
}
int address = importedInstance.globalAddress(exportedGlobalIndex);
instance.setGlobalAddress(globalIndex, address);
};
final ImportGlobalSym importGlobalSym = new ImportGlobalSym(instance.name(), importDescriptor, globalIndex);
final Sym[] dependencies = new Sym[] { new ExportGlobalSym(importedModuleName, importedGlobalName) };
resolutionDag.resolveLater(importGlobalSym, dependencies, resolveAction);
resolutionDag.resolveLater(new InitializeGlobalSym(instance.name(), globalIndex), new Sym[] { importGlobalSym }, NO_RESOLVE_ACTION);
}
use of org.graalvm.wasm.Linker.ResolutionDag.Sym in project graal by oracle.
the class Linker method resolveTableImport.
void resolveTableImport(WasmContext context, WasmInstance instance, ImportDescriptor importDescriptor, int declaredMinSize, int declaredMaxSize) {
final Runnable resolveAction = () -> {
final WasmInstance importedInstance = context.moduleInstances().get(importDescriptor.moduleName);
final String importedModuleName = importDescriptor.moduleName;
if (importedInstance == null) {
throw WasmException.create(Failure.UNKNOWN_IMPORT, String.format("Imported module '%s', referenced in module '%s', does not exist.", importedModuleName, instance.name()));
} else {
final String importedTableName = importDescriptor.memberName;
final List<String> exportedTableNames = importedInstance.symbolTable().exportedTableNames();
if (exportedTableNames.size() == 0) {
throw WasmException.create(Failure.UNKNOWN_IMPORT, String.format("The imported module '%s' does not export any tables, so cannot resolve table '%s' imported in module '%s'.", importedModuleName, importedTableName, instance.name()));
}
if (!exportedTableNames.contains(importedTableName)) {
throw WasmException.create(Failure.UNKNOWN_IMPORT, String.format("The imported module '%s' exports a table '%s', but module '%s' imports a table '%s'.", importedModuleName, exportedTableNames, instance.name(), importedTableName));
}
final WasmTable table = importedInstance.table();
// Rules for limits matching:
// https://webassembly.github.io/spec/core/exec/modules.html#limits
// If no max size is declared, then declaredMaxSize value will be
// MAX_TABLE_DECLARATION_SIZE, so this condition will pass.
assertUnsignedIntLessOrEqual(declaredMinSize, table.declaredMinSize(), Failure.INCOMPATIBLE_IMPORT_TYPE);
assertUnsignedIntGreaterOrEqual(declaredMaxSize, table.declaredMaxSize(), Failure.INCOMPATIBLE_IMPORT_TYPE);
instance.setTable(table);
}
};
Sym[] dependencies = new Sym[] { new ExportTableSym(importDescriptor.moduleName, importDescriptor.memberName) };
resolutionDag.resolveLater(new ImportTableSym(instance.name(), importDescriptor), dependencies, resolveAction);
}
use of org.graalvm.wasm.Linker.ResolutionDag.Sym in project graal by oracle.
the class Linker method resolveElemSegment.
void resolveElemSegment(WasmContext context, WasmInstance instance, int elemSegmentId, int offsetAddress, int offsetGlobalIndex, int[] functionsIndices) {
final Runnable resolveAction = () -> immediatelyResolveElemSegment(context, instance, elemSegmentId, offsetAddress, offsetGlobalIndex, functionsIndices);
final ArrayList<Sym> dependencies = new ArrayList<>();
if (instance.symbolTable().importedTable() != null) {
dependencies.add(new ImportTableSym(instance.name(), instance.symbolTable().importedTable()));
}
if (elemSegmentId > 0) {
dependencies.add(new ElemSym(instance.name(), elemSegmentId - 1));
}
if (offsetGlobalIndex != -1) {
dependencies.add(new InitializeGlobalSym(instance.name(), offsetGlobalIndex));
}
for (final int functionIndex : functionsIndices) {
final WasmFunction function = instance.module().function(functionIndex);
if (function.importDescriptor() != null) {
dependencies.add(new ImportFunctionSym(instance.name(), function.importDescriptor(), function.index()));
}
}
resolutionDag.resolveLater(new ElemSym(instance.name(), elemSegmentId), dependencies.toArray(new Sym[dependencies.size()]), resolveAction);
}
use of org.graalvm.wasm.Linker.ResolutionDag.Sym in project graal by oracle.
the class Linker method resolveDataSegment.
void resolveDataSegment(WasmContext context, WasmInstance instance, int dataSegmentId, int offsetAddress, int offsetGlobalIndex, int byteLength, byte[] data) {
assertTrue(instance.symbolTable().memoryExists(), String.format("No memory declared or imported in the module '%s'", instance.name()), Failure.UNSPECIFIED_MALFORMED);
final Runnable resolveAction = () -> {
WasmMemory memory = instance.memory();
Assert.assertNotNull(memory, String.format("No memory declared or imported in the module '%s'", instance.name()), Failure.UNSPECIFIED_MALFORMED);
int baseAddress;
if (offsetGlobalIndex != -1) {
final int offsetGlobalAddress = instance.globalAddress(offsetGlobalIndex);
assertTrue(offsetGlobalAddress != -1, "The global variable '" + offsetGlobalIndex + "' for the offset of the data segment " + dataSegmentId + " in module '" + instance.name() + "' was not initialized.", Failure.UNSPECIFIED_MALFORMED);
baseAddress = context.globals().loadAsInt(offsetGlobalAddress);
} else {
baseAddress = offsetAddress;
}
Assert.assertUnsignedIntLessOrEqual(baseAddress, WasmMath.toUnsignedIntExact(memory.byteSize()), Failure.DATA_SEGMENT_DOES_NOT_FIT);
Assert.assertUnsignedIntLessOrEqual(baseAddress + byteLength, WasmMath.toUnsignedIntExact(memory.byteSize()), Failure.DATA_SEGMENT_DOES_NOT_FIT);
for (int writeOffset = 0; writeOffset != byteLength; ++writeOffset) {
byte b = data[writeOffset];
memory.store_i32_8(null, baseAddress + writeOffset, b);
}
};
final ArrayList<Sym> dependencies = new ArrayList<>();
if (instance.symbolTable().importedMemory() != null) {
dependencies.add(new ImportMemorySym(instance.name(), instance.symbolTable().importedMemory()));
}
if (dataSegmentId > 0) {
dependencies.add(new DataSym(instance.name(), dataSegmentId - 1));
}
if (offsetGlobalIndex != -1) {
dependencies.add(new InitializeGlobalSym(instance.name(), offsetGlobalIndex));
}
resolutionDag.resolveLater(new DataSym(instance.name(), dataSegmentId), dependencies.toArray(new Sym[dependencies.size()]), resolveAction);
}
use of org.graalvm.wasm.Linker.ResolutionDag.Sym in project graal by oracle.
the class Linker method resolveCallsite.
void resolveCallsite(WasmInstance instance, WasmBlockNode block, int controlTableOffset, WasmFunction function) {
final Runnable resolveAction = () -> block.resolveCallNode(controlTableOffset);
final Sym[] dependencies = new Sym[] { function.isImported() ? new ImportFunctionSym(instance.name(), function.importDescriptor(), function.index()) : new CodeEntrySym(instance.name(), function.index()) };
resolutionDag.resolveLater(new CallsiteSym(instance.name(), block.startOffset(), controlTableOffset), dependencies, resolveAction);
}
Aggregations