At crossroads
This commit is contained in:
parent
c723ba7b4a
commit
d631e80267
@ -444,13 +444,13 @@ impl mir::Block {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let Some((kind, expr)) = &self.return_expression {
|
if let Some((kind, expr)) = &self.return_expression {
|
||||||
|
let ret = expr.codegen(&mut scope, &mut state.load(true));
|
||||||
match kind {
|
match kind {
|
||||||
mir::ReturnKind::Hard => {
|
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
|
None
|
||||||
}
|
}
|
||||||
mir::ReturnKind::Soft => expr.codegen(&mut scope, state),
|
mir::ReturnKind::Soft => ret,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
@ -490,9 +490,10 @@ impl mir::Statement {
|
|||||||
false => StackValueKind::Immutable(alloca),
|
false => StackValueKind::Immutable(alloca),
|
||||||
};
|
};
|
||||||
|
|
||||||
scope
|
scope.stack_values.insert(
|
||||||
.stack_values
|
name.clone(),
|
||||||
.insert(name.clone(), StackValue(stack_value, ty.clone()));
|
StackValue(stack_value, TypeKind::Ptr(Box::new(value.clone().1))),
|
||||||
|
);
|
||||||
if let Some(debug) = &scope.debug {
|
if let Some(debug) = &scope.debug {
|
||||||
let location = self.1.into_debug(scope.tokens).unwrap();
|
let location = self.1.into_debug(scope.tokens).unwrap();
|
||||||
let var = debug.info.metadata(
|
let var = debug.info.metadata(
|
||||||
@ -568,7 +569,28 @@ impl mir::Expression {
|
|||||||
.stack_values
|
.stack_values
|
||||||
.get(&varref.1)
|
.get(&varref.1)
|
||||||
.expect("Variable reference not found?!");
|
.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(
|
mir::ExprKind::Literal(lit) => Some(StackValue(
|
||||||
StackValueKind::Literal(lit.as_const(&mut scope.block)),
|
StackValueKind::Literal(lit.as_const(&mut scope.block)),
|
||||||
@ -657,7 +679,6 @@ impl mir::Expression {
|
|||||||
.build(Instr::Constant(ConstValue::U32(0)))
|
.build(Instr::Constant(ConstValue::U32(0)))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
dbg!(&self, &val_t);
|
|
||||||
let ptr = scope
|
let ptr = scope
|
||||||
.block
|
.block
|
||||||
.build(Instr::GetElemPtr(kind.instr(), vec![first, idx]))
|
.build(Instr::GetElemPtr(kind.instr(), vec![first, idx]))
|
||||||
@ -743,7 +764,7 @@ impl mir::Expression {
|
|||||||
))
|
))
|
||||||
}
|
}
|
||||||
mir::ExprKind::Accessed(expression, type_kind, field) => {
|
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 {
|
let TypeKind::CustomType(name) = &struct_val.1 else {
|
||||||
panic!("tried accessing non-custom-type");
|
panic!("tried accessing non-custom-type");
|
||||||
|
Loading…
Reference in New Issue
Block a user