[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