[pypy-svn] r16088 - pypy/dist/pypy/translator/llvm2
rxe at codespeak.net
rxe at codespeak.net
Mon Aug 15 22:56:57 CEST 2005
Author: rxe
Date: Mon Aug 15 22:56:56 2005
New Revision: 16088
Modified:
pypy/dist/pypy/translator/llvm2/database.py
pypy/dist/pypy/translator/llvm2/genllvm.py
Log:
A intermediate checkin to get extra info for externs - borrowed from genc. Not
sure how much of it we need yet.
Modified: pypy/dist/pypy/translator/llvm2/database.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/database.py (original)
+++ pypy/dist/pypy/translator/llvm2/database.py Mon Aug 15 22:56:56 2005
@@ -213,15 +213,16 @@
self.prepare_type(const_or_var.concretetype)
self.prepare_arg_value(const_or_var)
- def setup_all(self, key):
- print self.obj2node
- entrynode = self.obj2node[key]
+
+ def setup_all(self):
while self._pendingsetup:
node = self._pendingsetup.pop()
log.settingup(node)
node.setup()
- self.entrynode = entrynode
- return entrynode
+
+ def set_entrynode(self, key):
+ self.entrynode = self.obj2node[key]
+ return self.entrynode
def getnodes(self):
return self.obj2node.values()
Modified: pypy/dist/pypy/translator/llvm2/genllvm.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/genllvm.py (original)
+++ pypy/dist/pypy/translator/llvm2/genllvm.py Mon Aug 15 22:56:56 2005
@@ -10,7 +10,7 @@
from pypy.rpython import lltype
from pypy.tool.udir import udir
from pypy.translator.llvm2.codewriter import CodeWriter
-from pypy.translator.llvm2.extfuncnode import ExternalFuncNode
+from pypy.translator.llvm2 import extfuncnode
from pypy.translator.llvm2.module.extfunction import extdeclarations, \
extfunctions, gc_boehm, gc_disabled, dependencies
from pypy.translator.llvm2.node import LLVMNode
@@ -34,11 +34,44 @@
self.db = Database(translator)
self.translator = translator
translator.checkgraphs()
- ExternalFuncNode.used_external_functions = {}
+ extfuncnode.ExternalFuncNode.used_external_functions = {}
# for debug we create comments of every operation that may be executed
self.debug = debug
-
+
+ def _add_to_database(self, name, funcptr):
+ ptr = getfunctionptr(self.translator, func)
+ c = inputconst(lltype.typeOf(funcptr), funcptr)
+ c.value._obj.graph.name = name
+ self.db.prepare_arg_value(c)
+
+ def post_setup_externs(self):
+ import types
+
+ rtyper = self.db._translator.rtyper
+ from pypy.translator.c.extfunc import predeclare_all
+
+ # hacks to make predeclare_all work
+ self.db.standalone = True
+ self.db.externalfuncs = {}
+ decls = list(predeclare_all(self.db, rtyper))
+
+ for c_name, obj in decls:
+ if isinstance(obj, lltype.LowLevelType):
+ self.db.prepare_type(obj)
+ elif isinstance(obj, types.FunctionType):
+ funcptr = getfunctionptr(self.translator, obj)
+ c = inputconst(lltype.typeOf(funcptr), funcptr)
+ self.db.prepare_arg_value(c)
+
+ elif isinstance(lltype.typeOf(obj), lltype.Ptr):
+ self.db.prepare_constant(lltype.typeOf(obj), obj)
+ else:
+ print "XXX predeclare" , c_name, type(obj), obj
+ assert False
+
+ return decls
+
def gen_llvm_source(self, func=None):
if self.debug: print 'gen_llvm_source begin) ' + time.ctime()
if func is None:
@@ -57,22 +90,32 @@
# self.db.prepare_arg_value(c)
# make sure exception matching and exception type are available
- e = self.translator.rtyper.getexceptiondata()
- for ll_helper in (e.ll_exception_match, e.ll_raise_OSError):
- ptr = getfunctionptr(self.translator, ll_helper)
- c = inputconst(lltype.typeOf(ptr), ptr)
- self.db.prepare_arg_value(c)
+ # XXX Comment out anywat
+ #e = self.translator.rtyper.getexceptiondata()
+ #for ll_helper in (e.ll_exception_match, e.ll_raise_OSError):
+ # ptr = getfunctionptr(self.translator, ll_helper)
+ # c = inputconst(lltype.typeOf(ptr), ptr)
+ # self.db.prepare_arg_value(c)
ptr = getfunctionptr(self.translator, func)
c = inputconst(lltype.typeOf(ptr), ptr)
entry_point = c.value._obj
self.db.prepare_arg_value(c)
- if self.debug: print 'gen_llvm_source db.setup_all) ' + time.ctime()
+ #if self.debug: print 'gen_llvm_source db.setup_all) ' + time.ctime()
#7 minutes
- self.entrynode = self.db.setup_all(entry_point)
- if self.debug: print 'gen_llvm_source typ_decl.writedatatypedecl) ' + time.ctime()
- if self.debug: print 'gen_llvm_source n_nodes) %d' % len(self.db.getnodes())
+
+ # set up all nodes
+ self.db.setup_all()
+ self.entrynode = self.db.set_entrynode(entry_point)
+
+ # post set up externs
+ extern_decls = self.post_setup_externs()
+ self.db._translator.rtyper.specialize_more_blocks()
+ self.db.setup_all()
+
+ #if self.debug: print 'gen_llvm_source typ_decl.writedatatypedecl) ' + time.ctime()
+ #if self.debug: print 'gen_llvm_source n_nodes) %d' % len(self.db.getnodes())
#3 seconds
#if self.debug:
# log.gen_llvm_source(self.db.dump_pbcs())
@@ -91,6 +134,19 @@
nl = codewriter.newline
nl(); comment("Type Declarations"); nl()
+
+ for c_name, obj in extern_decls:
+
+ if isinstance(obj, lltype.LowLevelType):
+ if isinstance(obj, lltype.Ptr):
+ obj = obj.TO
+ l = "%%%s = type %s" % (c_name, self.db.repr_type(obj))
+ codewriter.append(l)
+ #XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+ #elif isinstance(obj, types.FunctionType):
+ # #c.value._obj.graph.name = c_name
+ # print "XXX predeclare" , c_name, type(obj), obj
+
for typ_decl in self.db.getnodes():
typ_decl.writedatatypedecl(codewriter)
@@ -137,7 +193,7 @@
if self.debug: print 'gen_llvm_source used_external_functions) ' + time.ctime()
depdone = {}
- for funcname,value in ExternalFuncNode.used_external_functions.iteritems():
+ for funcname,value in extfuncnode.ExternalFuncNode.used_external_functions.iteritems():
deps = dependencies(funcname,[])
deps.reverse()
for dep in deps:
@@ -168,7 +224,7 @@
codewriter.append(" %%result = invoke fastcc %s%%%s to label %%no_exception except label %%exception" % (t[0], t[1]))
codewriter.newline()
codewriter.append("no_exception:")
- codewriter.append(" store %structtype.object_vtable* null, %structtype.object_vtable** %last_exception_type")
+ codewriter.append(" store %RPYTHON_EXCEPTION_VTABLE* null, %RPYTHON_EXCEPTION_VTABLE** %last_exception_type")
codewriter.append(" ret %s%%result" % t[0])
codewriter.newline()
codewriter.append("exception:")
@@ -176,8 +232,8 @@
codewriter.append("}")
codewriter.newline()
codewriter.append("ccc int %__entrypoint__raised_LLVMException() {")
- codewriter.append(" %tmp = load %structtype.object_vtable** %last_exception_type")
- codewriter.append(" %result = cast %structtype.object_vtable* %tmp to int")
+ codewriter.append(" %tmp = load %RPYTHON_EXCEPTION_VTABLE** %last_exception_type")
+ codewriter.append(" %result = cast %RPYTHON_EXCEPTION_VTABLE* %tmp to int")
codewriter.append(" ret int %result")
codewriter.append("}")
codewriter.newline()
More information about the Pypy-commit
mailing list