From d631e80267630967161f27b1985eaf55f349a961 Mon Sep 17 00:00:00 2001 From: sofia Date: Sun, 20 Jul 2025 19:54:43 +0300 Subject: [PATCH] At crossroads --- reid/src/codegen.rs | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/reid/src/codegen.rs b/reid/src/codegen.rs index 42ad238..e88f9e9 100644 --- a/reid/src/codegen.rs +++ b/reid/src/codegen.rs @@ -444,13 +444,13 @@ impl mir::Block { } if let Some((kind, expr)) = &self.return_expression { + let ret = expr.codegen(&mut scope, &mut state.load(true)); match kind { mir::ReturnKind::Hard => { - let ret = expr.codegen(&mut scope, &state)?; - scope.block.terminate(Term::Ret(ret.instr())).unwrap(); + scope.block.terminate(Term::Ret(ret?.instr())).unwrap(); None } - mir::ReturnKind::Soft => expr.codegen(&mut scope, state), + mir::ReturnKind::Soft => ret, } } else { None @@ -490,9 +490,10 @@ impl mir::Statement { false => StackValueKind::Immutable(alloca), }; - scope - .stack_values - .insert(name.clone(), StackValue(stack_value, ty.clone())); + scope.stack_values.insert( + name.clone(), + StackValue(stack_value, TypeKind::Ptr(Box::new(value.clone().1))), + ); if let Some(debug) = &scope.debug { let location = self.1.into_debug(scope.tokens).unwrap(); let var = debug.info.metadata( @@ -568,7 +569,28 @@ impl mir::Expression { .stack_values .get(&varref.1) .expect("Variable reference not found?!"); - Some(StackValue(v.0, varref.0.clone())) + Some({ + if state.should_load { + if let TypeKind::Ptr(inner) = &v.1 { + StackValue( + v.0.derive( + scope + .block + .build(Instr::Load( + v.0.instr(), + inner.get_type(scope.type_values, scope.types), + )) + .unwrap(), + ), + *inner.clone(), + ) + } else { + v.clone() + } + } else { + v.clone() + } + }) } mir::ExprKind::Literal(lit) => Some(StackValue( StackValueKind::Literal(lit.as_const(&mut scope.block)), @@ -657,7 +679,6 @@ impl mir::Expression { .build(Instr::Constant(ConstValue::U32(0))) .unwrap(); - dbg!(&self, &val_t); let ptr = scope .block .build(Instr::GetElemPtr(kind.instr(), vec![first, idx])) @@ -743,7 +764,7 @@ impl mir::Expression { )) } mir::ExprKind::Accessed(expression, type_kind, field) => { - let struct_val = expression.codegen(scope, &mut state.load(true)).unwrap(); + let struct_val = expression.codegen(scope, state).unwrap(); let TypeKind::CustomType(name) = &struct_val.1 else { panic!("tried accessing non-custom-type");