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