[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