[pypy-svn] r48763 - in pypy/dist/pypy/translator/llvm: . test

rxe at codespeak.net rxe at codespeak.net
Sat Nov 17 23:53:21 CET 2007


Author: rxe
Date: Sat Nov 17 23:53:21 2007
New Revision: 48763

Modified:
   pypy/dist/pypy/translator/llvm/arraynode.py
   pypy/dist/pypy/translator/llvm/codewriter.py
   pypy/dist/pypy/translator/llvm/database.py
   pypy/dist/pypy/translator/llvm/gc.py
   pypy/dist/pypy/translator/llvm/genllvm.py
   pypy/dist/pypy/translator/llvm/opaquenode.py
   pypy/dist/pypy/translator/llvm/test/runtest.py
   pypy/dist/pypy/translator/llvm/test/test_rbuiltin.py
Log:
sync up local changes before sprint.

* clean ups from llvm2.0 transistion 
* add a debug string node, and a function for debug in codewriter
* fix up some test mess



Modified: pypy/dist/pypy/translator/llvm/arraynode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/arraynode.py	(original)
+++ pypy/dist/pypy/translator/llvm/arraynode.py	Sat Nov 17 23:53:21 2007
@@ -1,6 +1,34 @@
 from pypy.rpython.lltypesystem import lltype
 from pypy.translator.llvm.node import ConstantNode
 
+class DebugStrNode(ConstantNode):
+    prefix = "@dg_isnt"
+    def __init__(self, value):
+        self.value = value
+        self.make_name()
+
+    def get_length(self):
+        return len(self.value) + 1
+
+    def get_typerepr(self):
+        return '[%s x i8]' % self.get_length()
+    
+    def constantvalue(self):
+        return '%s c"%s\\00"' % (self.get_typerepr(), self.value)
+
+    def get_childref(self, index):
+        x = "getelementptr(%s* %s, i32 0, i32 %s)" % (
+            self.get_typerepr(),
+            self.name,
+            index)
+        #XXX probably why we are failing anyways
+        return 'bitcast(i8* %s to [0 x i8]*)' % x
+    
+    def writeglobalconstants(self, codewriter):
+        codewriter.globalinstance(self.ref, self.constantvalue())
+        codewriter.newline()
+        codewriter.newline()
+        
 class ArrayNode(ConstantNode):
     __slots__ = "db value arraytype".split()
     prefix = '@a_inst'

Modified: pypy/dist/pypy/translator/llvm/codewriter.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/codewriter.py	(original)
+++ pypy/dist/pypy/translator/llvm/codewriter.py	Sat Nov 17 23:53:21 2007
@@ -9,9 +9,9 @@
     linkage = 'internal '       #/internal (disabled for now because of the JIT)
 
     def __init__(self, file, db, tail=None, cconv=None, linkage=None): 
+        self.db = db
         self.file = file
         self.word_repr = db.get_machine_word()
-        self.uword_repr = db.get_machine_uword()
         if tail is not None:
             self.tail = tail
         if cconv is not None:
@@ -48,7 +48,6 @@
     def write_lines(self, lines, patch=False):
         for l in lines.split("\n"):
             if patch:
-                l = l.replace('UWORD', self.uword_repr)
                 l = l.replace('WORD', self.word_repr)
                 l = l.replace('POSTFIX', postfix())
                 l = l.replace('CC', self.cconv)
@@ -88,11 +87,6 @@
             cconv = self.cconv
         self._append("declare %s %s" %(cconv, decl,))
 
-    def startimpl(self):
-        self.newline()
-        #self._append("implementation")
-        self.newline()
-
     def br_uncond(self, blockname): 
         self._indent("br label %%%s" %(blockname,))
 
@@ -210,3 +204,10 @@
 
     def free(self, vartype, varref):
         self._indent("free %s %s" % (vartype, varref))
