aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-04-03 15:14:05 +0100
committerMichael Williamson <mike@zwobble.org>2026-04-03 15:14:05 +0100
commitf4d3ecd9061a9533c2a29c126ab7befec66e8d27 (patch)
tree0ea39646290c62de9bd4e2c7c03d0a80518cdf27
parentbfc448429f8a674a9b4aa8e188fbdeaeee5d1b1b (diff)
Implement byte-size-of in patio-to-cranelift
-rw-r--r--patio-to-cranelift/src/lib.rs52
1 files changed, 47 insertions, 5 deletions
diff --git a/patio-to-cranelift/src/lib.rs b/patio-to-cranelift/src/lib.rs
index e83dd455..87054489 100644
--- a/patio-to-cranelift/src/lib.rs
+++ b/patio-to-cranelift/src/lib.rs
@@ -7,11 +7,12 @@ use crate::{
errors::CompileError,
patio_generated::patio::{
PatioBlock, PatioBoolToInt, PatioCall, PatioCompilationUnitElement,
- PatioCompilationUnitElementValue, PatioFunctionDefinition, PatioIf, PatioInstruction,
- PatioInstructionValue, PatioIntAdd, PatioIntEquals, PatioIntNotEqual, PatioIntSub,
- PatioIntToBool, PatioIntValue, PatioIntValueValue, PatioLocal, PatioLocalRef,
- PatioLocalStore, PatioLocalType, PatioOperand, PatioOperandValue, PatioReturn,
- PatioReturnVoid, PatioType, PatioTypeValue, PatioVisibility,
+ PatioCompilationUnitElementValue, PatioDataLayout, PatioDataLayoutValue,
+ PatioFunctionDefinition, PatioIf, PatioInstruction, PatioInstructionValue, PatioIntAdd,
+ PatioIntEquals, PatioIntNotEqual, PatioIntSub, PatioIntToBool, PatioIntValue,
+ PatioIntValueValue, PatioLocal, PatioLocalRef, PatioLocalStore, PatioLocalType,
+ PatioOperand, PatioOperandValue, PatioReturn, PatioReturnVoid, PatioType, PatioTypeValue,
+ PatioVisibility,
},
};
@@ -484,6 +485,17 @@ fn compile_int_value(
context: &mut CompilerFunctionContext<'_>,
) -> cranelift::prelude::Value {
match int_value.value_type() {
+ PatioIntValueValue::PatioIntValueByteSizeOf => {
+ let byte_size_of = int_value.value_as_patio_int_value_byte_size_of().unwrap();
+
+ let byte_size_of = size_of_data_layout(byte_size_of.layout(), &context.target_triple);
+
+ context
+ .function_builder
+ .ins()
+ .iconst(cranelift_type, i64::from(byte_size_of))
+ }
+
PatioIntValueValue::PatioIntValueLiteral => {
let literal = int_value.value_as_patio_int_value_literal().unwrap();
@@ -596,3 +608,33 @@ fn cranelift_int_type(target_triple: &target_lexicon::Triple) -> cranelift_codeg
}
const CRANELIFT_INT_32_TYPE: cranelift_codegen::ir::Type = cranelift_codegen::ir::types::I32;
+
+fn size_of_data_layout(layout: PatioDataLayout<'_>, target_triple: &target_lexicon::Triple) -> u32 {
+ match layout.value_type() {
+ PatioDataLayoutValue::PatioDataLayoutArray => {
+ let array = layout.value_as_patio_data_layout_array().unwrap();
+ size_of_data_layout(array.element(), target_triple) * array.size()
+ }
+
+ PatioDataLayoutValue::PatioDataLayoutBool => CRANELIFT_BOOL_TYPE.bytes(),
+ PatioDataLayoutValue::PatioDataLayoutByte => CRANELIFT_BYTE_TYPE.bytes(),
+ PatioDataLayoutValue::PatioDataLayoutDataPtr => {
+ cranelift::prelude::Type::triple_pointer_type(&target_triple).bytes()
+ }
+ PatioDataLayoutValue::PatioDataLayoutFunctionPtr => {
+ cranelift::prelude::Type::triple_pointer_type(&target_triple).bytes()
+ }
+ PatioDataLayoutValue::PatioDataLayoutInt => cranelift_int_type(target_triple).bytes(),
+ PatioDataLayoutValue::PatioDataLayoutInt32 => CRANELIFT_INT_32_TYPE.bytes(),
+ PatioDataLayoutValue::PatioDataLayoutStruct => {
+ let struct_ = layout.value_as_patio_data_layout_struct().unwrap();
+ struct_
+ .elements()
+ .iter()
+ .map(|element| size_of_data_layout(element, target_triple))
+ .sum()
+ }
+
+ layout_type => panic!("Unsupported data layout: {}", layout_type.0),
+ }
+}