broken commit, started working on scopes
This commit is contained in:
@@ -5,12 +5,14 @@ use std::time::SystemTime;
|
|||||||
use chrono::{DateTime, Local};
|
use chrono::{DateTime, Local};
|
||||||
|
|
||||||
use super::registers::RegisterAllocator;
|
use super::registers::RegisterAllocator;
|
||||||
|
use crate::backend::dsa::instruction::CodeGen;
|
||||||
use crate::backend::dsa::registers::Register;
|
use crate::backend::dsa::registers::Register;
|
||||||
|
use crate::backend::dsa::variable::{ScopeKind, ScopeManager};
|
||||||
use crate::{block, comment, dsa};
|
use crate::{block, comment, dsa};
|
||||||
|
|
||||||
use crate::model::{
|
use crate::model::{
|
||||||
AssignmentOperator, BinaryOperator, Call, CompilerError, ConstExpr, Declaration,
|
AssignmentOperator, BinaryOperator, Call, CompilerError, ConstExpr, Declaration,
|
||||||
Dependency, Expression, Program, Statement, TypeId, UnaryOperator, Variable,
|
Dependency, Expression, Name, Program, Statement, TypeId, UnaryOperator, Variable,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct CodeGenerator {
|
pub struct CodeGenerator {
|
||||||
@@ -52,6 +54,50 @@ impl CodeGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn generate(&mut self) -> Result<String, CompilerError> {
|
pub fn generate(&mut self) -> Result<String, CompilerError> {
|
||||||
|
// let mut codegen = CodeGen::new();
|
||||||
|
// let mut scope_mgr = ScopeManager::new();
|
||||||
|
// scope_mgr.enter_scope(ScopeKind::Global);
|
||||||
|
// scope_mgr.enter_scope(ScopeKind::Function);
|
||||||
|
|
||||||
|
// let point_type = TypeId::Struct {
|
||||||
|
// name: Name::new("Point", None),
|
||||||
|
// fields: vec![TypeId::U32, TypeId::U32],
|
||||||
|
// generics: vec![],
|
||||||
|
// };
|
||||||
|
|
||||||
|
// let p_var = scope_mgr.declare_var("p".into(), point_type)?;
|
||||||
|
// scope_mgr.allocate_var(p_var, false)?; // Force stack (struct too big)
|
||||||
|
|
||||||
|
// // Access p.x (offset 0, size 4)
|
||||||
|
// let (x_reg, load_block) = scope_mgr.access_member(p_var, 0, 4)?;
|
||||||
|
// codegen.emit_block(load_block);
|
||||||
|
|
||||||
|
// // Store to p.y (offset 4, size 4)
|
||||||
|
// let value_reg = Register::Rg0; // assume value is here
|
||||||
|
// let store_block = scope_mgr.store_member(p_var, 4, 4, value_reg)?;
|
||||||
|
// codegen.emit_block(store_block);
|
||||||
|
|
||||||
|
// scope_mgr.enter_scope(ScopeKind::Loop);
|
||||||
|
// let pointer = scope_mgr
|
||||||
|
// .declare_var("pointer".into(), TypeId::Ptr(Box::new(TypeId::U32)))?;
|
||||||
|
// scope_mgr.allocate_var(pointer, true)?;
|
||||||
|
|
||||||
|
// scope_mgr.enter_scope(ScopeKind::Function);
|
||||||
|
// let var2 = scope_mgr.declare_var("var2".into(), TypeId::U32)?;
|
||||||
|
// scope_mgr.allocate_var(var2, true)?;
|
||||||
|
// let array = scope_mgr.declare_var(
|
||||||
|
// "pointer".into(),
|
||||||
|
// TypeId::Array {
|
||||||
|
// r#type: Box::new(TypeId::U32),
|
||||||
|
// size: 10,
|
||||||
|
// },
|
||||||
|
// )?;
|
||||||
|
// scope_mgr.allocate_var(array, false)?;
|
||||||
|
|
||||||
|
// println!("{}", scope_mgr);
|
||||||
|
|
||||||
|
// return Ok(String::new());
|
||||||
|
|
||||||
// always include the print library for debugging!
|
// always include the print library for debugging!
|
||||||
self.include("print", "./lib/io/print.dsa");
|
self.include("print", "./lib/io/print.dsa");
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
use crate::model::{CompilerError, Program};
|
use crate::model::{CompilerError, Program};
|
||||||
|
|
||||||
mod codegen;
|
mod codegen;
|
||||||
|
mod instruction;
|
||||||
mod registers;
|
mod registers;
|
||||||
|
mod scope;
|
||||||
|
mod variable;
|
||||||
|
|
||||||
pub fn generate_code(ast: &Program) -> Result<String, CompilerError> {
|
pub fn generate_code(ast: &Program) -> Result<String, CompilerError> {
|
||||||
let mut codegen = codegen::CodeGenerator::new(ast.clone());
|
let mut codegen = codegen::CodeGenerator::new(ast.clone());
|
||||||
|
|||||||
@@ -501,6 +501,7 @@ impl RegisterAllocator {
|
|||||||
|
|
||||||
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
|
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
|
||||||
pub enum Register {
|
pub enum Register {
|
||||||
|
// general purpose
|
||||||
Rg0 = 0,
|
Rg0 = 0,
|
||||||
Rg1 = 1,
|
Rg1 = 1,
|
||||||
Rg2 = 2,
|
Rg2 = 2,
|
||||||
@@ -517,8 +518,68 @@ pub enum Register {
|
|||||||
Rgd = 13,
|
Rgd = 13,
|
||||||
Rge = 14,
|
Rge = 14,
|
||||||
Rgf = 15,
|
Rgf = 15,
|
||||||
Zero = 16,
|
|
||||||
Null = 17,
|
// special
|
||||||
|
Bpr,
|
||||||
|
Spr,
|
||||||
|
Ret,
|
||||||
|
Acc,
|
||||||
|
|
||||||
|
// read only
|
||||||
|
Pcx,
|
||||||
|
Zero,
|
||||||
|
|
||||||
|
// null
|
||||||
|
Null,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Register {
|
||||||
|
pub fn get_gp() -> [Register; 16] {
|
||||||
|
[
|
||||||
|
Register::Rg0,
|
||||||
|
Register::Rg1,
|
||||||
|
Register::Rg2,
|
||||||
|
Register::Rg3,
|
||||||
|
Register::Rg4,
|
||||||
|
Register::Rg5,
|
||||||
|
Register::Rg6,
|
||||||
|
Register::Rg7,
|
||||||
|
Register::Rg8,
|
||||||
|
Register::Rg9,
|
||||||
|
Register::Rga,
|
||||||
|
Register::Rgb,
|
||||||
|
Register::Rgc,
|
||||||
|
Register::Rgd,
|
||||||
|
Register::Rge,
|
||||||
|
Register::Rgf,
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn is_gp(&self) -> bool {
|
||||||
|
(*self as u8) < 16
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn from_index(idx: usize) -> Register {
|
||||||
|
match idx {
|
||||||
|
0 => Register::Rg0,
|
||||||
|
1 => Register::Rg1,
|
||||||
|
2 => Register::Rg2,
|
||||||
|
3 => Register::Rg3,
|
||||||
|
4 => Register::Rg4,
|
||||||
|
5 => Register::Rg5,
|
||||||
|
6 => Register::Rg6,
|
||||||
|
7 => Register::Rg7,
|
||||||
|
8 => Register::Rg8,
|
||||||
|
9 => Register::Rg9,
|
||||||
|
10 => Register::Rga,
|
||||||
|
11 => Register::Rgb,
|
||||||
|
12 => Register::Rgc,
|
||||||
|
13 => Register::Rgd,
|
||||||
|
14 => Register::Rge,
|
||||||
|
15 => Register::Rgf,
|
||||||
|
_ => unreachable!("this function shouldn't ever be called with idx>15"),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for Register {
|
impl fmt::Display for Register {
|
||||||
@@ -540,7 +601,15 @@ impl fmt::Display for Register {
|
|||||||
Self::Rgd => write!(f, "rgd"),
|
Self::Rgd => write!(f, "rgd"),
|
||||||
Self::Rge => write!(f, "rge"),
|
Self::Rge => write!(f, "rge"),
|
||||||
Self::Rgf => write!(f, "rgf"),
|
Self::Rgf => write!(f, "rgf"),
|
||||||
|
|
||||||
|
Self::Acc => write!(f, "acc"),
|
||||||
|
Self::Ret => write!(f, "ret"),
|
||||||
|
Self::Bpr => write!(f, "bpr"),
|
||||||
|
Self::Spr => write!(f, "spr"),
|
||||||
|
|
||||||
Self::Zero => write!(f, "zero"),
|
Self::Zero => write!(f, "zero"),
|
||||||
|
Self::Pcx => write!(f, "pcx"),
|
||||||
|
|
||||||
Self::Null => write!(f, "null"),
|
Self::Null => write!(f, "null"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,14 @@ pub struct Name {
|
|||||||
pub name: String,
|
pub name: String,
|
||||||
pub namespace: Option<String>,
|
pub namespace: Option<String>,
|
||||||
}
|
}
|
||||||
|
impl Name {
|
||||||
|
pub fn new(name: impl Into<String>, namespace: Option<String>) -> Self {
|
||||||
|
Self {
|
||||||
|
name: name.into(),
|
||||||
|
namespace,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct Program {
|
pub struct Program {
|
||||||
|
|||||||
Reference in New Issue
Block a user