[pypy-svn] r49003 - pypy/dist/pypy/translator/llvm
rxe at codespeak.net
rxe at codespeak.net
Fri Nov 23 19:31:54 CET 2007
Author: rxe
Date: Fri Nov 23 19:31:54 2007
New Revision: 49003
Modified:
pypy/dist/pypy/translator/llvm/externs2ll.py
pypy/dist/pypy/translator/llvm/genllvm.py
Log:
cleanup predeclare externs
Modified: pypy/dist/pypy/translator/llvm/externs2ll.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/externs2ll.py (original)
+++ pypy/dist/pypy/translator/llvm/externs2ll.py Fri Nov 23 19:31:54 2007
@@ -7,24 +7,12 @@
from pypy.rpython.rmodel import inputconst
from pypy.rpython.lltypesystem import lltype
from pypy.translator.llvm.buildllvm import llvm_gcc_version
-
from pypy.tool.udir import udir
-def predeclare_stuff(c_db):
- exctransformer = c_db.exctransformer
- yield ('_rpyexc_occured_ptr', exctransformer._rpyexc_occured_ptr.value)
- yield ('rpyexc_fetch_type_ptr', exctransformer.rpyexc_fetch_type_ptr.value)
- yield ('rpyexc_clear_ptr', exctransformer.rpyexc_clear_ptr.value)
-
support_functions = [
"@LLVM_RPython_StartupCode",
]
-skip_lines = [
- "%RPyString = type opaque",
- "__main",
- ]
-
def get_module_file(name):
return os.path.join(get_llvm_cpath(), name)
@@ -63,12 +51,6 @@
# get rid of any of the structs that llvm-gcc introduces to struct types
line = line.replace("%struct.", "%")
- # XXX slowwwwwww
- for x in skip_lines:
- if line.find(x) >= 0:
- line = ''
- break
-
# strip comments
comment = line.find(';')
if comment >= 0:
@@ -117,43 +99,6 @@
ll_lines2.append("declare ccc void @abort()")
return'\n'.join(ll_lines2)
-def find_list_of_str(rtyper):
- from pypy.rpython.lltypesystem import rlist
- for r in rtyper.reprs.itervalues():
- if isinstance(r, rlist.ListRepr) and r.item_repr is rstr.string_repr:
- return r.lowleveltype.TO
- return None
-
-def setup_externs(c_db, db):
- # hacks to make predeclare_all work
-
- rtyper = db.translator.rtyper
- decls = list(predeclare_stuff(c_db))
-
- for c_name, obj in decls:
- if isinstance(obj, lltype.LowLevelType):
- db.prepare_type(obj)
- elif isinstance(obj, FunctionGraph):
- funcptr = rtyper.getcallable(obj)
- c = inputconst(lltype.typeOf(funcptr), funcptr)
- db.prepare_arg_value(c)
- elif isinstance(lltype.typeOf(obj), lltype.Ptr):
- db.prepare_constant(lltype.typeOf(obj), obj)
- elif type(c_name) is str and type(obj) is int:
- pass #define c_name obj
- else:
- assert False, "unhandled predeclare %s %s %s" % (c_name, type(obj), obj)
-
- def annotatehelper(func, *argtypes):
- graph = db.translator.rtyper.annotate_helper(func, argtypes)
- fptr = rtyper.getcallable(graph)
- c = inputconst(lltype.typeOf(fptr), fptr)
- db.prepare_arg_value(c)
- decls.append(("ll_" + func.func_name, graph))
- return graph.name
-
- return decls
-
def get_c_cpath():
from pypy.translator.c import genc
return os.path.dirname(genc.__file__)
@@ -175,7 +120,7 @@
includestr += "-I %s " % ii
return includestr
-def generate_llfile(db, extern_decls, entrynode, c_includes, c_sources, standalone, default_cconv):
+def generate_llfile(db, entrynode, c_includes, c_sources, standalone, default_cconv):
ccode = []
function_names = []
@@ -190,32 +135,10 @@
predeclarefn("__ENTRY_POINT__", entrynode.get_ref())
ccode.append('#define ENTRY_POINT_DEFINED 1\n\n')
- for c_name, obj in extern_decls:
- if isinstance(obj, lltype.LowLevelType):
- s = "#define %s struct %s\n%s;\n" % (c_name, c_name, c_name)
- ccode.append(s)
-
- elif isinstance(obj, FunctionGraph):
- funcptr = db.translator.rtyper.getcallable(obj)
- c = inputconst(lltype.typeOf(funcptr), funcptr)
- predeclarefn(c_name, db.repr_arg(c))
-
- elif isinstance(lltype.typeOf(obj), lltype.Ptr):
- pass
-
- elif type(c_name) is str and type(obj) is int:
- ccode.append("#define\t%s\t%d\n" % (c_name, obj))
-
- else:
- assert False, "unhandled extern_decls %s %s %s" % (c_name, type(obj), obj)
-
-
- # include this early to get constants and macros for any further includes
- ccode.append('#include <Python.h>\n')
-
# ask gcpolicy for any code needed
ccode.append('%s\n' % db.gcpolicy.genextern_code())
+ # ask rffi for includes/source
for c_include in c_includes:
ccode.append('#include <%s>\n' % c_include)
Modified: pypy/dist/pypy/translator/llvm/genllvm.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/genllvm.py (original)
+++ pypy/dist/pypy/translator/llvm/genllvm.py Fri Nov 23 19:31:54 2007
@@ -12,7 +12,7 @@
from pypy.translator.llvm import extfuncnode
from pypy.translator.llvm.module.support import extfunctions
from pypy.translator.llvm.node import Node
-from pypy.translator.llvm.externs2ll import setup_externs, generate_llfile
+from pypy.translator.llvm.externs2ll import generate_llfile
from pypy.translator.llvm.gc import GcPolicy
from pypy.translator.llvm.log import log
from pypy.rlib.nonconst import NonConstant
@@ -133,7 +133,8 @@
self._checkpoint('setup_all all nodes')
# set up externs nodes
- self.extern_decls = setup_externs(c_db, self.db)
+ self.setup_externs(c_db, self.db)
+
self.translator.rtyper.specialize_more_blocks()
self.db.setup_all()
self._checkpoint('setup_all externs')
@@ -149,10 +150,17 @@
# create ll file from c code
self.generate_ll_externs(codewriter)
- self._checkpoint('setup_externs')
return codewriter
+ def setup_externs(self, c_db, db):
+ # XXX
+ exctransformer = c_db.exctransformer
+ for obj in [exctransformer._rpyexc_occured_ptr.value,
+ exctransformer.rpyexc_fetch_type_ptr.value,
+ exctransformer.rpyexc_clear_ptr.value]:
+ db.prepare_constant(lltype.typeOf(obj), obj)
+
def get_entry_point(self, func):
assert func is not None
self.entrypoint = func
@@ -188,7 +196,6 @@
c_sources[source] = True
self.llcode = generate_llfile(self.db,
- self.extern_decls,
self.entrynode,
c_includes,
c_sources,
More information about the Pypy-commit
mailing list