+
+    def debug_print(self, s):
+        var = self.db.repr_tmpvar()
+        node = self.db.create_debug_string(s)
+        self.call(var, "i32", "@write",
+                  ['i32', '[0 x i8]*', 'i32'],
+                  ['2', node.get_childref(0), '%d' % node.get_length()])

Modified: pypy/dist/pypy/translator/llvm/database.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/database.py	(original)
+++ pypy/dist/pypy/translator/llvm/database.py	Sat Nov 17 23:53:21 2007
@@ -11,7 +11,7 @@
 from pypy.translator.llvm.structnode import StructNode, StructVarsizeNode, \
      getindexhelper,  FixedSizeArrayNode
 from pypy.translator.llvm.arraynode import ArrayNode, StrArrayNode, \
-     VoidArrayNode, ArrayNoLengthNode
+     VoidArrayNode, ArrayNoLengthNode, DebugStrNode
      
 from pypy.rpython.lltypesystem import lltype, llmemory
 from pypy.objspace.flow.model import Constant, Variable
@@ -29,7 +29,6 @@
         self.obj2node = {}
         self._pendingsetup = []
         self._tmpcount = 1
-        self.helper2ptr = {}
 
         self.primitives = Primitives(self)
 
@@ -38,25 +37,34 @@
         self.typedefnodes = []
         self.containernodes = []
 
+        self.debugstringnodes = []
+
+
     #_______debuggging______________________________________
 
     def dump_pbcs(self):
         r = ""
         for k, v in self.obj2node.iteritems():
+
+            if isinstance(v, FuncImplNode):
+                continue
             
             if isinstance(k, lltype.LowLevelType):
                 continue
 
             assert isinstance(lltype.typeOf(k), lltype.ContainerType)
+            
             # Only dump top levels
             p, _ = lltype.parentlink(k)
-            if p is None:
-                ref = v.get_ref()
-                pbc_ref = v.get_ref()
+            ref = v.get_ref()
+            type_ = self.repr_type(lltype.Ptr(lltype.typeOf(k)))
+            pbc_ref = v.get_pbcref(type_)
                 
-                r += "\ndump_pbcs %s (%s)\n" \
-                     "getref -> %s \n" \
-                     "pbcref -> %s \n" % (v, k, ref, pbc_ref)
+            r += "\ndump_pbcs %s (%s)\n" \
+                 "parent %s\n" \
+                 "type %s\n" \
+                 "getref -> %s \n" \
+                 "pbcref -> %s \n" % (v, k, p, type_, ref, pbc_ref)
         return r
     
     #_______setting up and preparation______________________________
@@ -244,11 +252,7 @@
                 return self.primitives.repr(arg.concretetype, arg.value)
             else:
                 assert isinstance(arg.value, lltype._ptr)
-                if isinstance(arg.value._obj, int):
-                    rt = self.repr_type(arg.concretetype)
-                    v = repr(arg.value._obj)
-                    return 'cast (int %s to %s)' % (v, rt)
-                elif not arg.value:
+                if not arg.value:
                     return 'null'
                 else:
                     node = self.obj2node[arg.value._obj]
@@ -297,9 +301,6 @@
             if value is None:
                 return None, "%s null" % toptr
 
-            if isinstance(value, int):
-                return None, '%s cast (int %s to %s)' % (toptr, value, toptr)
-
             node = self.obj2node[value]
             ref = node.get_pbcref(toptr)
             return node, "%s %s" % (toptr, ref)
@@ -326,9 +327,6 @@
     def get_machine_word(self):
         return self.primitives[lltype.Signed]
 
-    def get_machine_uword(self):
-        return self.primitives[lltype.Unsigned]
-
     def is_function_ptr(self, arg):
         if isinstance(arg, (Constant, Variable)): 
             arg = arg.concretetype 
@@ -341,6 +339,10 @@
         node = self.obj2node[parent]
         return node.get_childref(child)
 
