summaryrefslogtreecommitdiff
path: root/src/main/java/no/eliashaugsbakk/kompilator/assembleAndLink/AssemblerAndLinker.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/no/eliashaugsbakk/kompilator/assembleAndLink/AssemblerAndLinker.java')
-rw-r--r--src/main/java/no/eliashaugsbakk/kompilator/assembleAndLink/AssemblerAndLinker.java75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/main/java/no/eliashaugsbakk/kompilator/assembleAndLink/AssemblerAndLinker.java b/src/main/java/no/eliashaugsbakk/kompilator/assembleAndLink/AssemblerAndLinker.java
new file mode 100644
index 0000000..5ab0b57
--- /dev/null
+++ b/src/main/java/no/eliashaugsbakk/kompilator/assembleAndLink/AssemblerAndLinker.java
@@ -0,0 +1,75 @@
+package no.eliashaugsbakk.kompilator.assembleAndLink;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import no.eliashaugsbakk.kompilator.IO.File;
+import no.eliashaugsbakk.kompilator.IO.FileReaderWriter;
+import no.eliashaugsbakk.kompilator.IO.FileReaderWriterException;
+
+public class AssemblerAndLinker {
+ private final FileReaderWriter fileReaderWriter;
+
+ public AssemblerAndLinker() {
+ fileReaderWriter = new FileReaderWriter();
+ }
+
+ public void assembleAndLink(String programName, String assembly) {
+ String assemblyFileName = programName + ".s";
+ String assembledFileName = programName + ".o";
+
+ try {
+ fileReaderWriter.writeFile(new File(assemblyFileName, assembly));
+ } catch (FileReaderWriterException e) {
+ IO.println("err: Could not write file: " + e.getMessage());
+ }
+
+ try {
+ // Assembling using: as -o program.o program.s
+ ProcessBuilder asPB = new ProcessBuilder("as", "-o", assembledFileName, assemblyFileName);
+ runProcess(asPB);
+ } catch (IOException e) {
+ IO.println("err: Failed to invoke GCC\n\n" + e);
+ } catch (InterruptedException e) {
+ IO.println("err: Failed to wait for gcc output\n\n" + e);
+ }
+
+ try {
+ // Linking using GNU linker: ld -o program program.o
+ ProcessBuilder ldPB = new ProcessBuilder("ld", "-o", programName, assembledFileName);
+ runProcess(ldPB);
+ } catch (IOException e) {
+ IO.println("err: Failed to invoke GCC\n\n" + e);
+ } catch (InterruptedException e) {
+ IO.println("err: Failed to wait for gcc output\n\n" + e);
+ }
+
+ // Clean up
+ try {
+ fileReaderWriter.deleteFile(assemblyFileName);
+ } catch (FileReaderWriterException e) {
+ IO.println("err: Could not delete assembly file: " + e.getMessage());
+ }
+ try {
+ fileReaderWriter.deleteFile(assembledFileName);
+ } catch (FileReaderWriterException e) {
+ IO.println("err: Could not delete assembled file: " + e.getMessage());
+ }
+ }
+
+ private static void runProcess(ProcessBuilder processBuilder)
+ throws IOException, InterruptedException {
+ Process process = processBuilder.start();
+ process.waitFor();
+ if (process.exitValue() != 0) {
+ BufferedReader bufferedReader =
+ new BufferedReader(new InputStreamReader(process.getErrorStream()));
+
+ String line;
+ while ((line = bufferedReader.readLine()) != null) {
+ System.out.println(line);
+ }
+ bufferedReader.close();
+ }
+ }
+}