diff test/tcodegen.py @ 290:7b38782ed496

File moves
author Windel Bouwman
date Sun, 24 Nov 2013 11:24:15 +0100
parents python/tcodegen.py@2ccd57b1d78c
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/tcodegen.py	Sun Nov 24 11:24:15 2013 +0100
@@ -0,0 +1,141 @@
+
+"""
+  Test individual parts of the code generation for arm using the c3 frontend.
+"""
+
+import c3
+import ppci
+import codegenarm
+import outstream
+import ir
+
+testsrc = """
+package test2;
+
+var int phaa, foo, bar;
+
+function int insanemath(int a, int b)
+{
+  var int c;
+  c = 0;
+  var int i;
+  i = 9;
+  while (i > 1)
+  {
+      c = a + b + 1 + c;
+      i = i - 1;
+      if (c > 90)
+      {
+         return 42;
+      }
+  }
+  return c;
+}
+
+function void tesssst(int henkie)
+{
+   var int a, b, cee;
+   a = 2 * 33 - 12;
+   b = a * 2;
+   a = b + a;
+   cee = a;
+   cee = cee * 2 + cee;
+   insanemath(2, 3);
+   if (cee + a > b and b - a+b== 3*6-insanemath(b, 2))
+   {
+      var int x = a;
+      x = b - a + insanemath(3, 4) - insanemath(33, insanemath(2, 0));
+      a = x * (x + a);
+   }
+   else
+   {
+      a = b + (a + b);
+   }
+   var int y;
+   y = a - b * 53;
+}
+"""
+
+testsrc = """
+package test3;
+
+function int ab(int a, int b)
+{
+  var int c;
+  c = 0;
+  c = c + a + b;
+  return c; 
+}
+
+function void tesssst()
+{
+   var int a, b;
+   a = 2;
+   b = 3;
+   ab(ab(a, b) + ab(9,b), 0);
+}
+"""
+
+testsrc = """
+package test3;
+
+function int ab(int a, int b)
+{
+  var int c;
+  var int *a2;
+  a2 = cast<int*>(2);
+  *a2 = 2;
+  *a2 = *a2 + 2;
+  c = 0;
+  c = c + a + b;
+  return c; 
+}
+
+"""
+def dump_cfg(cga, cfg_file):
+    print('digraph G {', file=cfg_file)
+    #print('edge [constraint=none]', file=cfg_file)
+    print('rankdir=TB', file=cfg_file)
+    for f in cga.frames:
+        print('subgraph cluster_{} {{'.format(f.name), file=cfg_file)
+        print('label={};'.format(f.name), file=cfg_file)
+        print('color=lightgrey;', file=cfg_file)
+        print('style=filled;', file=cfg_file)
+        f.cfg.to_dot(cfg_file)
+        print('}', file=cfg_file)
+    print('}', file=cfg_file)
+
+def dump_ig(cga, ig_file):
+    print('digraph G {', file=ig_file)
+    print('edge [arrowhead=none]', file=ig_file)
+    for f in cga.frames:
+        print('subgraph cluster_{} {{'.format(f.name), file=ig_file)
+        print('label={};'.format(f.name), file=ig_file)
+        print('color=lightgrey;', file=ig_file)
+        print('style=filled;', file=ig_file)
+        f.ig.to_dot(ig_file)
+        print('}', file=ig_file)
+    print('}', file=ig_file)
+
+if __name__ == '__main__':
+    diag = ppci.DiagnosticsManager()
+    builder = c3.Builder(diag)
+    irc = builder.build(testsrc)
+    if not irc:
+        diag.printErrors(testsrc)
+    irc.check()
+    #irc.dump()
+    with open('ir.gv', 'w') as f:
+        ir.dumpgv(irc, f)
+    outs = outstream.TextOutputStream()
+    cga = codegenarm.ArmCodeGenerator(outs)
+    ir2 = cga.generate(irc)
+
+    with open('cfg.gv', 'w') as cfg_file:
+        dump_cfg(cga, cfg_file)
+
+    with open('ig.gv', 'w') as ig_file:
+        dump_ig(cga, ig_file)
+        
+    outs.dump()
+