[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