From 4e116e25a5c0d9b9b7f92e3c363a93902eaf19d6 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 27 Jan 2024 00:29:34 +0000 Subject: Reduce size of GC header --- .../backends/llvm/codegen/PatioToLlvm.java | 36 +++++++++++++++++----- .../compiler/shidtopatio/ShidToPatioGc.java | 17 +++++----- 2 files changed, 38 insertions(+), 15 deletions(-) (limited to 'src/main/java') 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 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 )); } -- cgit v1.2.3