[pypy-svn] r15871 - in pypy/dist/pypy/translator/llvm2: . demo
ericvrp at codespeak.net
ericvrp at codespeak.net
Tue Aug 9 23:52:41 CEST 2005
Author: ericvrp
Date: Tue Aug 9 23:52:40 2005
New Revision: 15871
Modified:
pypy/dist/pypy/translator/llvm2/build_llvm_module.py
pypy/dist/pypy/translator/llvm2/demo/run.py
pypy/dist/pypy/translator/llvm2/genllvm.py
Log:
fixed ability to generate standalone executables
Modified: pypy/dist/pypy/translator/llvm2/build_llvm_module.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/build_llvm_module.py (original)
+++ pypy/dist/pypy/translator/llvm2/build_llvm_module.py Tue Aug 9 23:52:40 2005
@@ -155,14 +155,17 @@
log.build(cmd)
cmdexec(cmd)
-def make_module_from_llvm(llvmfile, pyxfile, optimize=True, exe_name=None):
+def make_module_from_llvm(llvmfile, pyxfile=None, optimize=True, exe_name=None):
include_dir = py.magic.autopath().dirpath()
dirpath = llvmfile.dirpath()
lastdir = path.local()
os.chdir(str(dirpath))
- modname = pyxfile.purebasename
b = llvmfile.purebasename
- source_files = [ "%s.c" % modname ]
+ if pyxfile:
+ modname = pyxfile.purebasename
+ source_files = [ "%s.c" % modname ]
+ else:
+ source_files = []
object_files = []
library_files = []
if use_boehm_gc:
@@ -195,7 +198,8 @@
source_files.append("%s.c" % b)
try:
- log.build("modname", modname)
+ if pyxfile:
+ log.build("modname", modname)
c = stdoutcapture.Capture(mixed_out_err = True)
log.build("working in", path.local())
try:
@@ -203,25 +207,30 @@
for cmd in cmds:
log.build(cmd)
cmdexec(cmd)
- make_c_from_pyxfile(pyxfile)
- compile_module(modname, source_files, object_files, library_files)
+ if pyxfile:
+ make_c_from_pyxfile(pyxfile)
+ compile_module(modname, source_files, object_files, library_files)
finally:
foutput, foutput = c.done()
except:
data = foutput.read()
- fdump = open("%s.errors" % modname, "w")
- fdump.write(data)
- fdump.close()
+ if pyxfile:
+ fdump = open("%s.errors" % modname, "w")
+ fdump.write(data)
+ fdump.close()
log.build(data)
raise
# XXX do we need to do some check on fout/ferr?
# XXX not a nice way to import a module
- log.build("inserting path to sys.path", dirpath)
- sys.path.insert(0, '.')
- cmd = "import %(modname)s as testmodule" % locals()
- log.build(cmd)
- exec cmd
- sys.path.pop(0)
+ if pyxfile:
+ log.build("inserting path to sys.path", dirpath)
+ sys.path.insert(0, '.')
+ cmd = "import %(modname)s as testmodule" % locals()
+ log.build(cmd)
+ exec cmd
+ sys.path.pop(0)
finally:
os.chdir(str(lastdir))
- return testmodule
+ if pyxfile:
+ return testmodule
+ return None
Modified: pypy/dist/pypy/translator/llvm2/demo/run.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/demo/run.py (original)
+++ pypy/dist/pypy/translator/llvm2/demo/run.py Tue Aug 9 23:52:40 2005
@@ -2,7 +2,7 @@
import os
import sys
-from pypy.translator.llvm2.genllvm import compile_function
+from pypy.translator.llvm2.genllvm import compile_module
from pypy.translator.translator import Translator
def p():
@@ -18,7 +18,7 @@
f()
def l(name):
- compile_function(entry_point, [], exe_name=name)
+ compile_module(entry_point, [], standalone=True, exe_name=name)
print 'Running standalone (llvm-based) executable:'
cmd = "/tmp/usession-current/%s" % name
print cmd
Modified: pypy/dist/pypy/translator/llvm2/genllvm.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/genllvm.py (original)
+++ pypy/dist/pypy/translator/llvm2/genllvm.py Tue Aug 9 23:52:40 2005
@@ -39,7 +39,7 @@
self.debug = debug
def gen_llvm_source(self, func=None):
- print 'gen_llvm_source begin) ' + time.ctime()
+ if self.debug: print 'gen_llvm_source begin) ' + time.ctime()
if func is None:
func = self.translator.entrypoint
self.entrypoint = func
@@ -57,11 +57,11 @@
self.db.prepare_repr_arg(c)
assert c in self.db.obj2node
- print 'gen_llvm_source db.setup_all) ' + time.ctime()
+ if self.debug: print 'gen_llvm_source db.setup_all) ' + time.ctime()
#7 minutes
self.db.setup_all()
- print 'gen_llvm_source typ_decl.writedatatypedecl) ' + time.ctime()
- print 'gen_llvm_source n_nodes) %d' % len(self.db.getnodes())
+ 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())
@@ -85,34 +85,34 @@
for typ_decl in self.db.getnodes():
typ_decl.writedatatypedecl(codewriter)
- print 'gen_llvm_source typ_decl.writeglobalconstants) ' + time.ctime()
+ if self.debug: print 'gen_llvm_source typ_decl.writeglobalconstants) ' + time.ctime()
#20 minutes
nl(); comment("Global Data") ; nl()
for typ_decl in self.db.getnodes():
typ_decl.writeglobalconstants(codewriter)
- print 'gen_llvm_source typ_decl.writecomments) ' + time.ctime()
+ if self.debug: print 'gen_llvm_source typ_decl.writecomments) ' + time.ctime()
#0 minutes
if self.debug:
nl(); comment("Comments") ; nl()
for typ_decl in self.db.getnodes():
typ_decl.writecomments(codewriter)
- print 'gen_llvm_source extdeclarations) ' + time.ctime()
+ if self.debug: print 'gen_llvm_source extdeclarations) ' + time.ctime()
nl(); comment("Function Prototypes") ; nl()
if self.embedexterns:
for extdecl in extdeclarations.split('\n'):
codewriter.append(extdecl)
- print 'gen_llvm_source self._debug_prototype) ' + time.ctime()
+ if self.debug: print 'gen_llvm_source self._debug_prototype) ' + time.ctime()
if self.debug:
self._debug_prototype(codewriter)
- print 'gen_llvm_source typ_decl.writedecl) ' + time.ctime()
+ if self.debug: print 'gen_llvm_source typ_decl.writedecl) ' + time.ctime()
for typ_decl in self.db.getnodes():
typ_decl.writedecl(codewriter)
- print 'gen_llvm_source boehm_gc) ' + time.ctime()
+ if self.debug: print 'gen_llvm_source boehm_gc) ' + time.ctime()
nl(); comment("Function Implementation")
codewriter.startimpl()
if use_boehm_gc:
@@ -122,12 +122,12 @@
for gc_func in gc_funcs.split('\n'):
codewriter.append(gc_func)
- print 'gen_llvm_source typ_decl.writeimpl) ' + time.ctime()
+ if self.debug: print 'gen_llvm_source typ_decl.writeimpl) ' + time.ctime()
#XXX ? minutes
for typ_decl in self.db.getnodes():
typ_decl.writeimpl(codewriter)
- print 'gen_llvm_source used_external_functions) ' + time.ctime()
+ if self.debug: print 'gen_llvm_source used_external_functions) ' + time.ctime()
depdone = {}
for funcname,value in ExternalFuncNode.used_external_functions.iteritems():
deps = dependencies(funcname,[])
@@ -145,7 +145,7 @@
codewriter.append(extfunc)
depdone[dep] = True
- print 'gen_llvm_source entrypoint) ' + time.ctime()
+ if self.debug: print 'gen_llvm_source entrypoint) ' + time.ctime()
#XXX use codewriter methods here
decl = self.entrynode.getdecl()
t = decl.split('%', 1)
@@ -175,27 +175,29 @@
codewriter.newline()
comment("End of file") ; nl()
- print 'gen_llvm_source return) ' + time.ctime()
+ if self.debug: print 'gen_llvm_source return) ' + time.ctime()
return filename
- def create_module(self, filename, exe_name=None):
+ def create_module(self, filename, really_compile=True, standalone=False, optimize=True, exe_name=None):
if not llvm_is_on_path():
py.test.skip("llvm not found") # XXX not good to call py.test.skip here
- postfix = ''
- pyxsource = filename.new(basename=filename.purebasename+'_wrapper'+postfix+'.pyx')
- write_pyx_wrapper(self.entrynode, pyxsource)
-
- return build_llvm_module.make_module_from_llvm(filename, pyxsource, exe_name=exe_name)
+ if standalone:
+ return build_llvm_module.make_module_from_llvm(filename, optimize=optimize, exe_name=exe_name)
+ else:
+ postfix = ''
+ pyxfile = filename.new(basename=filename.purebasename+'_wrapper'+postfix+'.pyx')
+ write_pyx_wrapper(self.entrynode, pyxfile)
+ return build_llvm_module.make_module_from_llvm(filename, pyxfile=pyxfile, optimize=optimize)
def _debug_prototype(self, codewriter):
codewriter.append("declare int %printf(sbyte*, ...)")
-def genllvm(translator, embedexterns=True, exe_name=None):
+def genllvm(translator, really_compile=True, standalone=False, optimize=True, embedexterns=True, exe_name=None):
gen = GenLLVM(translator, embedexterns=embedexterns)
filename = gen.gen_llvm_source()
#log.genllvm(open(filename).read())
- return gen.create_module(filename, exe_name)
+ return gen.create_module(filename, really_compile=really_compile, standalone=standalone, optimize=optimize, exe_name=exe_name)
def llvm_is_on_path():
try:
@@ -204,19 +206,19 @@
return False
return True
-def compile_module(function, annotation, view=False, embedexterns=True, exe_name=None):
+def compile_module(function, annotation, view=False, really_compile=True, standalone=False, optimize=True, embedexterns=True, exe_name=None):
t = Translator(function)
a = t.annotate(annotation)
t.specialize()
if view:
t.view()
- return genllvm(t, embedexterns=embedexterns, exe_name=exe_name)
+ return genllvm(t, really_compile=really_compile, standalone=standalone, optimize=optimize, embedexterns=embedexterns, exe_name=exe_name)
-def compile_function(function, annotation, view=False, embedexterns=True, exe_name=None):
- mod = compile_module(function, annotation, view, embedexterns=embedexterns, exe_name=exe_name)
+def compile_function(function, annotation, view=False, really_compile=True, standalone=False, optimize=True, embedexterns=True, exe_name=None):
+ mod = compile_module(function, annotation, view=view, really_compile=really_compile, standalone=standalone, optimize=optimize, embedexterns=embedexterns, exe_name=exe_name)
return getattr(mod, function.func_name + "_wrapper")
-def compile_module_function(function, annotation, view=False, embedexterns=True, exe_name=None):
- mod = compile_module(function, annotation, view, embedexterns=embedexterns, exe_name=exe_name)
+def compile_module_function(function, annotation, view=False, really_compile=True, standalone=False, optimize=True, embedexterns=True, exe_name=None):
+ mod = compile_module(function, annotation, view=view, really_compile=really_compile, standalone=standalone, optimize=optimize, embedexterns=embedexterns, exe_name=exe_name)
f = getattr(mod, function.func_name + "_wrapper")
return mod, f
More information about the Pypy-commit
mailing list