Skip to content

Commit ba6fb9a

Browse files
authored
Merge pull request #79 from Quickfall/fix/78-enum_lrus
[fix] Enum LRUs
2 parents 27ae91c + 22c10d9 commit ba6fb9a

3 files changed

Lines changed: 40 additions & 6 deletions

File tree

compiler/astoir_mir_lowering/src/lib.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::{collections::HashMap, hash::Hash};
2+
13
use astoir_hir::{ctx::HIRContext, nodes::{HIRNode, HIRNodeKind}};
24
use astoir_mir::ctx::MIRContext;
35
use compiler_typing::{SizedType, raw::RawType, structs::LoweredStructTypeContainer, tree::Type};
@@ -55,7 +57,7 @@ pub fn lower_hir(ctx: HIRContext) -> DiagnosticResult<MIRContext> {
5557
pub fn lower_hir_generic(ctx: &MIRLoweringContext, t: &Type, generic: &RawType) -> DiagnosticResult<Type> {
5658
match generic {
5759
RawType::Struct(a, b) => {
58-
let mut lowered_container = LoweredStructTypeContainer { fields: IndexStorage::new(), functions: IndexStorage::new(), is_lowered_enum_child: false, is_lowered_enum_parent: false, lowered_enum_child: None, lowered_enum_parent: None };
60+
let mut lowered_container = LoweredStructTypeContainer { fields: IndexStorage::new(), functions: IndexStorage::new(), is_lowered_enum_child: false, is_lowered_enum_parent: false, lowered_enum_child: None, lowered_enum_parent: None, hir_mir_indexes: HashMap::new() };
5961

6062
for field in &b.fields.vals {
6163
lowered_container.fields.vals.push(lower_hir_type(ctx, field.clone().resolve(t))?);
@@ -65,7 +67,7 @@ pub fn lower_hir_generic(ctx: &MIRLoweringContext, t: &Type, generic: &RawType)
6567
},
6668

6769
RawType::EnumEntry(container) => {
68-
let mut lowered_container = LoweredStructTypeContainer { fields: IndexStorage::new(), functions: IndexStorage::new(), is_lowered_enum_child: true, is_lowered_enum_parent: false, lowered_enum_child: Some(container.clone()), lowered_enum_parent: None };
70+
let mut lowered_container = LoweredStructTypeContainer { fields: IndexStorage::new(), functions: IndexStorage::new(), is_lowered_enum_child: true, is_lowered_enum_parent: false, lowered_enum_child: Some(container.clone()), lowered_enum_parent: None, hir_mir_indexes: HashMap::new() };
6971

7072
let parent = match &ctx.hir_ctx.type_storage.types.vals[container.parent] {
7173
RawType::Enum(container) => container.clone(),
@@ -74,15 +76,20 @@ pub fn lower_hir_generic(ctx: &MIRLoweringContext, t: &Type, generic: &RawType)
7476

7577
lowered_container.fields.vals.push(Type::GenericLowered(parent.get_hint_type())); // Enum entry hint
7678

79+
let mut ind = 0;
7780
for field in &container.fields.vals {
81+
lowered_container.append_hir_index_conv(ind, lowered_container.fields.vals.len()); // Allow for LRU to work correctly
82+
7883
lowered_container.fields.vals.push(lower_hir_type(ctx, field.clone().resolve(t))?);
84+
85+
ind += 1;
7986
}
8087

8188
return Ok(Type::GenericLowered(RawType::LoweredStruct(false, lowered_container)));
8289
},
8390

8491
RawType::Enum(container) => {
85-
let mut lowered_container = LoweredStructTypeContainer { fields: IndexStorage::new(), functions: IndexStorage::new(), is_lowered_enum_child: false, is_lowered_enum_parent: true, lowered_enum_parent: Some(container.clone()), lowered_enum_child: None };
92+
let mut lowered_container = LoweredStructTypeContainer { fields: IndexStorage::new(), functions: IndexStorage::new(), is_lowered_enum_child: false, is_lowered_enum_parent: true, lowered_enum_parent: Some(container.clone()), lowered_enum_child: None, hir_mir_indexes: HashMap::new() };
8693

8794
let mut entry_size = 0;
8895

compiler/astoir_mir_lowering/src/lru.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use astoir_hir::{nodes::{HIRNode, HIRNodeKind}, structs::StructLRUStep};
22
use astoir_mir::{blocks::refer::MIRBlockReference, builder::build_field_pointer, vals::{base::BaseMIRValue, refer::MIRVariableReference}};
3-
use diagnostics::DiagnosticResult;
3+
use compiler_typing::raw::RawType;
4+
use diagnostics::{DiagnosticResult, unsure_panic};
45

56
use crate::MIRLoweringContext;
67

@@ -10,9 +11,15 @@ pub fn lower_hir_lru_step(block: MIRBlockReference, step: StructLRUStep, ctx: &m
1011
return Ok(ctx.mir_ctx.blocks[block].get_variable_ref(variable)?.as_pointer_ref()?.into());
1112
}
1213

13-
let ptr = curr.unwrap().as_ptr()?;
14+
let curr = curr.unwrap();
15+
let ptr = curr.as_ptr()?;
1416

15-
return Ok(build_field_pointer(&mut ctx.mir_ctx, ptr, variable)?.into())
17+
let struct_type = match ctx.mir_ctx.ssa_hints.get_hint(curr.get_ssa_index()).get_type().get_generic(&ctx.hir_ctx.type_storage) {
18+
RawType::LoweredStruct(_, container) => container,
19+
_ => unsure_panic!("lower_hir_lru_step curr was not an actual thing")
20+
};
21+
22+
return Ok(build_field_pointer(&mut ctx.mir_ctx, ptr, struct_type.resolve_hir_index(variable))?.into())
1623
}
1724

1825
panic!("Invalid step!")

compiler/compiler_typing/src/structs.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::collections::HashMap;
2+
13
use compiler_utils::utils::indexed::IndexStorage;
24
use diagnostics::{DiagnosticResult, builders::{make_cannot_find_type_field, make_cannot_find_type_function}};
35

@@ -18,9 +20,27 @@ pub struct LoweredStructTypeContainer {
1820
pub is_lowered_enum_parent: bool,
1921
pub lowered_enum_parent: Option<RawEnumTypeContainer>,
2022
pub lowered_enum_child: Option<RawEnumEntryContainer>,
23+
pub hir_mir_indexes: HashMap<usize, usize>,
2124
pub functions: IndexStorage<usize>
2225
}
2326

27+
impl LoweredStructTypeContainer {
28+
29+
/// Resolves the given `HIR` field index into the corresponding `MIR` field index if said one has changed.
30+
pub fn resolve_hir_index(&self, ind: usize) -> usize {
31+
if self.hir_mir_indexes.contains_key(&ind) {
32+
return self.hir_mir_indexes[&ind];
33+
}
34+
35+
return ind;
36+
}
37+
38+
pub fn append_hir_index_conv(&mut self, hir: usize, mir: usize) {
39+
self.hir_mir_indexes.insert(hir, mir);
40+
}
41+
42+
}
43+
2444
impl SizedType for RawStructTypeContainer {
2545
fn get_size(&self, t: &Type, compacted_size: bool, storage: &TypeStorage) -> usize {
2646
let mut size = 0;

0 commit comments

Comments
 (0)