diff options
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java index 15b53278..3a2d134d 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java @@ -13,6 +13,7 @@ import org.shedlang.compiler.sources.Sources; import org.shedlang.compiler.stackir.StackIrNamespace; import org.shedlang.compiler.typechecker.TypeInfos; import org.shedlang.compiler.types.NamespaceName; +import org.shedlang.compiler.util.processes.ProcessError; import java.io.FileOutputStream; import java.io.IOException; @@ -56,24 +57,30 @@ public class WasmBackend implements Backend { } for (var bin : config.bins()) { - var ldArgs = new ArrayList<String>(); - ldArgs.add("wasm-ld"); - - ldArgs.add("-o"); - ldArgs.add(targetDir.resolve(bin.name() + ".wasm").toString()); - - for (var objectFilePath : objectFilePaths) { - ldArgs.add(objectFilePath.toString()); - } + var linkInputs = new ArrayList<>(objectFilePaths); var mainModule = this.generateMain(bin.mainNamespace(), typeInfos); var mainObjectPath = writeObjectFile(mainModule, targetDir.resolve("bins"), bin.name()); - ldArgs.add(mainObjectPath.toString()); + linkInputs.add(mainObjectPath); + + link(linkInputs, targetDir.resolve(bin.name() + ".wasm")); + } + } + + public static void link(List<Path> inputs, Path target) throws ProcessError, InterruptedException { + var ldArgs = new ArrayList<String>(); + ldArgs.add("wasm-ld"); - ldArgs.add(ShedCompilerFiles.getRoot().resolve("runtime/target/wasm/libshed.a").toString()); + ldArgs.add("-o"); + ldArgs.add(target.toString()); - runInheritIo(ldArgs); + for (var input : inputs) { + ldArgs.add(input.toString()); } + + ldArgs.add(ShedCompilerFiles.getRoot().resolve("runtime/target/wasm/libshed.a").toString()); + + runInheritIo(ldArgs); } private WasmModule generateMain(NamespaceName main, TypeInfos typeInfos) { |
