From 1d947a749a5772b25c30cad1c8e3f8ec6d7b22ca Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 20 Jul 2023 14:02:20 +0100 Subject: Include data layout when loading from and storing to memory --- .../compiler/patio/PatioSerializerTests.java | 53 ++++++++++++++++++++-- .../org/shedlang/compiler/patio/PatioTesting.java | 7 +++ .../compiler/patio/instructions/Patio.java | 17 ++++++- 3 files changed, 71 insertions(+), 6 deletions(-) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java b/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java index e02c18ca..5f7f83c9 100644 --- a/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java +++ b/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java @@ -11,6 +11,8 @@ import static org.zwobble.precisely.AssertThat.assertThat; import static org.zwobble.precisely.Matchers.equalTo; public class PatioSerializerTests { + // == Compilation unit elements == + @Test public void canSerializeFunctionDefinition() { var element = PatioFunctionDefinition.builder() @@ -29,6 +31,8 @@ public class PatioSerializerTests { )); } + // == Instructions == + @Test public void canSerializeAlloc() { var instruction = Patio.alloc("x", 42); @@ -80,20 +84,46 @@ public class PatioSerializerTests { @Test public void canSerializeMemoryLoad() { - var instruction = Patio.memoryLoad("target", "pointer", 4); + var instruction = Patio.memoryLoad( + "target", + "pointer", + PatioTypes.struct(List.of(PatioTypes.INT, PatioTypes.INT, PatioTypes.DATA_POINTER)), + 1 + ); var string = PatioTesting.serializeInstruction(instruction); - assertThat(string, equalTo("(memory-load \"target\" pointer=\"pointer\" offset=4)")); + assertThat(string, equalTo(""" + ( + memory-load + "target" + pointer="pointer" + layout=(struct (int int data-ptr)) + offset=1 + )""" + )); } @Test public void canSerializeMemoryStore() { - var instruction = Patio.memoryStore("pointer", 4, "value"); + var instruction = Patio.memoryStore( + "pointer", + PatioTypes.struct(List.of(PatioTypes.INT, PatioTypes.INT, PatioTypes.DATA_POINTER)), + 1, + "value" + ); var string = PatioTesting.serializeInstruction(instruction); - assertThat(string, equalTo("(memory-store pointer=\"pointer\" offset=4 value=\"value\")")); + assertThat(string, equalTo(""" + ( + memory-store + pointer="pointer" + layout=(struct (int int data-ptr)) + offset=1 + value="value" + )""" + )); } @Test @@ -105,6 +135,8 @@ public class PatioSerializerTests { assertThat(string, equalTo("(return \"value\")")); } + // == Types == + @Test public void canSerializeDataPointerType() { var type = PatioTypes.DATA_POINTER; @@ -131,4 +163,17 @@ public class PatioSerializerTests { assertThat(string, equalTo("int")); } + + // == Data layouts == + + @Test + public void canSerializeStruct() { + var layout = PatioTypes.struct(List.of(PatioTypes.INT, PatioTypes.INT, PatioTypes.DATA_POINTER)); + + var string = PatioTesting.serializeDataLayout(layout); + + assertThat(string, equalTo(""" + (struct (int int data-ptr))""" + )); + } } diff --git a/src/test/java/org/shedlang/compiler/patio/PatioTesting.java b/src/test/java/org/shedlang/compiler/patio/PatioTesting.java index 5996a44e..8dd331e7 100644 --- a/src/test/java/org/shedlang/compiler/patio/PatioTesting.java +++ b/src/test/java/org/shedlang/compiler/patio/PatioTesting.java @@ -3,6 +3,7 @@ package org.shedlang.compiler.patio; import org.shedlang.compiler.patio.ast.PatioCompilationUnitElement; import org.shedlang.compiler.patio.ast.PatioSerializer; import org.shedlang.compiler.patio.ast.instructions.PatioInstruction; +import org.shedlang.compiler.patio.ast.types.PatioDataLayout; import org.shedlang.compiler.patio.ast.types.PatioType; class PatioTesting { @@ -47,6 +48,12 @@ class PatioTesting { return builder.toString(); } + public static String serializeDataLayout(PatioDataLayout layout) { + var builder = new StringBuilder(); + PatioSerializer.serializeDataLayout(layout, builder); + return builder.toString(); + } + static String serializeInstruction(PatioInstruction instruction) { var builder = new StringBuilder(); PatioSerializer.serializeInstruction(instruction, builder); diff --git a/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java b/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java index cfb81d83..42808bd4 100644 --- a/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java +++ b/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java @@ -2,6 +2,7 @@ package org.shedlang.compiler.patio.instructions; import org.shedlang.compiler.patio.ast.PatioLocalRef; import org.shedlang.compiler.patio.ast.instructions.*; +import org.shedlang.compiler.patio.ast.types.PatioDataLayout; import org.shedlang.compiler.sources.Sources; import java.util.List; @@ -44,18 +45,30 @@ public class Patio { ); } - public static PatioInstruction memoryLoad(String target, String pointer, int offset) { + public static PatioInstruction memoryLoad( + String target, + String pointer, + PatioDataLayout layout, + int offset + ) { return new PatioMemoryLoad( new PatioLocalRef(target), new PatioLocalRef(pointer), + layout, offset, Sources.NULL ); } - public static PatioInstruction memoryStore(String pointer, int offset, String value) { + public static PatioInstruction memoryStore( + String pointer, + PatioDataLayout layout, + int offset, + String value + ) { return new PatioMemoryStore( new PatioLocalRef(pointer), + layout, offset, new PatioLocalRef(value), Sources.NULL -- cgit v1.2.3