use of org.graalvm.wasm.Linker.ResolutionDag.ExportGlobalSym 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.ExportGlobalSym in project graal by oracle.
the class Linker method resolveGlobalExport.
void resolveGlobalExport(WasmModule module, String globalName, int globalIndex) {
final Sym[] dependencies;
dependencies = new Sym[] { new InitializeGlobalSym(module.name(), globalIndex) };
resolutionDag.resolveLater(new ExportGlobalSym(module.name(), globalName), dependencies, NO_RESOLVE_ACTION);
}
Aggregations