+    def create_debug_string(self, s):
+        r = DebugStrNode(s)
+        self.debugstringnodes.append(r)
+        return r
 
 class Primitives(object):
     def __init__(self, database):        
@@ -355,7 +357,7 @@
             lltype.UnsignedLongLong: "i64",
             lltype.SignedLongLong: "i64",
             llmemory.Address: "i8*",
-            #llmemory.WeakGcAddress: "sbyte*",
+            #XXX llmemory.WeakGcAddress: "i8*",
             }
 
         # 32 bit platform
@@ -462,7 +464,6 @@
     def repr_singlefloat(self, type_, value):
         from pypy.rlib.rarithmetic import isinf, isnan
         
-        # XXX this doesnt work on 1.9 -> only hex repr supported for single floats
         f = float(value)
         if isinf(f) or isnan(f):
             import struct
@@ -557,7 +558,6 @@
     def get_offset(self, value, initialindices=None):
         " return (from_type, (indices, ...), to_type) "
         word = self.database.get_machine_word()
-        uword = self.database.get_machine_uword()
         indices = initialindices or [(word, 0)]
 
         if isinstance(value, llmemory.ItemOffset):
@@ -572,7 +572,7 @@
             # jumps to a field position in a struct
             from_ = value.TYPE
             pos = getindexhelper(value.fldname, value.TYPE)
-            indices.append((uword, pos))
+            indices.append((word, pos))
             to = getattr(value.TYPE, value.fldname)            
 
         elif isinstance(value, llmemory.ArrayLengthOffset):
@@ -580,14 +580,14 @@
             from_ = value.TYPE     # <Array of T> or <GcArray of T>
             assert isinstance(value.TYPE, lltype.Array)
             if not value.TYPE._hints.get("nolength", False):
-                indices.append((uword, 0))
+                indices.append((word, 0))
             to = lltype.Signed
 
         elif isinstance(value, llmemory.ArrayItemsOffset):
             # jumps to the beginning of array area
             from_ = value.TYPE
             if not isinstance(value.TYPE, lltype.FixedSizeArray) and not value.TYPE._hints.get("nolength", False):
-                indices.append((uword, 1))
+                indices.append((word, 1))
             indices.append((word, 0))    # go to the 1st item
             to = value.TYPE.OF
 

Modified: pypy/dist/pypy/translator/llvm/gc.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/gc.py	(original)
+++ pypy/dist/pypy/translator/llvm/gc.py	Sat Nov 17 23:53:21 2007
@@ -76,14 +76,14 @@
                     exc_flag=False):
         """ assumes malloc of word size """
         XXX
-        uword = self.db.get_machine_uword()
+        word = self.db.get_machine_word()
         boundary_size = 0
 
         # malloc_size is unsigned right now
-        codewriter.malloc(targetvar, "sbyte", size)
+        codewriter.malloc(targetvar, "i8", size)
         # XXX uses own cconv
         codewriter.call(None, 'void', '@llvm.memset' + postfix(),
-                        ['sbyte*', 'ubyte', uword, uword],
+                        ['i8*', 'i8', word, word],
                         [targetvar, 0, size, boundary_size],
                         cconv='ccc')               
 
@@ -107,10 +107,7 @@
                     exc_flag=False):
         """ assumes malloc of word size """
         boundary_size = 0
-
         word = self.db.get_machine_word()
-        uword = self.db.get_machine_uword()
-
         fnname = '@pypy_malloc' + (atomic and '_atomic' or '')
 
 ##        XXX (arigo) disabled the ring buffer for comparison purposes
@@ -121,9 +118,6 @@
 ##            # dont clear the ringbuffer data
 ##            atomic = False 
 
-        # malloc_size is unsigned right now
-        #sizeu = '%malloc_sizeu' + self.get_count()        
-        #codewriter.cast(sizeu, word, size, uword)
         codewriter.call(targetvar, 'i8*', fnname, [word], [size])
 
         if atomic:

