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