[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