From 6fdae6185abcf97749e950210de26278017ac51c Mon Sep 17 00:00:00 2001
From: Philippe Suter <philippe.suter@gmail.com>
Date: Tue, 4 Dec 2012 02:23:14 +0100
Subject: [PATCH] Progress in CodeGen.

- Recursive functions that manipulate only integers.
- "Smart conditionals" compilation scheme.
---
 .../scala/leon/codegen/CodeGenPhase.scala     |  19 ++-
 .../scala/leon/codegen/CodeGeneration.scala   | 116 +++++++++++++++++-
 .../leon/codegen/CompilationEnvironment.scala |  36 +++++-
 .../codegen/purescala/Prog001.scala           |  15 ++-
 unmanaged/32/cafebabe_2.9.2-1.2.jar           | Bin 496094 -> 496093 bytes
 5 files changed, 172 insertions(+), 14 deletions(-)

diff --git a/src/main/scala/leon/codegen/CodeGenPhase.scala b/src/main/scala/leon/codegen/CodeGenPhase.scala
index 5c6c0ef16..bfd072b88 100644
--- a/src/main/scala/leon/codegen/CodeGenPhase.scala
+++ b/src/main/scala/leon/codegen/CodeGenPhase.scala
@@ -20,24 +20,35 @@ object CodeGenPhase extends LeonPhase[Program,CompilationResult] {
     val cName = programToClassName(p)
 
     val cf = new ClassFile(cName, None)
-    cf.setFlags(
-      (cf.getFlags | CLASS_ACC_PUBLIC | CLASS_ACC_FINAL).asInstanceOf[U2]
-    )
+    cf.addDefaultConstructor
+
+    cf.setFlags((
+      CLASS_ACC_SUPER |
+      CLASS_ACC_PUBLIC |
+      CLASS_ACC_FINAL
+    ).asInstanceOf[U2])
 
     // This assumes that all functions of a given program get compiled
     // as methods of a single class file.
     for(funDef <- p.definedFunctions;
-        (_,mn) <- env.funDefToMethod(funDef)) {
+        (_,mn,_) <- env.funDefToMethod(funDef)) {
 
       val m = cf.addMethod(
         typeToJVM(funDef.returnType),
         mn,
         funDef.args.map(a => typeToJVM(a.tpe)) : _*
       )
+      m.setFlags((
+        METHOD_ACC_PUBLIC |
+        METHOD_ACC_FINAL |
+        METHOD_ACC_STATIC
+      ).asInstanceOf[U2])
  
       CodeGeneration.compileFunDef(funDef, m.codeHandler)
     }
 
+    cf.writeToFile(cName + ".class")
+
     CompilationResult(successful = true)
   } 
 }
