Nicolas Winkler 5 éve
szülő
commit
63eddb7eed
3 módosított fájl, 44 hozzáadás és 20 törlés
  1. 6 2
      src/main.rs
  2. 17 2
      src/optimize.rs
  3. 21 16
      src/trans/c.rs

+ 6 - 2
src/main.rs

@@ -21,6 +21,7 @@ pub mod trans;
 
 
 use crate::ir::MutVisitor;
+use typed_arena::Arena;
 
 fn main() -> io::Result<()> {
     let args: Vec<String> = env::args().collect();
@@ -43,8 +44,11 @@ fn main() -> io::Result<()> {
             //println!("{}\n", inst.to_string());
         //}
         //println!("{}", trans::java::transpile(&insts));
-
-        let _code = compile::compile(&insts);
+        let arena = Arena::new();
+        let dfg = optimize::create_dfg(&mut insts, &arena);
+        let c = trans::c::transpile_dfg(&dfg);
+        println!("{}", c);
+        //let _code = compile::compile(&insts);
     }
     else if let Err(msg) = insts {
         println!("error parsing: {}", msg);

+ 17 - 2
src/optimize.rs

@@ -1,8 +1,15 @@
 use std::collections::BTreeMap;
 use super::{ir};
 use super::ir::Instruction;
+use super::ir::MutVisitor;
 use typed_arena::Arena;
 
+pub fn create_dfg<'a>(instrs: &mut Vec<ir::Instruction>, arena: &'a Arena<DfgNode<'a>>) -> DfgOptimizer<'a> {
+    let mut dfg = DfgOptimizer::new(arena);
+    dfg.visit_instructions(instrs);
+    dfg
+}
+
 pub struct DfgOptimizer<'a> {
     arena: &'a Arena<DfgNode<'a>>,
     pub cell_states: BTreeMap<i64, &'a DfgNode<'a>>,
@@ -56,6 +63,10 @@ impl<'a> ir::MutVisitor for DfgOptimizer<'a> {
         for inst in instr {
             self.walk_instruction(inst);
         }
+
+        for (off, cell) in &self.cell_states {
+            self.cfg.push(DfInstr::WriteMem(*off, cell))
+        }
     }
 
     #[allow(unused_variables)]
@@ -107,8 +118,12 @@ impl<'a> ir::MutVisitor for DfgOptimizer<'a> {
 
     fn visit_loop(&mut self, l: &mut Instruction) {
         if let Instruction::Loop(instrs) = l {
-            let arena = Arena::new();
-            let mut optimizer = DfgOptimizer::new(&arena);
+
+            for (off, cell) in &self.cell_states {
+                self.cfg.push(DfInstr::WriteMem(*off, cell))
+            }
+
+            let mut optimizer = DfgOptimizer::new(&self.arena);
             optimizer.visit_instructions(instrs);
             self.cfg.push(DfInstr::Loop(0, optimizer.cfg));
             self.cell_states.clear();

+ 21 - 16
src/trans/c.rs

@@ -19,7 +19,7 @@ fn eval(dn: &DfgNode) -> String {
             format!("mem[OFF({})]", off)
         },
         DfgNode::Add(a, b) => {
-            format!("({}) + ({})", eval(a), eval(b))
+            format!("{} + {}", eval(a), eval(b))
         },
         DfgNode::Multiply(a, b) => {
             format!("({}) * ({})", eval(a), eval(b))
@@ -33,21 +33,28 @@ fn eval(dn: &DfgNode) -> String {
 pub fn transpile_dfg(dfg: &optimize::DfgOptimizer) -> String {
     let mut formatter = Formatter::new();
     formatter.add_line(r#"#include <stdio.h>
-    #include <stdlib.h>
-    #include <string.h>
-    #include <inttypes.h>
-    
-    #define OFF(X) (ptr + (uint16_t) (X))
-    
-    int main() {
-        uint8_t* mem = (uint8_t*) calloc(0x10000, 1);
-        uint16_t ptr = 0;"#);
+#include <stdlib.h>
+#include <string.h>
+#include <inttypes.h>
+
+#define OFF(X) (ptr + (uint16_t) (X))
+
+int main() {
+    uint8_t* mem = (uint8_t*) calloc(0x10000, 1);
+    uint16_t ptr = 0;"#);
     formatter.indent();
+    generate_dfg(&dfg.cfg, &mut formatter);
+    formatter.unindent();
+    formatter.add_line("}");
+
+    formatter.get_code()
+}
 
-    for &stmt in &dfg.cfg {
+fn generate_dfg(cfg: &Vec<DfInstr>, formatter: &mut Formatter) {
+    for stmt in cfg {
         match stmt {
             DfInstr::MovePtr(off) => {
-                formatter.add_line(&format!("ptr += {}", off));
+                formatter.add_line(&format!("ptr += {};", off));
             },
             DfInstr::WriteMem(off, val) => {
                 formatter.add_line(&format!("mem[OFF({})] = {};", off, eval(val)));
@@ -55,17 +62,15 @@ pub fn transpile_dfg(dfg: &optimize::DfgOptimizer) -> String {
             DfInstr::Print(val) => {
                 formatter.add_line(&format!("putchar({});", eval(val)));
             },
-            DfInstr::Loop(val) => {
+            DfInstr::Loop(_val, instrs) => {
                 formatter.add_line("while(mem[OFF(0)]) {");
                 formatter.indent();
-                
+                generate_dfg(&instrs, formatter);
                 formatter.unindent();
                 formatter.add_line("}");
             },
         }
     }
-
-    formatter.get_code()
 }