From bfa625c13bd957d27f9c1acf19c6d014c13f61cf Mon Sep 17 00:00:00 2001
From: Jan Hoenig <hrominium@gmail.com>
Date: Thu, 15 Dec 2016 22:14:55 +0100
Subject: [PATCH] Yay need some llvm-specific transformation probably

---
 backends/llvm.py | 23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/backends/llvm.py b/backends/llvm.py
index 5b4fcd6c5..e3cf473cb 100644
--- a/backends/llvm.py
+++ b/backends/llvm.py
@@ -38,9 +38,12 @@ class LLVMPrinter(Printer):
     def _print_Number(self, n, **kwargs):
         return ir.Constant(self.fp_type, float(n))
 
-    def _print_Integer(self, expr):
+    def _print_Float(self, expr):
         return ir.Constant(self.fp_type, float(expr.p))
 
+    def _print_Integer(self, expr):
+        return ir.Constant(self.integer, expr.p)
+
     def _print_int(self, i):
         return ir.Constant(self.integer, i)
 
@@ -48,7 +51,7 @@ class LLVMPrinter(Printer):
         val = self.tmp_var.get(s)
         if not val:
             # look up parameter with name s
-            val = self.func_arg_map.get(s)
+            val = self.func_arg_map.get(s.name)
         if not val:
             raise LookupError("Symbol not found: %s" % s)
         return val
@@ -78,7 +81,6 @@ class LLVMPrinter(Printer):
     def _print_Mul(self, expr):
         nodes = [self._print(a) for a in expr.args]
         e = nodes[0]
-        print(nodes)
         for node in nodes[1:]:
             e = self.builder.fmul(e, node)
         return e
@@ -87,6 +89,7 @@ class LLVMPrinter(Printer):
         nodes = [self._print(a) for a in expr.args]
         e = nodes[0]
         for node in nodes[1:]:
+            print(e, node)
             e = self.builder.fadd(e, node)
         return e
 
@@ -101,18 +104,22 @@ class LLVMPrinter(Printer):
             else:
                 parameter_type.append(self.fp_type)
         func_type = ir.FunctionType(return_type, tuple(parameter_type))
-        self.fn = ir.Function(self.module, func_type, function.functionName)
+        name = function.functionName
+        fn = ir.Function(self.module, func_type, name)
+        self.ext_fn[name] = fn
 
         # set proper names to arguments
-        for i, arg in enumerate(self.fn.args):
+        for i, arg in enumerate(fn.args):
             arg.name = function.parameters[i].name
+            self.func_arg_map[function.parameters[i].name] = arg
 
         # func.attributes.add("inlinehint")
         # func.attributes.add("argmemonly")
-        block = self.fn.append_basic_block(name="entry")
+        block = fn.append_basic_block(name="entry")
         self.builder = ir.IRBuilder(block)
         self._print(function.body)
-        return self.fn
+        self.fn = fn
+        return fn
 
     def _print_Block(self, block):
         for node in block.children():
@@ -131,7 +138,7 @@ class LLVMPrinter(Printer):
 
         #  Should have a list of math library functions to validate this.
 
-    # TODO delete this?
+    # TODO delete this -> NO this should be a function call
     def _print_Function(self, expr):
         name = expr.func.__name__
         e0 = self._print(expr.args[0])
-- 
GitLab