Modified: pypy/dist/pypy/translator/llvm/genllvm.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/genllvm.py	(original)
+++ pypy/dist/pypy/translator/llvm/genllvm.py	Sat Nov 17 23:53:21 2007
@@ -17,6 +17,8 @@
 from pypy.translator.llvm.log import log
 
 class GenLLVM(object):
+    debug = False
+    
     # see create_codewriter() below
     function_count = {}
 
@@ -66,6 +68,8 @@
             if hasattr(node, 'writeimpl'):
                 node.writeimpl(codewriter)
 
+        self._debug()
+        
         codewriter.comment("End of file")
         codewriter.close()
         self._checkpoint('done')
@@ -228,3 +232,13 @@
         for s in stats:
             log('STATS %s' % str(s))
 
+    def _debug(self):
+        if self.debug:
+            if self.db.debugstringnodes:            
+                codewriter.header_comment("Debug string")
+                for node in self.db.debugstringnodes:
+                    node.writeglobalconstants(codewriter)
+
+            #print "Start"
+            #print self.db.dump_pbcs()
+            #print "End"

Modified: pypy/dist/pypy/translator/llvm/opaquenode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/opaquenode.py	(original)
+++ pypy/dist/pypy/translator/llvm/opaquenode.py	Sat Nov 17 23:53:21 2007
@@ -43,23 +43,3 @@
     def constantvalue(self):
         return "%s zeroinitializer" % self.db.repr_type(self.value._TYPE)
 
-    def writesetupcode(self, codewriter):
-        T = self.value._TYPE
-        # XXX similar non generic hacks to genc for now
-        if T.tag == 'ThreadLock':
-            XXX
-            argrefs = [self.get_ref()]
-            argtypes = [self.db.repr_type(T) + "*"]
-            lock = self.value.externalobj
-            argtypes.append("int")
-            if lock.locked():
-                argrefs.append('1')
-            else:
-                argrefs.append('0')
-
-            # XXX Check result
-            codewriter.call(self.db.repr_tmpvar(),
-                            "sbyte*",
-                            "%RPyOpaque_LLVM_SETUP_ThreadLock",
-                            argtypes, argrefs)
-            # XXX Check result

Modified: pypy/dist/pypy/translator/llvm/test/runtest.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/test/runtest.py	(original)
+++ pypy/dist/pypy/translator/llvm/test/runtest.py	Sat Nov 17 23:53:21 2007
@@ -214,7 +214,8 @@
             py.test.skip('PowerPC --> %s' % reason)
 
     def _skip_llinterpreter(self, reason, skipLL=True, skipOO=True):
-        py.test.skip("skip_llinterpreter")
+        if skipLL:
+            py.test.skip("skip_llinterpreter - skipLL=True")
 
     def interpret(self, fn, args, annotation=None):
         fn = self._compile(fn, args, annotation)

Modified: pypy/dist/pypy/translator/llvm/test/test_rbuiltin.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/test/test_rbuiltin.py	(original)
+++ pypy/dist/pypy/translator/llvm/test/test_rbuiltin.py	Sat Nov 17 23:53:21 2007
@@ -1,9 +1,12 @@
 import py
 from pypy.rpython.test.test_rbuiltin import BaseTestRbuiltin
+
 from pypy.translator.llvm.test.runtest import *
 
 class TestLLVMBuiltin(LLVMTest, BaseTestRbuiltin):
-    def _skip_llinterpreter(self):
-        LLVMTest._skip_llinterpreter(self)
-    test_os_open = _skip_llinterpreter
-    test_debug_llinterpcall = _skip_llinterpreter
+    def _skip(self):
+        py.test.skip("XXX specialize this")
+
+    test_os_dup = _skip
+    test_os_open = _skip
+    test_debug_llinterpcall = _skip



More information about the Pypy-commit mailing list