diff --git a/src/main/scala/leon/codegen/CodeGeneration.scala b/src/main/scala/leon/codegen/CodeGeneration.scala
index 3fd57a438..7c55ac76c 100644
--- a/src/main/scala/leon/codegen/CodeGeneration.scala
+++ b/src/main/scala/leon/codegen/CodeGeneration.scala
@@ -22,8 +22,8 @@ object CodeGeneration {
   // Assumes the CodeHandler has never received any bytecode.
   // Generates method body, and freezes the handler at the end.
   def compileFunDef(funDef : FunDef, ch : CodeHandler)(implicit env : CompilationEnvironment) {
-    // TODO, change environment to include args.
-    mkExpr(funDef.getBody, ch)
+    val newMapping = funDef.args.map(_.id).zipWithIndex.toMap
+    mkExpr(funDef.getBody, ch)(env.withVars(newMapping))
 
     funDef.returnType match {
       case Int32Type | BooleanType =>
@@ -38,9 +38,52 @@ object CodeGeneration {
 
   private def mkExpr(e : Expr, ch : CodeHandler)(implicit env : CompilationEnvironment) {
     e match {
-      case IntLiteral(v) => ch << Ldc(v)
-      case BooleanLiteral(true) => ch << Ldc(1)
-      case BooleanLiteral(false) => ch << Ldc(0)
+      case Variable(id) =>
+        val slot = slotFor(id)
+        val instr = id.getType match {
+          case Int32Type | BooleanType => ILoad(slot)
+          case _ => ALoad(slot)
+        }
+        ch << instr
+
+      case Let(i,d,b) =>
+        mkExpr(d, ch)
+        val slot = ch.getFreshVar
+        val instr = i.getType match {
+          case Int32Type | BooleanType => IStore(slot)
+          case _ => AStore(slot)
+        }
+        ch << instr
+        mkExpr(b, ch)(env.withVars(Map(i -> slot)))
+
+      case IntLiteral(v) =>
+        ch << Ldc(v)
+
+      case BooleanLiteral(true) =>
+        ch << Ldc(1)
+
+      case BooleanLiteral(false) =>
+        ch << Ldc(0)
+
+      case IfExpr(c, t, e) =>
+        val tl = ch.getFreshLabel("then")
+        val el = ch.getFreshLabel("else")
+        val al = ch.getFreshLabel("after")
+        mkBranch(c, tl, el, ch)
+        ch << Label(tl)
+        mkExpr(t, ch)
+        ch << Goto(al) << Label(el)
+        mkExpr(e, ch)
+        ch << Label(al)
+
+      case FunctionInvocation(fd, as) =>
+        val (cn, mn, ms) = env.funDefToMethod(fd).getOrElse {
+          throw CompilationException("Unknown method : " + fd.id)
+        }
+        for(a <- as) {
+          mkExpr(a, ch)
+        }
+        ch << InvokeStatic(cn, mn, ms)
 
       case Plus(l, r) =>
         mkExpr(l, ch)
@@ -52,10 +95,71 @@ object CodeGeneration {
         mkExpr(r, ch)
         ch << ISUB
 
+      case Times(l, r) =>
+        mkExpr(l, ch)
+        mkExpr(r, ch)
+        ch << IMUL
+
       case UMinus(e) =>
         mkExpr(Minus(IntLiteral(0), e), ch)
 
-      case _ => throw CompilationException("Unsupported expr : " + e) 
+      case _ => throw CompilationException("Unsupported expr. : " + e) 
+    }
+  }
+
+  private def mkBranch(cond : Expr, then : String, elze : String, ch : CodeHandler)(implicit env : CompilationEnvironment) {
+    cond match {
+      case BooleanLiteral(true) =>
+        ch << Goto(then)
+
+      case BooleanLiteral(false) =>
+        ch << Goto(elze)
+
+      case And(es) =>
+        val fl = ch.getFreshLabel("andnext")
+        mkBranch(es.head, fl, elze, ch)
+        ch << Label(fl)
+        mkBranch(And(es.tail), then, elze, ch)
+
+      case Or(es) =>
+        val fl = ch.getFreshLabel("ornext")
+        mkBranch(es.head, then, fl, ch)
+        ch << Label(fl)
+        mkBranch(Or(es.tail), then, elze, ch) 
+
+      case Not(c) =>
+        mkBranch(c, elze, then, ch)
+
+      case Variable(b) =>
+        ch << ILoad(slotFor(b)) << IfEq(elze) << Goto(then)
+
+      case LessThan(l,r) =>
+        mkExpr(l, ch)
+        mkExpr(r, ch)
+        ch << If_ICmpLt(then) << Goto(elze) 
+      
+      case GreaterThan(l,r) =>
+        mkExpr(l, ch)
+        mkExpr(r, ch)
+        ch << If_ICmpGt(then) << Goto(elze) 
+      
+      case LessEquals(l,r) =>
+        mkExpr(l, ch)
+        mkExpr(r, ch)
+        ch << If_ICmpLe(then) << Goto(elze) 
+      
+      case GreaterEquals(l,r) =>
+        mkExpr(l, ch)
+        mkExpr(r, ch)
+        ch << If_ICmpGe(then) << Goto(elze) 
+      
+      case _ => throw CompilationException("Unsupported cond. expr. : " + cond)
+    }
+  }
+
+  private def slotFor(id : Identifier)(implicit env : CompilationEnvironment) : Int = {
+    env.varToLocal(id).getOrElse {
+      throw CompilationException("Unknown variable : " + id)
     }
   }
 }
diff --git a/src/main/scala/leon/codegen/CompilationEnvironment.scala b/src/main/scala/leon/codegen/CompilationEnvironment.scala
index 1eb9514e1..2bec36229 100644
--- a/src/main/scala/leon/codegen/CompilationEnvironment.scala
+++ b/src/main/scala/leon/codegen/CompilationEnvironment.scala
@@ -5,23 +5,53 @@ import purescala.Common._
 import purescala.Definitions._
 
 abstract class CompilationEnvironment() {
+  self =>
   // Should contain:
   //   - a mapping of function defs to class + method name
   //   - a mapping of class defs to class names
   //   - a mapping of class fields to fields
 
-  def funDefToMethod(funDef : FunDef) : Option[(String,String)]
+  def funDefToMethod(funDef : FunDef) : Option[(String,String,String)]
+
+  def varToLocal(v : Identifier) : Option[Int]
+
+  /** Augment the environment with new local var. mappings. */
+  def withVars(pairs : Map[Identifier,Int]) = {
+    new CompilationEnvironment {
+      def funDefToMethod(funDef : FunDef) = self.funDefToMethod(funDef)
+      def varToLocal(v : Identifier) = pairs.get(v).orElse(self.varToLocal(v))
+    }
+  }
 }
 
 object CompilationEnvironment {
+
+  lazy val empty = new CompilationEnvironment {
+    def funDefToMethod(funDef : FunDef) = None
+    def varToLocal(v : Identifier) = None
+  }
+
   def fromProgram(p : Program) : CompilationEnvironment = {
+    import CodeGeneration.typeToJVM
+
+    // This should change: it should contain the case classes before
+    // we go and generate function signatures.
+    implicit val env = empty
+
     val className = CodeGeneration.programToClassName(p)
 
     val fs = p.definedFunctions.filter(_.hasImplementation)
-    val fPairs : Map[FunDef,String] = fs.map(fd => (fd -> fd.id.uniqueName)).toMap
+
+    val fMap : Map[FunDef,(String,String,String)] = (fs.map { fd =>
+      val sig = "(" + fd.args.map(a => typeToJVM(a.tpe)).mkString("") + ")" + typeToJVM(fd.returnType)
+
+      fd -> (className, fd.id.uniqueName, sig)
+    }).toMap
 
     new CompilationEnvironment {
-      def funDefToMethod(funDef : FunDef) = fPairs.get(funDef).map(n => (className, n))
+      def funDefToMethod(funDef : FunDef) = fMap.get(funDef)
+
+      def varToLocal(v : Identifier) = None
     }
   }
 }
diff --git a/src/test/resources/regression/codegen/purescala/Prog001.scala b/src/test/resources/regression/codegen/purescala/Prog001.scala
index c0edc779f..a7f3b2335 100644
--- a/src/test/resources/regression/codegen/purescala/Prog001.scala
+++ b/src/test/resources/regression/codegen/purescala/Prog001.scala
@@ -1,5 +1,18 @@
 object Prog001 {
   def fortyTwo() = 42
 
-  // def plus(x : Int, y : Int) = x + y
+  def plus(x : Int, y : Int) = x + y
+
+  def double(x : Int) : Int = {
+    val a = x
+    a + a
+  }
+
+  // def implies(a : Boolean, b : Boolean) : Boolean = !a || b
+
+  def abs(x : Int) : Int = {
+    if(x < 0) -x else x
+  }
+
+  def factorial(i : Int) : Int = if(i <= 1) 1 else (i * factorial(i - 1))
 }
diff --git a/unmanaged/32/cafebabe_2.9.2-1.2.jar b/unmanaged/32/cafebabe_2.9.2-1.2.jar
index a7f91ed1b7e26933e0b0c657dbd2f240a423dc50..ccfc6ff432dfbae28dbb6508948a4a87dc52524f 100644
GIT binary patch
delta 11002
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
BIfwuN

delta 11086
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

-- 
GitLab