fix(backend): Imm value exceeds range
This commit is contained in:
+7
-3
@@ -276,7 +276,7 @@ impl<'a> Generator<'a> {
|
||||
if var.data_type.is_array() {
|
||||
let ptr_ty = var.data_type.decay_to_ptr().unwrap();
|
||||
let dest = self.var_manager.declare_temp(ptr_ty);
|
||||
(vec![IRInstr::GetAddr(dest.clone(), var)], Some(dest))
|
||||
(vec![IRInstr::Move(dest.clone(), MoveRValue::Var(var))], Some(dest))
|
||||
} else {
|
||||
(vec![], Some(var))
|
||||
}
|
||||
@@ -565,7 +565,7 @@ impl<'a> Generator<'a> {
|
||||
let var = self.var_manager.get_symbol(symbol).unwrap();
|
||||
if var.data_type.is_array() {
|
||||
let ptr = self.var_manager.declare_temp(var.data_type.decay_to_ptr().unwrap());
|
||||
(vec![IRInstr::GetAddr(ptr.clone(), var)], ptr)
|
||||
(vec![IRInstr::Move(ptr.clone(), MoveRValue::Var(var))], ptr)
|
||||
} else {
|
||||
(vec![], var)
|
||||
}
|
||||
@@ -579,7 +579,11 @@ impl<'a> Generator<'a> {
|
||||
instrs.extend(index_instrs);
|
||||
let addr_ty = IRType::Ptr(Box::new(elem_ty.into()));
|
||||
let dest = self.var_manager.declare_temp(addr_ty);
|
||||
instrs.push(IRInstr::GetElementPtr(dest.clone(), base, index_var.unwrap(), elem_size));
|
||||
let elem_size_var = self.var_manager.declare_temp(IRType::I32);
|
||||
let offset = self.var_manager.declare_temp(IRType::I32);
|
||||
instrs.push(IRInstr::Move(elem_size_var.clone(), MoveRValue::ConstInt(elem_size as i32)));
|
||||
instrs.push(IRInstr::Binary(offset.clone(), index_var.unwrap(), AstBinaryOp::Mul.into(), elem_size_var));
|
||||
instrs.push(IRInstr::Binary(dest.clone(), base, AstBinaryOp::Add.into(), offset));
|
||||
Some((instrs, dest))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,8 +32,6 @@ pub enum IRInstr {
|
||||
Move(Variable, MoveRValue),
|
||||
Load(Variable, Variable),
|
||||
Store(Variable, Variable),
|
||||
GetAddr(Variable, Variable),
|
||||
GetElementPtr(Variable, Variable, Variable, usize),
|
||||
}
|
||||
|
||||
impl Display for IRInstr {
|
||||
@@ -53,8 +51,6 @@ impl Display for IRInstr {
|
||||
IRInstr::Move(dest, src) => write!(f, "{} = {}", dest, src),
|
||||
IRInstr::Load(dest, addr) => write!(f, "{} = *{}", dest, addr),
|
||||
IRInstr::Store(addr, value) => write!(f, "*{} = {}", addr, value),
|
||||
IRInstr::GetAddr(dest, var) => write!(f, "{} = getaddr {}", dest, var),
|
||||
IRInstr::GetElementPtr(dest, base, index, elem_size) => write!(f, "{} = gep {}, {}, {}", dest, base, index, elem_size),
|
||||
IRInstr::Declare(var) => write!(f, "declare {}", var.to_decl_string()),
|
||||
IRInstr::DefineFunc(func, args, body) => {
|
||||
let body_str = body.iter().map(|instr| format!(" {}", instr)).collect::<Vec<_>>().join("\n");
|
||||
|
||||
Reference in New Issue
Block a user