[pypy-svn] r17790 - in pypy/dist/pypy/translator: backendopt llvm llvm/module
ericvrp at codespeak.net
ericvrp at codespeak.net
Fri Sep 23 14:27:15 CEST 2005
Author: ericvrp
Date: Fri Sep 23 14:27:14 2005
New Revision: 17790
Modified:
pypy/dist/pypy/translator/backendopt/exception.py
pypy/dist/pypy/translator/llvm/build_llvm_module.py
pypy/dist/pypy/translator/llvm/database.py
pypy/dist/pypy/translator/llvm/exception.py
pypy/dist/pypy/translator/llvm/funcnode.py
pypy/dist/pypy/translator/llvm/gc.py
pypy/dist/pypy/translator/llvm/genllvm.py
pypy/dist/pypy/translator/llvm/module/support.py
Log:
* refactored exceptionpolicy.transform() to funcnode as speed opt.
* use llvm-ld for creating standalone exe. No longer relying on gcc.
* strip (and optionally upx) the standalone
* some stats in exception direct_call transform
Modified: pypy/dist/pypy/translator/backendopt/exception.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/exception.py (original)
+++ pypy/dist/pypy/translator/backendopt/exception.py Fri Sep 23 14:27:14 2005
@@ -5,6 +5,8 @@
from pypy.rpython.lltype import Bool, Ptr
+n_calls = n_calls_patched = 0
+
def create_exception_handling(translator, graph):
"""After an exception in a direct_call, that is not catched by an explicit
except statement, we need to reraise the exception. So after this
@@ -12,6 +14,8 @@
from the current graph with an unused value (false/0/0.0/null).
Because of the added exitswitch we need an additional block.
"""
+ global n_calls, n_calls_patched
+ n_calls_begin = n_calls
e = translator.rtyper.getexceptiondata()
blocks = [x for x in flatten(graph) if isinstance(x, Block)]
for block in blocks:
@@ -22,9 +26,11 @@
op = block.operations[i]
if op.opname != 'direct_call':
continue
+ n_calls += 1
called_can_raise = True #XXX maybe we even want a list of possible exceptions
if not called_can_raise:
continue
+ n_calls_patched += 1
afterblock = split_block(translator, graph, block, i+1)
@@ -52,3 +58,5 @@
l.prevblock = block
l.exitcase = l.llexitcase = False
block.exits.insert(0, l) #False case needs to go first
+ if n_calls != n_calls_begin:
+ print 'create_exception_handling: patched %d out of %d calls' % (n_calls_patched, n_calls)
Modified: pypy/dist/pypy/translator/llvm/build_llvm_module.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/build_llvm_module.py (original)
+++ pypy/dist/pypy/translator/llvm/build_llvm_module.py Fri Sep 23 14:27:14 2005
@@ -81,23 +81,34 @@
#ball = str(dirpath.join('%s_all.bc' % b))
#cmds.append("opt %s %s -f -o %s.bc" % (OPTIMIZATION_SWITCHES, ball, b))
- cmds = ["llvm-as < %s.ll | opt %s -f -o %s.bc" % (b, OPTIMIZATION_SWITCHES, b)]
+ use_gcc = False
+ profile = False
- generate_s_file = False
- if generate_s_file and sys.maxint == 2147483647: #32 bit platform
- cmds.append("llc %s %s.bc -f -o %s.s" % (genllvm.exceptionpolicy.llc_options(), b, b))
- cmds.append("as %s.s -o %s.o" % (b, b))
+ cmds = ["llvm-as < %s.ll | opt %s -f -o %s.bc" % (b, OPTIMIZATION_SWITCHES, b)]
+ if not use_gcc:
if exe_name:
- cmds.append("gcc %s.o %s -lm -ldl -pipe -o %s" % (b, gc_libs, exe_name))
- object_files.append("%s.o" % b)
- else: #assume 64 bit platform (x86-64?)
- #this special case for x86-64 (called ia64 in llvm) can go as soon as llc supports ia64 assembly output!
+ cmds.append('llvm-ld %s.bc -native -O5 -l=gc -lm -l=dl -o %s' % (b, exe_name))
+ else:
+ cmds.append("llc %s %s.bc -f -o %s.s" % (genllvm.exceptionpolicy.llc_options(), b, b))
+ cmds.append("as %s.s -o %s.o" % (b, b))
+ object_files.append("%s.o" % b)
+ else:
cmds.append("llc %s %s.bc -march=c -f -o %s.c" % (genllvm.exceptionpolicy.llc_options(), b, b))
if exe_name:
- #XXX TODO: use CFLAGS when available
- cmds.append("gcc %s.c -c -O2 -fomit-frame-pointer -march=pentium4 -ffast-math -pipe" % (b,))
- cmds.append("gcc %s.o %s -lm -ldl -pipe -o %s" % (b, gc_libs, exe_name))
+ cmd = "gcc %s.c -c -O3 -pipe" % b
+ if profile:
+ cmd += ' -pg'
+ cmds.append(cmd)
+ cmd = "gcc %s.o %s -lm -ldl -pipe -o %s" % (b, gc_libs, exe_name)
+ if profile:
+ cmd += ' -pg'
+ cmds.append(cmd)
source_files.append("%s.c" % b)
+ if exe_name and not profile:
+ cmds.append('strip ' + exe_name)
+ upx = os.popen('which upx').read()
+ if upx: #compress file even further
+ cmds.append('upx ' + exe_name)
try:
if pyxfile:
Modified: pypy/dist/pypy/translator/llvm/database.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/database.py (original)
+++ pypy/dist/pypy/translator/llvm/database.py Fri Sep 23 14:27:14 2005
@@ -16,7 +16,8 @@
log = log.database
class Database(object):
- def __init__(self, translator):
+ def __init__(self, genllvm, translator):
+ self.genllvm = genllvm
self.translator = translator
self.obj2node = {}
self._pendingsetup = []
Modified: pypy/dist/pypy/translator/llvm/exception.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/exception.py (original)
+++ pypy/dist/pypy/translator/llvm/exception.py Fri Sep 23 14:27:14 2005
@@ -5,7 +5,7 @@
def __init__(self):
raise Exception, 'ExceptionPolicy should not be used directly'
- def transform(self, translator):
+ def transform(self, translator, graph=None):
return
def _noresult(self, returntype):
@@ -28,8 +28,7 @@
return noresult
def new(exceptionpolicy=None): #factory
- if exceptionpolicy is None:
- exceptionpolicy = 'fast'
+ exceptionpolicy = exceptionpolicy or 'fast'
if exceptionpolicy == 'cpython':
from pypy.translator.llvm.exception import CPythonExceptionPolicy
exceptionpolicy = CPythonExceptionPolicy()
@@ -166,11 +165,14 @@
}
''' % locals()
- def transform(self, translator):
+ def transform(self, translator, graph=None):
from pypy.translator.backendopt.exception import create_exception_handling
- for graph in translator.flowgraphs.itervalues():
+ if graph:
create_exception_handling(translator, graph)
- #translator.view()
+ else:
+ for graph in translator.flowgraphs.itervalues():
+ create_exception_handling(translator, graph)
+ #translator.view()
def invoke(self, codewriter, targetvar, tail_, cconv, returntype, functionref, args, label, except_label):
if returntype == 'void':
Modified: pypy/dist/pypy/translator/llvm/funcnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/funcnode.py (original)
+++ pypy/dist/pypy/translator/llvm/funcnode.py Fri Sep 23 14:27:14 2005
@@ -37,6 +37,7 @@
self.value = value
self.ref = self.make_ref('%pypy_', value.graph.name)
self.graph = value.graph
+ self.db.genllvm.exceptionpolicy.transform(self.db.translator, self.graph)
remove_double_links(self.db.translator, self.graph)
def __str__(self):
@@ -206,4 +207,4 @@
codewriter.ret(inputargtype, inputarg)
def write_exceptblock(self, codewriter, block):
- codewriter.genllvm.exceptionpolicy.write_exceptblock(self, codewriter, block)
+ self.db.genllvm.exceptionpolicy.write_exceptblock(self, codewriter, block)
Modified: pypy/dist/pypy/translator/llvm/gc.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/gc.py (original)
+++ pypy/dist/pypy/translator/llvm/gc.py Fri Sep 23 14:27:14 2005
@@ -18,6 +18,7 @@
return ''
def new(gcpolicy=None): #factory
+ gcpolicy = gcpolicy or 'boehm'
if gcpolicy is None or gcpolicy == 'boehm':
from os.path import exists
boehm_on_path = exists('/usr/lib/libgc.so') or exists('/usr/lib/libgc.a')
Modified: pypy/dist/pypy/translator/llvm/genllvm.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/genllvm.py (original)
+++ pypy/dist/pypy/translator/llvm/genllvm.py Fri Sep 23 14:27:14 2005
@@ -35,13 +35,13 @@
# reset counters
LLVMNode.nodename_count = {}
- self.db = Database(translator)
+ self.db = Database(self, translator)
self.translator = translator
self.gcpolicy = gcpolicy
self.exceptionpolicy = exceptionpolicy
extfuncnode.ExternalFuncNode.used_external_functions = {}
self.debug = debug # for debug we create comments of every operation that may be executed
- exceptionpolicy.transform(translator)
+ #exceptionpolicy.transform(translator) #now done in FuncNode (optimization)
if debug:
translator.checkgraphs()
Modified: pypy/dist/pypy/translator/llvm/module/support.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/module/support.py (original)
+++ pypy/dist/pypy/translator/llvm/module/support.py Fri Sep 23 14:27:14 2005
@@ -110,7 +110,6 @@
is_0:
call fastcc void %%prepare_ZeroDivisionError()
ret %s 0 ; XXX unwind ; (2)
- ;br label %%is_not_0 ; XXX unwind ; (2)
is_not_0:
"""
More information about the Pypy-commit
mailing list