Skip to content

Commit 7df65ed

Browse files
committed
fix: fixed a bug where enum fields lowered to u0 which caused an LLVM crash
1 parent ba6fb9a commit 7df65ed

6 files changed

Lines changed: 20 additions & 3 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@ out.*
66

77
*.qf
88
*.qfmir
9+
*.llvm
910

1011
!examples/**.qf

compiler/astoir_mir_lowering/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ pub fn lower_hir_generic(ctx: &MIRLoweringContext, t: &Type, generic: &RawType)
9494
let mut entry_size = 0;
9595

9696
let info = t.get_generic_info();
97-
97+
9898
for entry in &container.entries {
9999
let lowered = lower_hir_type(ctx, Type::Generic(entry.1.clone(), info.0.clone(), info.1.clone()))?;
100100

compiler/compiler_typing/src/raw.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ impl SizedType for RawType {
199199
RawType::Struct(_, container) => return container.get_size(t, compacted_size, storage),
200200
RawType::Enum(container) => return container.get_size(t, compacted_size, storage),
201201
RawType::EnumEntry(container) => return container.get_size(t, compacted_size, storage),
202+
RawType::LoweredStruct(_, container) => return container.get_size(t, compacted_size, storage),
202203

203204
_ => return 0
204205
}

compiler/compiler_typing/src/structs.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,18 @@ impl LoweredStructTypeContainer {
4141

4242
}
4343

44+
impl SizedType for LoweredStructTypeContainer {
45+
fn get_size(&self, t: &Type, compacted_size: bool, storage: &TypeStorage) -> usize {
46+
let mut size = 0;
47+
48+
for field in &self.fields.vals {
49+
size += field.get_size(t, compacted_size, storage)
50+
}
51+
52+
return size;
53+
}
54+
}
55+
4456
impl SizedType for RawStructTypeContainer {
4557
fn get_size(&self, t: &Type, compacted_size: bool, storage: &TypeStorage) -> usize {
4658
let mut size = 0;

compiler/compiler_typing/src/tree.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,6 @@ impl Type {
168168
return (types.clone(), sizes.clone())
169169
}
170170

171-
println!("{:#?}", self);
172-
173171
return self.get_inner_type().get_generic_info();
174172
}
175173

compiler/llvm_ir_bridge/src/insts.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ pub fn bridge_llvm_instruction(instruction: MIRBlockHeldInstruction, func: usize
2424
MIRInstruction::Store { variable, value } => {
2525
let base = BaseMIRValue::from(variable.into());
2626
let ptr = bridge.values[&base.get_ssa_index()].into_pointer_value();
27+
2728
let val = bridge.values[&value.get_ssa_index()].inner;
2829

2930
llvm_to_base_returnless!(bridge.builder.build_store(ptr, val));
@@ -593,6 +594,10 @@ pub fn bridge_llvm_instruction(instruction: MIRBlockHeldInstruction, func: usize
593594
llvm_to_base_returnless!(bridge.builder.build_memcpy(llvm_dest.inner.into_pointer_value(), 1, llvm_src.into_pointer_value(), 1, sz));
594595

595596
None
597+
},
598+
599+
MIRInstruction::IRCast { val, to: _ } => {
600+
Some(bridge.values[&val.get_ssa_index()].inner.clone())
596601
}
597602

598603
_ => None

0 commit comments

Comments
 (0)