Finish casting codegen
This commit is contained in:
parent
e73b939de0
commit
c03a5188ea
@ -18,9 +18,9 @@ fn main() {
|
|||||||
FunctionFlags::default(),
|
FunctionFlags::default(),
|
||||||
);
|
);
|
||||||
|
|
||||||
let arg = m_entry.build("const", Constant(I32(5))).unwrap();
|
let arg = m_entry.build_named("const", Constant(I32(5))).unwrap();
|
||||||
let fibonacci_call = m_entry
|
let fibonacci_call = m_entry
|
||||||
.build("const", FunctionCall(fibonacci.value(), vec![arg]))
|
.build_named("const", FunctionCall(fibonacci.value(), vec![arg]))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
m_entry
|
m_entry
|
||||||
.terminate(TerminatorKind::Ret(fibonacci_call))
|
.terminate(TerminatorKind::Ret(fibonacci_call))
|
||||||
@ -28,10 +28,10 @@ fn main() {
|
|||||||
|
|
||||||
let mut f_entry = fibonacci.block("entry");
|
let mut f_entry = fibonacci.block("entry");
|
||||||
|
|
||||||
let num_3 = f_entry.build("const", Constant(I32(3))).unwrap();
|
let num_3 = f_entry.build_named("const", Constant(I32(3))).unwrap();
|
||||||
let param_n = f_entry.build("param", Param(0)).unwrap();
|
let param_n = f_entry.build_named("param", Param(0)).unwrap();
|
||||||
let cond = f_entry
|
let cond = f_entry
|
||||||
.build("cmp", ICmp(CmpPredicate::LT, param_n, num_3))
|
.build_named("cmp", ICmp(CmpPredicate::LT, param_n, num_3))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let mut then_b = fibonacci.block("then");
|
let mut then_b = fibonacci.block("then");
|
||||||
@ -41,21 +41,21 @@ fn main() {
|
|||||||
.terminate(TerminatorKind::CondBr(cond, then_b.value(), else_b.value()))
|
.terminate(TerminatorKind::CondBr(cond, then_b.value(), else_b.value()))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let ret_const = then_b.build("const", Constant(I32(1))).unwrap();
|
let ret_const = then_b.build_named("const", Constant(I32(1))).unwrap();
|
||||||
then_b.terminate(TerminatorKind::Ret(ret_const)).unwrap();
|
then_b.terminate(TerminatorKind::Ret(ret_const)).unwrap();
|
||||||
|
|
||||||
let const_1 = else_b.build("const", Constant(I32(1))).unwrap();
|
let const_1 = else_b.build_named("const", Constant(I32(1))).unwrap();
|
||||||
let const_2 = else_b.build("const", Constant(I32(2))).unwrap();
|
let const_2 = else_b.build_named("const", Constant(I32(2))).unwrap();
|
||||||
let param_1 = else_b.build("sub", Sub(param_n, const_1)).unwrap();
|
let param_1 = else_b.build_named("sub", Sub(param_n, const_1)).unwrap();
|
||||||
let param_2 = else_b.build("sub", Sub(param_n, const_2)).unwrap();
|
let param_2 = else_b.build_named("sub", Sub(param_n, const_2)).unwrap();
|
||||||
let call_1 = else_b
|
let call_1 = else_b
|
||||||
.build("fibonacci", FunctionCall(fibonacci.value(), vec![param_1]))
|
.build_named("fibonacci", FunctionCall(fibonacci.value(), vec![param_1]))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let call_2 = else_b
|
let call_2 = else_b
|
||||||
.build("fibonacci", FunctionCall(fibonacci.value(), vec![param_2]))
|
.build_named("fibonacci", FunctionCall(fibonacci.value(), vec![param_2]))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let add = else_b.build("add", Add(call_1, call_2)).unwrap();
|
let add = else_b.build_named("add", Add(call_1, call_2)).unwrap();
|
||||||
|
|
||||||
else_b.terminate(TerminatorKind::Ret(add)).unwrap();
|
else_b.terminate(TerminatorKind::Ret(add)).unwrap();
|
||||||
|
|
||||||
|
@ -250,7 +250,7 @@ impl Instr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'builder> Block<'builder> {
|
impl<'builder> Block<'builder> {
|
||||||
pub fn build<T: Into<String>>(
|
pub fn build_named<T: Into<String>>(
|
||||||
&mut self,
|
&mut self,
|
||||||
name: T,
|
name: T,
|
||||||
instruction: Instr,
|
instruction: Instr,
|
||||||
@ -268,7 +268,7 @@ impl<'builder> Block<'builder> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn build_anon(&mut self, instruction: Instr) -> Result<InstructionValue, ()> {
|
pub fn build(&mut self, instruction: Instr) -> Result<InstructionValue, ()> {
|
||||||
unsafe {
|
unsafe {
|
||||||
let name = instruction.default_name().to_owned();
|
let name = instruction.default_name().to_owned();
|
||||||
self.builder.add_instruction(
|
self.builder.add_instruction(
|
||||||
|
@ -353,16 +353,16 @@ impl mir::Module {
|
|||||||
// Codegen actual parameters
|
// Codegen actual parameters
|
||||||
let arg_name = format!("arg.{}", p_name);
|
let arg_name = format!("arg.{}", p_name);
|
||||||
let param = entry
|
let param = entry
|
||||||
.build(format!("{}.get", arg_name), Instr::Param(i))
|
.build_named(format!("{}.get", arg_name), Instr::Param(i))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let alloca = entry
|
let alloca = entry
|
||||||
.build(
|
.build_named(
|
||||||
&arg_name,
|
&arg_name,
|
||||||
Instr::Alloca(p_ty.get_type(&type_values, &types)),
|
Instr::Alloca(p_ty.get_type(&type_values, &types)),
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
entry
|
entry
|
||||||
.build(format!("{}.store", arg_name), Instr::Store(alloca, param))
|
.build_named(format!("{}.store", arg_name), Instr::Store(alloca, param))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
stack_values.insert(
|
stack_values.insert(
|
||||||
p_name.clone(),
|
p_name.clone(),
|
||||||
@ -488,7 +488,7 @@ impl mir::Statement {
|
|||||||
|
|
||||||
let alloca = scope
|
let alloca = scope
|
||||||
.block
|
.block
|
||||||
.build(
|
.build_named(
|
||||||
name,
|
name,
|
||||||
Instr::Alloca(value.1.get_type(scope.type_values, scope.types)),
|
Instr::Alloca(value.1.get_type(scope.type_values, scope.types)),
|
||||||
)
|
)
|
||||||
@ -497,7 +497,7 @@ impl mir::Statement {
|
|||||||
|
|
||||||
scope
|
scope
|
||||||
.block
|
.block
|
||||||
.build(
|
.build_named(
|
||||||
format!("{}.store", name),
|
format!("{}.store", name),
|
||||||
Instr::Store(alloca, value.instr()),
|
Instr::Store(alloca, value.instr()),
|
||||||
)
|
)
|
||||||
@ -557,7 +557,7 @@ impl mir::Statement {
|
|||||||
StackValueKind::Mutable(instr) => {
|
StackValueKind::Mutable(instr) => {
|
||||||
scope
|
scope
|
||||||
.block
|
.block
|
||||||
.build(backing_var, Instr::Store(instr, rhs_value.instr()))
|
.build_named(backing_var, Instr::Store(instr, rhs_value.instr()))
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.maybe_location(&mut scope.block, location);
|
.maybe_location(&mut scope.block, location);
|
||||||
}
|
}
|
||||||
@ -600,7 +600,7 @@ impl mir::Expression {
|
|||||||
v.0.derive(
|
v.0.derive(
|
||||||
scope
|
scope
|
||||||
.block
|
.block
|
||||||
.build(
|
.build_named(
|
||||||
format!("{}", varref.1),
|
format!("{}", varref.1),
|
||||||
Instr::Load(
|
Instr::Load(
|
||||||
v.0.instr(),
|
v.0.instr(),
|
||||||
@ -647,7 +647,7 @@ impl mir::Expression {
|
|||||||
_ => todo!(),
|
_ => todo!(),
|
||||||
};
|
};
|
||||||
Some(StackValue(
|
Some(StackValue(
|
||||||
StackValueKind::Immutable(scope.block.build_anon(instr).unwrap()),
|
StackValueKind::Immutable(scope.block.build(instr).unwrap()),
|
||||||
TypeKind::U32,
|
TypeKind::U32,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
@ -671,7 +671,7 @@ impl mir::Expression {
|
|||||||
|
|
||||||
let val = scope
|
let val = scope
|
||||||
.block
|
.block
|
||||||
.build(
|
.build_named(
|
||||||
call.name.clone(),
|
call.name.clone(),
|
||||||
Instr::FunctionCall(callee.ir.value(), params),
|
Instr::FunctionCall(callee.ir.value(), params),
|
||||||
)
|
)
|
||||||
@ -686,11 +686,11 @@ impl mir::Expression {
|
|||||||
let ptr = if ret_type_kind != TypeKind::Void {
|
let ptr = if ret_type_kind != TypeKind::Void {
|
||||||
let ptr = scope
|
let ptr = scope
|
||||||
.block
|
.block
|
||||||
.build(&call.name, Instr::Alloca(ret_type.clone()))
|
.build_named(&call.name, Instr::Alloca(ret_type.clone()))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
scope
|
scope
|
||||||
.block
|
.block
|
||||||
.build(format!("{}.store", call.name), Instr::Store(ptr, val))
|
.build_named(format!("{}.store", call.name), Instr::Store(ptr, val))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
Some(ptr)
|
Some(ptr)
|
||||||
@ -704,7 +704,7 @@ impl mir::Expression {
|
|||||||
StackValueKind::Immutable(
|
StackValueKind::Immutable(
|
||||||
scope
|
scope
|
||||||
.block
|
.block
|
||||||
.build(call.name.clone(), Instr::Load(ptr, ret_type))
|
.build_named(call.name.clone(), Instr::Load(ptr, ret_type))
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
),
|
),
|
||||||
ret_type_kind,
|
ret_type_kind,
|
||||||
@ -743,7 +743,7 @@ impl mir::Expression {
|
|||||||
|
|
||||||
let first = scope
|
let first = scope
|
||||||
.block
|
.block
|
||||||
.build("array.zero", Instr::Constant(ConstValue::U32(0)))
|
.build_named("array.zero", Instr::Constant(ConstValue::U32(0)))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let TypeKind::CodegenPtr(inner) = ty else {
|
let TypeKind::CodegenPtr(inner) = ty else {
|
||||||
@ -754,7 +754,7 @@ impl mir::Expression {
|
|||||||
dbg!(&further_inner, &val_t);
|
dbg!(&further_inner, &val_t);
|
||||||
let loaded = scope
|
let loaded = scope
|
||||||
.block
|
.block
|
||||||
.build(
|
.build_named(
|
||||||
"array.load",
|
"array.load",
|
||||||
Instr::Load(
|
Instr::Load(
|
||||||
kind.instr(),
|
kind.instr(),
|
||||||
@ -765,7 +765,7 @@ impl mir::Expression {
|
|||||||
(
|
(
|
||||||
scope
|
scope
|
||||||
.block
|
.block
|
||||||
.build(format!("array.gep"), Instr::GetElemPtr(loaded, vec![idx]))
|
.build_named(format!("array.gep"), Instr::GetElemPtr(loaded, vec![idx]))
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.maybe_location(&mut scope.block, location),
|
.maybe_location(&mut scope.block, location),
|
||||||
*further_inner,
|
*further_inner,
|
||||||
@ -777,7 +777,7 @@ impl mir::Expression {
|
|||||||
(
|
(
|
||||||
scope
|
scope
|
||||||
.block
|
.block
|
||||||
.build(
|
.build_named(
|
||||||
format!("array.gep"),
|
format!("array.gep"),
|
||||||
Instr::GetElemPtr(kind.instr(), vec![first, idx]),
|
Instr::GetElemPtr(kind.instr(), vec![first, idx]),
|
||||||
)
|
)
|
||||||
@ -793,7 +793,7 @@ impl mir::Expression {
|
|||||||
kind.derive(
|
kind.derive(
|
||||||
scope
|
scope
|
||||||
.block
|
.block
|
||||||
.build(
|
.build_named(
|
||||||
"array.load",
|
"array.load",
|
||||||
Instr::Load(
|
Instr::Load(
|
||||||
ptr,
|
ptr,
|
||||||
@ -837,7 +837,7 @@ impl mir::Expression {
|
|||||||
|
|
||||||
let array = scope
|
let array = scope
|
||||||
.block
|
.block
|
||||||
.build(&array_name, Instr::Alloca(array_ty.clone()))
|
.build_named(&array_name, Instr::Alloca(array_ty.clone()))
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.maybe_location(&mut scope.block, location);
|
.maybe_location(&mut scope.block, location);
|
||||||
|
|
||||||
@ -847,30 +847,30 @@ impl mir::Expression {
|
|||||||
|
|
||||||
let index_expr = scope
|
let index_expr = scope
|
||||||
.block
|
.block
|
||||||
.build(
|
.build_named(
|
||||||
index.to_string(),
|
index.to_string(),
|
||||||
Instr::Constant(ConstValue::U32(index as u32)),
|
Instr::Constant(ConstValue::U32(index as u32)),
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let first = scope
|
let first = scope
|
||||||
.block
|
.block
|
||||||
.build("zero", Instr::Constant(ConstValue::U32(0)))
|
.build_named("zero", Instr::Constant(ConstValue::U32(0)))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let ptr = scope
|
let ptr = scope
|
||||||
.block
|
.block
|
||||||
.build(gep_n, Instr::GetElemPtr(array, vec![first, index_expr]))
|
.build_named(gep_n, Instr::GetElemPtr(array, vec![first, index_expr]))
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.maybe_location(&mut scope.block, location);
|
.maybe_location(&mut scope.block, location);
|
||||||
scope
|
scope
|
||||||
.block
|
.block
|
||||||
.build(store_n, Instr::Store(ptr, *instr))
|
.build_named(store_n, Instr::Store(ptr, *instr))
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.maybe_location(&mut scope.block, location);
|
.maybe_location(&mut scope.block, location);
|
||||||
}
|
}
|
||||||
|
|
||||||
let array_val = scope
|
let array_val = scope
|
||||||
.block
|
.block
|
||||||
.build(load_n, Instr::Load(array, array_ty))
|
.build_named(load_n, Instr::Load(array, array_ty))
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.maybe_location(&mut scope.block, location);
|
.maybe_location(&mut scope.block, location);
|
||||||
|
|
||||||
@ -897,7 +897,7 @@ impl mir::Expression {
|
|||||||
|
|
||||||
let value = scope
|
let value = scope
|
||||||
.block
|
.block
|
||||||
.build(
|
.build_named(
|
||||||
gep_n,
|
gep_n,
|
||||||
Instr::GetStructElemPtr(struct_val.instr(), idx as u32),
|
Instr::GetStructElemPtr(struct_val.instr(), idx as u32),
|
||||||
)
|
)
|
||||||
@ -910,7 +910,7 @@ impl mir::Expression {
|
|||||||
struct_val.0.derive(
|
struct_val.0.derive(
|
||||||
scope
|
scope
|
||||||
.block
|
.block
|
||||||
.build(
|
.build_named(
|
||||||
load_n,
|
load_n,
|
||||||
Instr::Load(
|
Instr::Load(
|
||||||
value,
|
value,
|
||||||
@ -937,7 +937,7 @@ impl mir::Expression {
|
|||||||
|
|
||||||
let struct_ptr = scope
|
let struct_ptr = scope
|
||||||
.block
|
.block
|
||||||
.build(name, Instr::Alloca(struct_ty.clone()))
|
.build_named(name, Instr::Alloca(struct_ty.clone()))
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.maybe_location(&mut scope.block, location);
|
.maybe_location(&mut scope.block, location);
|
||||||
|
|
||||||
@ -947,13 +947,13 @@ impl mir::Expression {
|
|||||||
|
|
||||||
let elem_ptr = scope
|
let elem_ptr = scope
|
||||||
.block
|
.block
|
||||||
.build(gep_n, Instr::GetStructElemPtr(struct_ptr, i as u32))
|
.build_named(gep_n, Instr::GetStructElemPtr(struct_ptr, i as u32))
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.maybe_location(&mut scope.block, location);
|
.maybe_location(&mut scope.block, location);
|
||||||
if let Some(val) = exp.codegen(scope, state) {
|
if let Some(val) = exp.codegen(scope, state) {
|
||||||
scope
|
scope
|
||||||
.block
|
.block
|
||||||
.build(store_n, Instr::Store(elem_ptr, val.instr()))
|
.build_named(store_n, Instr::Store(elem_ptr, val.instr()))
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.maybe_location(&mut scope.block, location);
|
.maybe_location(&mut scope.block, location);
|
||||||
}
|
}
|
||||||
@ -961,7 +961,7 @@ impl mir::Expression {
|
|||||||
|
|
||||||
let struct_val = scope
|
let struct_val = scope
|
||||||
.block
|
.block
|
||||||
.build(load_n, Instr::Load(struct_ptr, struct_ty))
|
.build_named(load_n, Instr::Load(struct_ptr, struct_ty))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
Some(StackValue(
|
Some(StackValue(
|
||||||
@ -993,7 +993,7 @@ impl mir::Expression {
|
|||||||
|
|
||||||
let var_ptr_instr = scope
|
let var_ptr_instr = scope
|
||||||
.block
|
.block
|
||||||
.build(
|
.build_named(
|
||||||
format!("{}.deref", varref.1),
|
format!("{}.deref", varref.1),
|
||||||
Instr::Load(
|
Instr::Load(
|
||||||
v.0.instr(),
|
v.0.instr(),
|
||||||
@ -1009,7 +1009,7 @@ impl mir::Expression {
|
|||||||
v.0.derive(
|
v.0.derive(
|
||||||
scope
|
scope
|
||||||
.block
|
.block
|
||||||
.build(
|
.build_named(
|
||||||
format!("{}.deref.inner", varref.1),
|
format!("{}.deref.inner", varref.1),
|
||||||
Instr::Load(
|
Instr::Load(
|
||||||
var_ptr_instr,
|
var_ptr_instr,
|
||||||
@ -1028,7 +1028,21 @@ impl mir::Expression {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
mir::ExprKind::CastTo(expression, type_kind) => todo!(),
|
mir::ExprKind::CastTo(expression, type_kind) => {
|
||||||
|
let val = expression.codegen(scope, state)?;
|
||||||
|
let cast_instr = val
|
||||||
|
.1
|
||||||
|
.get_type(scope.type_values, scope.types)
|
||||||
|
.cast_instruction(
|
||||||
|
val.instr(),
|
||||||
|
&type_kind.get_type(scope.type_values, scope.types),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
Some(StackValue(
|
||||||
|
val.0.derive(scope.block.build(cast_instr).unwrap()),
|
||||||
|
type_kind.clone(),
|
||||||
|
))
|
||||||
|
}
|
||||||
};
|
};
|
||||||
if let Some(value) = &value {
|
if let Some(value) = &value {
|
||||||
value.instr().maybe_location(&mut scope.block, location);
|
value.instr().maybe_location(&mut scope.block, location);
|
||||||
@ -1109,7 +1123,7 @@ impl mir::IfExpression {
|
|||||||
incoming.extend(else_res.clone());
|
incoming.extend(else_res.clone());
|
||||||
let instr = scope
|
let instr = scope
|
||||||
.block
|
.block
|
||||||
.build(
|
.build_named(
|
||||||
"phi",
|
"phi",
|
||||||
Instr::Phi(incoming.iter().map(|i| i.instr()).collect()),
|
Instr::Phi(incoming.iter().map(|i| i.instr()).collect()),
|
||||||
)
|
)
|
||||||
@ -1151,7 +1165,7 @@ impl mir::CmpOperator {
|
|||||||
impl mir::Literal {
|
impl mir::Literal {
|
||||||
fn as_const(&self, block: &mut Block) -> InstructionValue {
|
fn as_const(&self, block: &mut Block) -> InstructionValue {
|
||||||
block
|
block
|
||||||
.build(format!("{}", self), self.as_const_kind())
|
.build_named(format!("{}", self), self.as_const_kind())
|
||||||
.unwrap()
|
.unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// Arithmetic, function calls and imports!
|
// Arithmetic, function calls and imports!
|
||||||
|
|
||||||
fn other() -> u16 {
|
fn other() -> i16 {
|
||||||
return 6;
|
return 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user