diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-04-06 14:51:29 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-04-06 14:51:29 +0100 |
| commit | 9331d0f454a30091628d2fa1c26e805626917d0a (patch) | |
| tree | ac97e21754307d7368c92aeaa0c460271983d56f | |
| parent | e6e4fc67d93a354eb3ab7f04bb2f833a90650025 (diff) | |
Add support for mutable data element declarations to patio-to-cranelift
| -rw-r--r-- | patio-to-cranelift/src/codegen/mod.rs | 24 | ||||
| -rw-r--r-- | patio-to-cranelift/src/patio/compilation_unit.rs | 12 | ||||
| -rw-r--r-- | patio-to-cranelift/src/patio/flatbuffers.rs | 14 |
3 files changed, 45 insertions, 5 deletions
diff --git a/patio-to-cranelift/src/codegen/mod.rs b/patio-to-cranelift/src/codegen/mod.rs index 798c0381..316c9e2a 100644 --- a/patio-to-cranelift/src/codegen/mod.rs +++ b/patio-to-cranelift/src/codegen/mod.rs @@ -11,8 +11,9 @@ use crate::{ patio::{ compilation_unit::{ PatioCompilationUnit, PatioCompilationUnitElement, PatioDataElementImmutableDefinition, - PatioDataElementMutableDefinition, PatioFunctionDeclaration, PatioFunctionDefinition, - PatioLocal, PatioLocalType, PatioVisibility, + PatioDataElementMutableDeclaration, PatioDataElementMutableDefinition, + PatioFunctionDeclaration, PatioFunctionDefinition, PatioLocal, PatioLocalType, + PatioVisibility, }, instructions::{ PatioBlock, PatioBoolToInt, PatioCall, PatioCallPointer, PatioDataPtrToInt, PatioIf, @@ -88,6 +89,12 @@ fn declare_compilation_unit_element( declare_data_element_immutable_definition(data_element_immutable_definition, context); } + PatioCompilationUnitElement::DataElementMutableDeclaration( + data_element_mutable_declaration, + ) => { + declare_data_element_mutable_declaration(data_element_mutable_declaration, context); + } + PatioCompilationUnitElement::DataElementMutableDefinition( data_element_mutable_definition, ) => { @@ -115,6 +122,8 @@ fn define_compilation_unit_element( define_data_element_immutable_definition(data_element_immutable_definition, context); } + PatioCompilationUnitElement::DataElementMutableDeclaration(_) => {} + PatioCompilationUnitElement::DataElementMutableDefinition( data_element_mutable_definition, ) => { @@ -151,6 +160,17 @@ fn define_data_element_immutable_definition( context.define_data(&data_element_immutable_definition.name, bytes); } +fn declare_data_element_mutable_declaration( + data_element_mutable_declaration: &PatioDataElementMutableDeclaration, + context: &mut CompilerContext, +) { + context.declare_data( + &data_element_mutable_declaration.name, + cranelift_module::Linkage::Import, + Mutability::Mutable, + ); +} + fn declare_data_element_mutable_definition( data_element_mutable_definition: &PatioDataElementMutableDefinition, context: &mut CompilerContext, diff --git a/patio-to-cranelift/src/patio/compilation_unit.rs b/patio-to-cranelift/src/patio/compilation_unit.rs index d7bd06e8..ecf80558 100644 --- a/patio-to-cranelift/src/patio/compilation_unit.rs +++ b/patio-to-cranelift/src/patio/compilation_unit.rs @@ -1,4 +1,8 @@ -use crate::patio::{instructions::PatioInstruction, types::PatioType, values::PatioDataValue}; +use crate::patio::{ + instructions::PatioInstruction, + types::{PatioDataLayout, PatioType}, + values::PatioDataValue, +}; pub(crate) struct PatioCompilationUnit { pub(crate) elements: Vec<PatioCompilationUnitElement>, @@ -7,6 +11,7 @@ pub(crate) struct PatioCompilationUnit { pub(crate) enum PatioCompilationUnitElement { DataElementImmutableDefinition(PatioDataElementImmutableDefinition), DataElementMutableDefinition(PatioDataElementMutableDefinition), + DataElementMutableDeclaration(PatioDataElementMutableDeclaration), FunctionDeclaration(PatioFunctionDeclaration), FunctionDefinition(PatioFunctionDefinition), } @@ -23,6 +28,11 @@ pub(crate) struct PatioDataElementMutableDefinition { pub(crate) initial_value: PatioDataValue, } +pub(crate) struct PatioDataElementMutableDeclaration { + pub(crate) name: String, + pub(crate) layout: PatioDataLayout, +} + pub(crate) struct PatioFunctionDeclaration { pub(crate) name: String, pub(crate) params: Vec<PatioLocal>, diff --git a/patio-to-cranelift/src/patio/flatbuffers.rs b/patio-to-cranelift/src/patio/flatbuffers.rs index 69720b19..900a2c4c 100644 --- a/patio-to-cranelift/src/patio/flatbuffers.rs +++ b/patio-to-cranelift/src/patio/flatbuffers.rs @@ -2,8 +2,9 @@ use crate::{ patio::{ compilation_unit::{ PatioCompilationUnit, PatioCompilationUnitElement, PatioDataElementImmutableDefinition, - PatioDataElementMutableDefinition, PatioFunctionDeclaration, PatioFunctionDefinition, - PatioLocal, PatioLocalType, PatioVisibility, + PatioDataElementMutableDeclaration, PatioDataElementMutableDefinition, + PatioFunctionDeclaration, PatioFunctionDefinition, PatioLocal, PatioLocalType, + PatioVisibility, }, instructions::{ PatioBlock, PatioBoolToInt, PatioCall, PatioCallPointer, PatioDataPtrToInt, PatioIf, @@ -47,6 +48,15 @@ impl From<patio_generated::patio::PatioCompilationUnitElement<'_>> for PatioComp }) } + patio_generated::patio::PatioCompilationUnitElementValue::PatioDataElementMutableDeclaration => { + let data_element_mutable_declaration = value.value_as_patio_data_element_mutable_declaration().unwrap(); + + Self::DataElementMutableDeclaration(PatioDataElementMutableDeclaration { + name: data_element_mutable_declaration.name().to_string(), + layout: data_element_mutable_declaration.layout().into(), + }) + } + patio_generated::patio::PatioCompilationUnitElementValue::PatioDataElementMutableDefinition => { let data_element_mutable_definition = value.value_as_patio_data_element_mutable_definition().unwrap(); |
