[pypy-svn] r48121 - pypy/dist/pypy/translator/llvm

rxe at codespeak.net rxe at codespeak.net
Sun Oct 28 00:28:16 CEST 2007


Author: rxe
Date: Sun Oct 28 00:28:16 2007
New Revision: 48121

Modified:
   pypy/dist/pypy/translator/llvm/buildllvm.py
Log:
yet another refactor to build process for genllvm.  it is likely we yet need still another

Modified: pypy/dist/pypy/translator/llvm/buildllvm.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/buildllvm.py	(original)
+++ pypy/dist/pypy/translator/llvm/buildllvm.py	Sun Oct 28 00:28:16 2007
@@ -6,9 +6,9 @@
 from pypy.translator.llvm.log import log
 from pypy.translator.tool import stdoutcapture
 
-import distutils.sysconfig
+def write_ctypes_module(genllvm, dllname):
+    """ use ctypes to create a temporary module """
 
-def write_ctypes_module(genllvm, dllname, targetpath):
     template = """
 import ctypes
 from os.path import join, dirname, realpath
@@ -50,19 +50,24 @@
     import ctypes
     from pypy.rpython.lltypesystem import lltype 
 
+    basename = genllvm.filename.purebasename + '_wrapper.py'
+    modfilename = genllvm.filename.new(basename = basename)
+
     TO_CTYPES = {lltype.Bool: "ctypes.c_int",
                  lltype.Float: "ctypes.c_double",
                  lltype.Char: "ctypes.c_char",
                  lltype.Signed: "ctypes.c_int",
                  lltype.Unsigned: "ctypes.c_uint"
                  }
+
     name = genllvm.entrynode.ref.strip("%")
     
     g = genllvm.entrynode.graph  
     returntype = TO_CTYPES[g.returnblock.inputargs[0].concretetype]
     inputargtypes = [TO_CTYPES[a.concretetype] for a in g.startblock.inputargs]
     args = '[%s]' % ", ".join(inputargtypes)
-    targetpath.write(template % locals())
+    modfilename.write(template % locals())
+    return modfilename.purebasename
 
 def llvm_is_on_path():
     if py.path.local.sysfind("llvm-as") is None or \
@@ -70,7 +75,7 @@
         return False 
     return True
 
-def _exe_version(exe, cache={}):
+def exe_version(exe, cache={}):
     try:
         v =  cache[exe]
     except KeyError:
@@ -80,15 +85,7 @@
         cache[exe] = v
     return v
 
-llvm_version = lambda: _exe_version('llvm-as')
-
-def postfix():
-    if llvm_version() >= 2.0:
-        return '.i32'
-    else:
-        return ''
-
-def _exe_version2(exe):
+def exe_version2(exe):
     v = os.popen(exe + ' --version 2>&1').read()
     i = v.index(')')
     v = v[i+2:].split()[0].split('.')
@@ -96,28 +93,23 @@
     v = float(major) + float(minor) / 10.0
     return v
 
-gcc_version = lambda: _exe_version2('gcc')
-llvm_gcc_version = lambda: _exe_version2('llvm-gcc')
-
-# def compile_module(module, source_files, object_files, library_files):
+llvm_version = lambda: exe_version('llvm-as')
+gcc_version = lambda: exe_version2('gcc')
+llvm_gcc_version = lambda: exe_version2('llvm-gcc')
+
+def have_boehm():
+    import distutils.sysconfig
+    from os.path import exists
+    libdir = distutils.sysconfig.EXEC_PREFIX + "/lib"  
+    return exists(libdir + '/libgc.so') or exists(libdir + '/libgc.a')
 
-#     open("%s_setup.py" % module, "w").write(str(py.code.Source(
-#         '''
-#         from distutils.core import setup
-#         from distutils.extension import Extension
-#         setup(name="%(module)s",
-#             ext_modules = [Extension(
-#                 name = "%(module)s",
-#                 sources = %(source_files)s,
-#                 libraries = %(library_files)s,
-#                 extra_objects = %(object_files)s)])
-#         ''' % locals())))
-#     cmd ="python %s_setup.py build_ext --inplace --force" % module
-#     log.build(cmd)
-#     py.process.cmdexec(cmd)
+def postfix():
+    if llvm_version() >= 2.0:
+        return '.i32'
+    else:
+        return ''
 
 class Builder(object):
-
     def __init__(self, genllvm):
         self.genllvm = genllvm
         self.cmds = []
@@ -127,28 +119,18 @@
             cmd = "gccas /dev/null -o /dev/null -debug-pass=Arguments 2>&1"
             gccas_output = os.popen(cmd)
             opts = gccas_output.read()[17:-1] + " "
-        else:
-            opts = '-std-compile-opts'
             
-        # these were added by Chris Lattner for some old version of llvm
-        #    opts += "-globalopt -constmerge -ipsccp -deadargelim -inline " \
-        #            "-instcombine -scalarrepl -globalsmodref-aa -licm -load-vn " \
-        #            "-gcse -instcombine -simplifycfg -globaldce "
-
-        # added try to reduce the amount of excessive inlining by us, llvm and gcc
-        #    opts += "-inline-threshold=175 "   #default: 200
+            # these were added by Chris Lattner for some old version of llvm
+            #    opts += "-globalopt -constmerge -ipsccp -deadargelim -inline " \
+            #            "-instcombine -scalarrepl -globalsmodref-aa -licm -load-vn " \
+            #            "-gcse -instcombine -simplifycfg -globaldce "
 
-        return opts
-
-    def compile_bytecode(self, b):
-        # run llvm assembler and optimizer
-        opts = self.optimizations()
+            # added try to reduce the amount of excessive inlining by us, llvm and gcc
+            #    opts += "-inline-threshold=175 "   #default: 200
 
-        if llvm_version() < 2.0:
-            self.cmds.append("llvm-as < %s.ll | opt %s -f -o %s.bc" % (b, opts, b))
         else:
-            # we generate 1.x .ll files, so upgrade these first
-            self.cmds.append("llvm-upgrade < %s.ll | llvm-as | opt %s -f -o %s.bc" % (b, opts, b))
+            opts = '-std-compile-opts'
+        return opts
 
     def execute_cmds(self):
         c = stdoutcapture.Capture(mixed_out_err=True)
@@ -158,7 +140,6 @@
                 for cmd in self.cmds:
                     log.build(cmd)
                     py.process.cmdexec(cmd)
-
             finally:
                 foutput, ferror = c.done()
         except:
@@ -169,68 +150,82 @@
             log.build(data)
             raise
 
-    def make_module(self):
+    def cmds_bytecode(self, base):
+        # run llvm assembler and optimizer
+        opts = self.optimizations()
+
+        if llvm_version() < 2.0:
+            self.cmds.append("llvm-as < %s.ll | opt %s -f -o %s.bc" % (base, opts, base))
+        else:
+            # we generate 1.x .ll files, so upgrade these first
+            self.cmds.append("llvm-upgrade < %s.ll | llvm-as | opt %s -f -o %s.bc" % (base, opts, base))
+
+    def cmds_objects(self, base):
+        # XXX why this hack???
+        use_gcc = True #self.genllvm.config.translation.llvm_via_c
+        if use_gcc:
+            self.cmds.append("llc %s.bc -march=c -f -o %s.c" % (base, base))
+            self.cmds.append("gcc %s.c -c -O3 -fomit-frame-pointer" % base)
+        else:
+            self.cmds.append("llc -relocation-model=pic %s.bc -f -o %s.s" % (base, base))
+            self.cmds.append("as %s.s -o %s.o" % (base, base))
+
+#             if (self.genllvm.config.translation.profopt is not None and
+#                 not self.genllvm.config.translation.noprofopt):
+#                 cmd = "gcc -fprofile-generate %s.c -c -O3 -pipe -o %s.o" % (base, base)
+#                 self.cmds.append(cmd)
+#                 cmd = "gcc -fprofile-generate %s.o %s %s -lm -pipe -o %s_gen" % \
+#                       (base, gc_libs_path, gc_libs, exename)
+#                 self.cmds.append(cmd)
+#                 self.cmds.append("./%s_gen %s" % (exename, self.genllvm.config.translation.profopt))
+#                 cmd = "gcc -fprofile-use %s.c -c -O3 -pipe -o %s.o" % (b, b)
+#                 self.cmds.append(cmd)
+#                 cmd = "gcc -fprofile-use %s.o %s %s -lm -pipe -o %s" % \
+#                       (b, gc_libs_path, gc_libs, exename)
+#             else:
+
+    def setup(self):
+        # set up directories
         llvmfile = self.genllvm.filename
 
         # change into dirpath and store current path to change back
-        dirpath = llvmfile.dirpath()
-        lastdir = py.path.local()
-        dirpath.chdir()
-
-        b = llvmfile.purebasename
+        self.dirpath = llvmfile.dirpath()
+        self.lastdir = py.path.local()
+        self.dirpath.chdir()
 
-        # generate the llvm bytecode from ll file
-        self.compile_bytecode(b)
+        return llvmfile.purebasename
+        
+    def make_module(self):
+        base = self.setup()
+        self.cmds_bytecode(base)
+        self.cmds_objects(base)
 
+        # link (ok this is a mess!)
         library_files = self.genllvm.db.gcpolicy.gc_libraries()
         gc_libs = ' '.join(['-l' + lib for lib in library_files])
 
         if sys.platform == 'darwin':
             libdir = '/sw/lib'
             gc_libs_path = '-L%s -ldl' % libdir
+            self.cmds.append("gcc -O3 %s.o %s %s -lm -bundle -o %s.so" % (base, gc_libs_path, gc_libs, base))
         else:
-            gc_libs_path = '-static'
-
-        dllname = "%s.so" % b
-        
-        use_gcc = False #self.genllvm.config.translation.llvm_via_c
-        if not use_gcc:
-            self.cmds.append("llc -relocation-model=pic %s.bc -f -o %s.s" % (b, b))
-            self.cmds.append("as %s.s -o %s.o" % (b, b))
-
-        else:
-            self.cmds.append("llc %s.bc -march=c -f -o %s.c" % (b, b))
-            self.cmds.append("gcc %s.c -c -O2" % b)
 
-        self.cmds.append("gcc -O3 %s.o %s %s -lm -bundle -o %s" % (b, gc_libs_path, gc_libs, dllname))
+            gc_libs_path = '-static'
+            XXX
 
         try:
             self.execute_cmds()
-
-            # use ctypes to create module for CPython
-            basename = self.genllvm.filename.purebasename + '_wrapper.py'
-            modfilename = self.genllvm.filename.new(basename = basename)
-            write_ctypes_module(self.genllvm, dllname, modfilename)
-
-            modname = modfilename.purebasename
+            modname = write_ctypes_module(self.genllvm, "%s.so" % base)
 
         finally:
-            lastdir.chdir()
+            self.lastdir.chdir()
 
-        return modname, str(dirpath)
+        return modname, str(self.dirpath)
 
     def make_standalone(self, exename):
-        llvmfile = self.genllvm.filename
-
-        # change into dirpath and store current path to change back
-        dirpath = llvmfile.dirpath()
-        lastdir = py.path.local()
-        dirpath.chdir()
-
-        b = llvmfile.purebasename
-
-        # generate the llvm bytecode from ll file
-        self.compile_bytecode(b)
+        base = self.setup()
+        self.cmds_bytecode(base)
+        self.cmds_objects(base)
 
         object_files = ["-L/sw/lib"]
         library_files = self.genllvm.db.gcpolicy.gc_libraries()
@@ -242,41 +237,11 @@
         else:
             gc_libs_path = '-static'
 
-        source_files = []
-
-        use_gcc = self.genllvm.config.translation.llvm_via_c
-
-        if not use_gcc:
-            self.cmds.append("llc %s.bc -f -o %s.s" % (b, b))
-            self.cmds.append("as %s.s -o %s.o" % (b, b))
-
-            cmd = "gcc -O3 %s.o %s %s -lm -pipe -o %s" % (b, gc_libs_path, gc_libs, exename)
-            self.cmds.append(cmd)
-            object_files.append("%s.o" % b)
-        else:
-            self.cmds.append("llc %s.bc -march=c -f -o %s.c" % (b, b))
-            if (self.genllvm.config.translation.profopt is not None and
-                not self.genllvm.config.translation.noprofopt):
-                cmd = "gcc -fprofile-generate %s.c -c -O3 -pipe -o %s.o" % (b, b)
-                self.cmds.append(cmd)
-                cmd = "gcc -fprofile-generate %s.o %s %s -lm -pipe -o %s_gen" % \
-                      (b, gc_libs_path, gc_libs, exename)
-                self.cmds.append(cmd)
-                self.cmds.append("./%s_gen %s" % (exename, self.genllvm.config.translation.profopt))
-                cmd = "gcc -fprofile-use %s.c -c -O3 -pipe -o %s.o" % (b, b)
-                self.cmds.append(cmd)
-                cmd = "gcc -fprofile-use %s.o %s %s -lm -pipe -o %s" % \
-                      (b, gc_libs_path, gc_libs, exename)
-            else:
-                cmd = "gcc %s.c -c -O3 -pipe -fomit-frame-pointer" % b
-                self.cmds.append(cmd)
-                cmd = "gcc %s.o %s %s -lm -pipe -o %s" % (b, gc_libs_path, gc_libs, exename)
-            self.cmds.append(cmd)
-            source_files.append("%s.c" % b)
+        self.cmds.append("gcc -O3 %s.o %s %s -lm -pipe -o %s" % (base, gc_libs_path, gc_libs, exename))
 
         try:
             self.execute_cmds()
         finally:
-            lastdir.chdir()
+            self.lastdir.chdir()
 
-        return str(dirpath.join(exename))
+        return str(self.dirpath.join(exename))



More information about the Pypy-commit mailing list