aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-01-27 00:29:34 +0000
committerMichael Williamson <mike@zwobble.org>2024-01-27 00:29:45 +0000
commit4e116e25a5c0d9b9b7f92e3c363a93902eaf19d6 (patch)
tree5f9f838714bc1b604f1e8873684e322a9326c028 /src/main/java
parentfa664754ddf04071414d2d103402b0028af681c1 (diff)
Reduce size of GC header
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java36
-rw-r--r--src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioGc.java17
2 files changed, 38 insertions, 15 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java
index da6edbea..c185c016 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java
@@ -1132,10 +1132,18 @@ public class PatioToLlvm {
new LlvmVariableGlobal(patioFunctionPtrConst.name());
case PatioIntConst patioIntConst ->
- patioIntValueToLlvmOperand(patioIntConst.value(), context.target());
+ patioIntValueToLlvmOperand(
+ patioIntConst.value(),
+ PatioTypes.INT,
+ context.target()
+ );
case PatioInt32Const patioInt32Const ->
- patioIntValueToLlvmOperand(patioInt32Const.value(), context.target());
+ patioIntValueToLlvmOperand(
+ patioInt32Const.value(),
+ PatioTypes.INT32,
+ context.target()
+ );
case PatioLocalRef patioLocalRef ->
context.patioLocalToOperand(patioLocalRef);
@@ -1144,6 +1152,7 @@ public class PatioToLlvm {
private static LlvmOperand patioIntValueToLlvmOperand(
PatioIntValue patioIntConst,
+ PatioType patioDestinationType,
LlvmTarget target
) {
return switch (patioIntConst) {
@@ -1151,12 +1160,14 @@ public class PatioToLlvm {
offsetOf(
byteOffsetOf.layout(),
byteOffsetOf.offset(),
+ patioDestinationType,
target
);
case PatioIntValueByteSizeOf byteSizeOf ->
sizeOf(
byteSizeOf.layout(),
+ patioDestinationType,
target
);
@@ -1313,10 +1324,18 @@ public class PatioToLlvm {
new LlvmOperandNull();
case PatioDataValueInt patioDataValueInt ->
- patioIntValueToLlvmOperand(patioDataValueInt.value(), target);
+ patioIntValueToLlvmOperand(
+ patioDataValueInt.value(),
+ PatioTypes.INT,
+ target
+ );
case PatioDataValueInt32 patioDataValueInt32 ->
- patioIntValueToLlvmOperand(patioDataValueInt32.value(), target);
+ patioIntValueToLlvmOperand(
+ patioDataValueInt32.value(),
+ PatioTypes.INT32,
+ target
+ );
case PatioDataValueStruct patioDataValueStruct ->
new LlvmOperandStructure(
@@ -1332,6 +1351,7 @@ public class PatioToLlvm {
private static LlvmOperand sizeOf(
PatioDataLayout layout,
+ PatioType patioDestinationType,
LlvmTarget target
) {
var llvmType = patioDataLayoutToLlvmType(
@@ -1339,11 +1359,12 @@ public class PatioToLlvm {
target
);
- return sizeOf(llvmType, target);
+ return sizeOf(llvmType, patioDestinationType, target);
}
private static LlvmOperand sizeOf(
LlvmType type,
+ PatioType patioDestinationType,
LlvmTarget target
) {
var sizePtr = new LlvmOperandGetElementPtr(
@@ -1353,13 +1374,14 @@ public class PatioToLlvm {
);
return new LlvmOperandPtrToInt(
sizePtr,
- target.patioIntType()
+ patioTypeToLlvmType(patioDestinationType, target)
);
}
private static LlvmOperand offsetOf(
PatioDataLayout patioDataLayout,
List<Integer> patioOffset,
+ PatioType patioDestinationType,
LlvmTarget target
) {
var offsetPtr = new LlvmOperandGetElementPtr(
@@ -1372,7 +1394,7 @@ public class PatioToLlvm {
);
return new LlvmOperandPtrToInt(
offsetPtr,
- target.patioIntType()
+ patioTypeToLlvmType(patioDestinationType, target)
);
}
}
diff --git a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioGc.java b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioGc.java
index 32fc07de..945f667e 100644
--- a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioGc.java
+++ b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioGc.java
@@ -3,6 +3,7 @@ package org.shedlang.compiler.shidtopatio;
import org.shedlang.compiler.patio.PatioFunctionDeclaration;
import org.shedlang.compiler.patio.PatioLocal;
import org.shedlang.compiler.patio.instructions.PatioCall;
+import org.shedlang.compiler.patio.operands.PatioInt32Const;
import org.shedlang.compiler.patio.operands.PatioIntConst;
import org.shedlang.compiler.patio.operands.PatioLocalRef;
import org.shedlang.compiler.patio.operands.PatioOperand;
@@ -26,8 +27,8 @@ public class ShidToPatioGc {
PatioDataLayouts.struct(List.of(
PatioDataLayouts.DATA_POINTER, // next
PatioDataLayouts.INT, // mark
- PatioDataLayouts.INT, // children offset
- PatioDataLayouts.INT // children count
+ PatioDataLayouts.INT32, // children offset
+ PatioDataLayouts.INT32 // children count
)),
valueLayout
));
@@ -48,8 +49,8 @@ public class ShidToPatioGc {
PatioDataValues.int_(0),
// Static values are always marked: see gc.c
PatioDataValues.int_(0b110),
- PatioDataValues.int_(0),
- PatioDataValues.int_(0)
+ PatioDataValues.int32(0),
+ PatioDataValues.int32(0)
)),
value
));
@@ -131,8 +132,8 @@ public class ShidToPatioGc {
"shed__runtime__gc_alloc",
List.of(
PatioLocal.param("size", PatioTypes.INT),
- PatioLocal.param("children_offset", PatioTypes.INT),
- PatioLocal.param("children_count", PatioTypes.INT)
+ PatioLocal.param("children_offset", PatioTypes.INT32),
+ PatioLocal.param("children_count", PatioTypes.INT32)
),
PatioTypes.DATA_POINTER,
Sources.RUNTIME
@@ -151,12 +152,12 @@ public class ShidToPatioGc {
var size = new PatioIntConst(new PatioIntValueByteSizeOf(layout));
- var offset = new PatioIntConst(new PatioIntValueByteOffsetOf(layout, childrenOffset));
+ var offset = new PatioInt32Const(new PatioIntValueByteOffsetOf(layout, childrenOffset));
return context.addInstruction(new PatioCall(
Optional.of(destination),
ALLOC.name(),
- List.of(size, offset, PatioIntConst.of(childrenCount)),
+ List.of(size, offset, PatioInt32Const.of(childrenCount)),
source
));
}