[pypy-svn] r35494 - pypy/dist/pypy/jit/codegen/llvm

ericvrp at codespeak.net ericvrp at codespeak.net
Fri Dec 8 17:47:20 CET 2006


Author: ericvrp
Date: Fri Dec  8 17:47:19 2006
New Revision: 35494

Modified:
   pypy/dist/pypy/jit/codegen/llvm/rgenop.py
Log:
intermediate llvmjit checkin (moving to x86 machine for testing)


Modified: pypy/dist/pypy/jit/codegen/llvm/rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/llvm/rgenop.py	(original)
+++ pypy/dist/pypy/jit/codegen/llvm/rgenop.py	Fri Dec  8 17:47:19 2006
@@ -3,11 +3,12 @@
 from pypy.jit.codegen.model import AbstractRGenOp, GenLabel, GenBuilder
 from pypy.jit.codegen.model import GenVar, GenConst, CodeGenSwitch
 from pypy.jit.codegen.llvm import llvmjit
+from pypy.rlib.objectmodel import we_are_translated
 
 
 def log(s):
-    #print str(s)
-    pass
+    if not we_are_translated():
+        print str(s)
 
 
 class Count(object):
@@ -24,11 +25,23 @@
         count.n_vars += 1
 
     def operand(self):
-        return 'int ' + self.name
+        return self.type() + ' ' + self.name
 
     def operand2(self):
         return self.name
 
+    def type(self):
+        return 'int'
+
+
+class VarAddr(Var):
+
+    def __init__(self, var):
+        self.name = var.name + '_' 
+
+    def type(self):
+        return super(VarAddr, self).type() + '*'
+
 
 class IntConst(GenConst):
 
@@ -36,11 +49,14 @@
         self.value = value
 
     def operand(self):
-        return 'int ' + str(self.value)
+        return self.type() + ' ' + str(self.value)
 
     def operand2(self):
         return str(self.value)
 
+    def type(self):
+        return 'int'
+
     @specialize.arg(1)
     def revealconst(self, T):
         if isinstance(T, lltype.Ptr):
@@ -57,11 +73,14 @@
         self.addr = addr
 
     def operand(self):
-        return 'int* ' + str(llmemory.cast_adr_to_int(self.addr))
+        return self.type() + ' ' + str(llmemory.cast_adr_to_int(self.addr))
 
     def operand2(self):
         return str(llmemory.cast_adr_to_int(self.addr))
 
+    def type(self):
+        return 'int*'
+
     @specialize.arg(1)
     def revealconst(self, T):
         if T is llmemory.Address:
@@ -81,11 +100,20 @@
         count.n_labels += 1
 
     def operand(self):
-        return 'label %' + self.label
+        return self.type() + ' %' + self.label
 
     def operand2(self):
         return self.label + ':'
 
+    def type(self):
+        return 'label'
+
+
+class EntryLabel(Label):
+
+    def __init(self):
+        self.label = 'L_' #Block-label for alloca's. The label is never put in the source!
+
 
 class FlexSwitch(CodeGenSwitch):
 
@@ -169,7 +197,7 @@
 class Builder(object):  #changed baseclass from (GenBuilder) for better error messages
 
     def __init__(self, rgenop, asm, prev_block_closed=False):
-        self.label = Label()
+        self.label = EntryLabel()
         log('%s Builder.__init__' % self.label.operand2())
         self.rgenop = rgenop
         self.asm = asm  #list of llvm assembly source code lines
@@ -185,7 +213,7 @@
         asm_string = ''
         for asm in self.rgenop.asms:
             asm_string += '\n'.join(asm) + '\n\n'
-        self.rgenop.asms = None
+        self.rgenop.asms = None #XXX or [] ?
         log(asm_string)
         llvmjit.parse(asm_string)
         llvmjit.transform(3) #optimize module (should be on functions actually)
@@ -199,8 +227,18 @@
         inputargs_gv = [Var() for i in range(numargs)]
         self.asm.append('int %%%s(%s){' % (
             self.rgenop.name, ','.join([v.operand() for v in inputargs_gv])))
-        self.asm.append(self.label.operand2())
-        return inputargs_gv
+
+        inputargs_gv_ = []
+        for v in inputargs_gv:
+            v_ = VarAddr(v)
+            inputargs_gv_.append(v_)
+            self.asm.append(' %s=alloca %s' % (v_.operand2(), v.type()))
+            self.asm.append(' store %s,%s %s' % (v.operand(), v_.type(), v_.operand2()))
+
+        #self.asm.append(self.label.operand2())
+        #note: alloca's should be appended to self.rgenop.asms[0]
+        self.asm = self.rgenop.open_asm() #note: previous self.asm already appended to self.asms
+        return inputargs_gv #XXX make this inputargs_gv_
 
     def _close(self):
         log('%s Builder._close' % self.label.operand2())
@@ -377,9 +415,6 @@
     funcname = {} #HACK for looking up function names given a pre/post compilation function pointer
     funcused = {} #we rename functions when encountered multiple times (for test_branching_compile)
 
-    def __init__(self):
-        self.asms = []
-
     def open_asm(self):
         asm = []
         self.asms.append(asm)
@@ -403,6 +438,7 @@
             self.funcused[name] = 0
 
         log('RLLVMGenOp.newgraph %s,%s' % (sigtoken, name))
+        self.asms = []
         numargs = sigtoken          # for now
         self.name = name
         builder = self.openbuilder(False) #enables initial label



More information about the Pypy-commit mailing list