diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-04-03 15:14:05 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-04-03 15:14:05 +0100 |
| commit | f4d3ecd9061a9533c2a29c126ab7befec66e8d27 (patch) | |
| tree | 0ea39646290c62de9bd4e2c7c03d0a80518cdf27 | |
| parent | bfc448429f8a674a9b4aa8e188fbdeaeee5d1b1b (diff) | |
Implement byte-size-of in patio-to-cranelift
| -rw-r--r-- | patio-to-cranelift/src/lib.rs | 52 |
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), + } +} |
