[pypy-svn] r35996 - in pypy/dist/pypy: doc translator/llvm

pedronis at codespeak.net pedronis at codespeak.net
Wed Dec 27 14:58:22 CET 2006


Author: pedronis
Date: Wed Dec 27 14:58:19 2006
New Revision: 35996

Modified:
   pypy/dist/pypy/doc/jit.txt
   pypy/dist/pypy/translator/llvm/externs2ll.py
   pypy/dist/pypy/translator/llvm/gc.py
Log:
calls



Modified: pypy/dist/pypy/doc/jit.txt
==============================================================================
--- pypy/dist/pypy/doc/jit.txt	(original)
+++ pypy/dist/pypy/doc/jit.txt	Wed Dec 27 14:58:19 2006
@@ -615,7 +615,55 @@
 Calls and inlining
 ---------------------
 
-...green call... red call and inlining effect... gray call, yellow call...
+For calls timeshifting can either produce code to generate a residual
+call operation or recursively invoke the timeshifted version of the
+callee.  The residual operations generated by the timeshifted callee
+will grow the compile-time produced residual function, this
+effectively amounts to compile-time inlining the original callee into
+its caller.
+
+Again timeshifting determines how to transform call operations based on
+the color of arguments and result:
+
+* If all arguments and the result are green and we can detect the called
+  function not to have side-effects, the call is a so-called *green call*,
+  and will be left untouched which means there will be a call executed
+  at compile-time. 
+
+* Calls to function that have no return value (i.e. their return type
+  is the low-level type Void), are assumed to have side-effects, they
+  are *gray calls*.
+
+* Calls with a green result but with side-effects are so-called *yellow calls*.
+
+* Calls with a red result are *red calls*
+
+The treatment of *red*, *gray* and *yellow* calls is similar,
+timeshifting will transform them into calls to the timeshifted version
+of the callee, resulting into an inlining-effect at compile time.
+
+At compile-time the JIT state contains a chain of virtual frames
+(similar to `virtual structures`_), its top frame is updated with all
+the red boxes for the call-point red variables before such calls and
+the callee will attach a fresh new frame. This chain guarantees that
+values (represented by the boxes) are propagated correctly,
+accordingly split points duplicate and merge points treat the full
+chain properly.
+
+Each timeshifted function has its own dispatch logic for splits, it
+returns to the caller when all the split scheduled states have been
+dealt with. A list of all the states that reached the return of the
+function (there can be more than one) is returned to the caller which
+then schedules these states on its dispatch queue. This is crucial for
+yellow calls to keep the various green return values disjunct.
+
+What we have described applies to direct calls where the callee is a
+constant function. For indirect calls, where the callee is a variable
+it is checked whether the callee is constant at compile-time in which
+case a mapping between the pointers to the original functions and
+their timeshifted versions is used to call the appropriate timeshifted
+callee as for a direct call. If the exact callee is unknown a residual
+call operation is generated.
 
 
 Virtual structures

Modified: pypy/dist/pypy/translator/llvm/externs2ll.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/externs2ll.py	(original)
+++ pypy/dist/pypy/translator/llvm/externs2ll.py	Wed Dec 27 14:58:19 2006
@@ -36,7 +36,7 @@
 
     plain = filename[:-2]
     includes = get_incdirs()
-    cmd = "llvm-gcc %s -S %s.c -o %s.ll 2>&1" % (includes,
+    cmd = "llvm-gcc %s -emit-llvm -S %s.c -o %s.ll 2>&1" % (includes,
                                                  plain,
                                                  plain)
     os.system(cmd)
@@ -64,7 +64,7 @@
         line = line.rstrip()
 
         # find function names, declare them with the default calling convertion
-        if line[-1:] == '{':
+        if line[-3:] == ') {':
            returntype, s = line.split(' ', 1)
            funcname  , s = s.split('(', 1)
            funcnames[funcname] = True

Modified: pypy/dist/pypy/translator/llvm/gc.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/gc.py	(original)
+++ pypy/dist/pypy/translator/llvm/gc.py	Wed Dec 27 14:58:19 2006
@@ -6,6 +6,7 @@
 log = log.gc
 
 def have_boehm():
+    return True
     import distutils.sysconfig
     from os.path import exists
     libdir = distutils.sysconfig.EXEC_PREFIX + "/lib"  



More information about the Pypy-commit mailing list