[pypy-svn] r49899 - pypy/dist/pypy/translator/llvm
arigo at codespeak.net
arigo at codespeak.net
Tue Dec 18 19:57:16 CET 2007
Author: arigo
Date: Tue Dec 18 19:57:15 2007
New Revision: 49899
Modified:
pypy/dist/pypy/translator/llvm/database.py
pypy/dist/pypy/translator/llvm/funcnode.py
pypy/dist/pypy/translator/llvm/gc.py
pypy/dist/pypy/translator/llvm/genllvm.py
pypy/dist/pypy/translator/llvm/modwrapper.py
pypy/dist/pypy/translator/llvm/node.py
pypy/dist/pypy/translator/llvm/opwriter.py
Log:
More progress.
Modified: pypy/dist/pypy/translator/llvm/database.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/database.py (original)
+++ pypy/dist/pypy/translator/llvm/database.py Tue Dec 18 19:57:15 2007
@@ -36,6 +36,7 @@
def __init__(self, genllvm, translator):
self.genllvm = genllvm
self.translator = translator
+ self.gctransformer = None
self.obj2node = {}
self._pendingsetup = []
self._tmpcount = 1
@@ -180,7 +181,7 @@
if value not in self.obj2node:
self.addpending(value, self.create_constant_node(ct, value))
- def prepare_arg_value(self, const_or_var):
+ def prepare_arg(self, const_or_var):
"""if const_or_var is not already in a dictionary self.obj2node,
the appropriate node gets constructed and gets added to
self._pendingsetup and to self.obj2node"""
@@ -189,27 +190,22 @@
const_or_var.value)
else:
assert isinstance(const_or_var, Variable)
+ self.prepare_type(const_or_var.concretetype)
- def prepare_arg(self, const_or_var):
- #log.prepare(const_or_var)
- self.prepare_type(const_or_var.concretetype)
- self.prepare_arg_value(const_or_var)
-
def prepare_offset(self, offset):
if isinstance(offset, llmemory.CompositeOffset):
for value in offset.offsets:
self.prepare_offset(value)
elif isinstance(offset, llarena.RoundedUpForAllocation):
- print '<<<<<<<<<<<<<<<', offset.basesize
- #import pdb; pdb.set_trace()
self.prepare_offset(offset.basesize)
elif hasattr(offset, 'TYPE'):
self.prepare_type(offset.TYPE)
def setup_all(self):
+ self.gcpolicy.setup()
while self._pendingsetup:
- node = self._pendingsetup.pop(0)
+ node = self._pendingsetup.pop()
#log.settingup(node)
node.setup()
@@ -602,7 +598,10 @@
if isinstance(value, llarena.RoundedUpForAllocation):
# XXX not supported when used in a CompositeOffset
r_basesize = self.repr_offset(value.basesize)
- return "((%s + 7) & ~ 7)"
+ # XXX XXX XXX we hit an llvm assertion with the following
+ # expression! for now let's not align anything :-(
+ #return "and(i32 add(i32 %s, i32 7), i32 -8)" % r_basesize
+ return r_basesize
from_, indices, to = self.get_offset(value, [])
Modified: pypy/dist/pypy/translator/llvm/funcnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/funcnode.py (original)
+++ pypy/dist/pypy/translator/llvm/funcnode.py Tue Dec 18 19:57:15 2007
@@ -1,4 +1,4 @@
-from pypy.objspace.flow.model import Block, Constant, Link
+from pypy.objspace.flow.model import Block, Constant, Link, copygraph, Variable
from pypy.objspace.flow.model import mkentrymap, c_last_exception
from pypy.rpython.lltypesystem import lltype
from pypy.translator.llvm.node import FuncNode
@@ -40,14 +40,45 @@
# ______________________________________________________________________
# main entry points from genllvm
- def post_setup_transform(self):
- remove_double_links(self.db.translator.annotator, self.graph)
- no_links_to_startblock(self.graph)
+ def patch_graph(self):
+ graph = self.graph
+ if self.db.gctransformer:
+ # inline the GC helpers (malloc, write_barrier) into
+ # a copy of the graph
+ graph = copygraph(graph, shallow=True)
+ self.db.gctransformer.inline_helpers(graph)
+ # the 'gc_reload_possibly_moved' operations make the graph not
+ # really SSA. Fix them now.
+ for block in graph.iterblocks():
+ rename = {}
+ for op in list(block.operations):
+ if rename:
+ op.args = [rename.get(v, v) for v in op.args]
+ if op.opname == 'gc_reload_possibly_moved':
+ v_newaddr, v_targetvar = op.args
+ assert isinstance(v_targetvar.concretetype, lltype.Ptr)
+ v_newptr = Variable()
+ v_newptr.concretetype = v_targetvar.concretetype
+ op.opname = 'cast_adr_to_ptr'
+ op.args = [v_newaddr]
+ op.result = v_newptr
+ rename[v_targetvar] = v_newptr
+ if rename:
+ block.exitswitch = rename.get(block.exitswitch,
+ block.exitswitch)
+ for link in block.exits:
+ link.args = [rename.get(v, v) for v in link.args]
+ # fix special cases that llvm can't handle
+ remove_double_links(self.db.translator.annotator, graph)
+ no_links_to_startblock(graph)
+ return graph
def writedecl(self, codewriter):
codewriter.declare(self.getdecl())
def writeimpl(self, codewriter):
+ self.oldgraph = self.graph
+ self.graph = self.patch_graph()
graph = self.graph
log.writeimpl(graph.name)
codewriter.openfunc(self.getdecl())
@@ -69,6 +100,8 @@
codewriter._indent('call void @abort()')
codewriter._indent('unreachable')
codewriter.closefunc()
+ self.graph = self.oldgraph
+ del self.oldgraph
# ______________________________________________________________________
# writing helpers for entry points
Modified: pypy/dist/pypy/translator/llvm/gc.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/gc.py (original)
+++ pypy/dist/pypy/translator/llvm/gc.py Tue Dec 18 19:57:15 2007
@@ -11,6 +11,9 @@
n_malloced = 0
def __init__(self, db):
raise Exception, 'GcPolicy should not be used directly'
+
+ def setup(self):
+ pass
def genextern_code(self):
return ''
@@ -143,9 +146,15 @@
def __init__(self, db):
self.db = db
+ def setup(self):
+ c_fnptr = self.db.gctransformer.frameworkgc_setup_ptr
+ self.db.prepare_arg(c_fnptr)
+
def genextern_code(self):
- r = ''
- r += '#define __GC_STARTUP_CODE__\n'
+ fnptr = self.db.gctransformer.frameworkgc_setup_ptr.value
+ fnnode = self.db.obj2node[fnptr._obj]
+ r = 'void %s(void); /* forward declaration */\n' % (fnnode.name[1:],)
+ r += '#define __GC_STARTUP_CODE__ %s();\n' % (fnnode.name[1:],)
r += '#define __GC_SETUP_CODE__\n'
return r
Modified: pypy/dist/pypy/translator/llvm/genllvm.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/genllvm.py (original)
+++ pypy/dist/pypy/translator/llvm/genllvm.py Tue Dec 18 19:57:15 2007
@@ -121,6 +121,7 @@
self.db = Database(self, self.translator)
self.db.gcpolicy = GcPolicy.new(self.db, self.config)
+ self.db.gctransformer = c_db.gctransformer
# get entry point
entry_point = self.get_entry_point(func)
@@ -138,9 +139,6 @@
self.translator.rtyper.specialize_more_blocks()
self.db.setup_all()
self._checkpoint('setup_all externs')
-
- for node in self.db.getnodes():
- node.post_setup_transform()
self._print_node_stats()
@@ -168,7 +166,7 @@
bk = self.translator.annotator.bookkeeper
ptr = getfunctionptr(bk.getdesc(func).getuniquegraph())
c = inputconst(lltype.typeOf(ptr), ptr)
- self.db.prepare_arg_value(c)
+ self.db.prepare_arg(c)
# ensure unqiue entry node name for testing
entry_node = self.db.obj2node[c.value._obj]
Modified: pypy/dist/pypy/translator/llvm/modwrapper.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/modwrapper.py (original)
+++ pypy/dist/pypy/translator/llvm/modwrapper.py Tue Dec 18 19:57:15 2007
@@ -22,9 +22,10 @@
rpyexc_fetch_type.argtypes = []
rpyexc_fetch_type.restype = ctypes.c_void_p
-GC_get_heap_size_wrapper = _c.GC_get_heap_size
-GC_get_heap_size_wrapper.argtypes = []
-GC_get_heap_size_wrapper.restype = ctypes.c_int
+if hasattr(_c, 'GC_get_heap_size'):
+ GC_get_heap_size_wrapper = _c.GC_get_heap_size
+ GC_get_heap_size_wrapper.argtypes = []
+ GC_get_heap_size_wrapper.restype = ctypes.c_int
startup_code = _c.ctypes_RPython_StartupCode
startup_code.argtypes = []
Modified: pypy/dist/pypy/translator/llvm/node.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/node.py (original)
+++ pypy/dist/pypy/translator/llvm/node.py Tue Dec 18 19:57:15 2007
@@ -29,9 +29,6 @@
def setup(self):
pass
- def post_setup_transform(self):
- pass
-
def writesetupcode(self, codewriter):
" pre entry-point setup "
pass
Modified: pypy/dist/pypy/translator/llvm/opwriter.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/opwriter.py (original)
+++ pypy/dist/pypy/translator/llvm/opwriter.py Tue Dec 18 19:57:15 2007
@@ -591,5 +591,5 @@
def debug_llinterpcall(self, opr):
self.codewriter.call(None, "void", "@abort", [], [])
# cheat llvm
- self.codewriter.cast(opr.retref, opr.rettype, 'null', opr.rettype)
+ self.codewriter.cast(opr.retref, opr.rettype, 'undef', opr.rettype)
More information about the Pypy-commit
mailing list