[pypy-svn] r48384 - in pypy/dist/pypy/translator/llvm: . module

rxe at codespeak.net rxe at codespeak.net
Thu Nov 8 00:41:08 CET 2007


Author: rxe
Date: Thu Nov  8 00:41:07 2007
New Revision: 48384

Modified:
   pypy/dist/pypy/translator/llvm/buildllvm.py
   pypy/dist/pypy/translator/llvm/database.py
   pypy/dist/pypy/translator/llvm/externs2ll.py
   pypy/dist/pypy/translator/llvm/extfuncnode.py
   pypy/dist/pypy/translator/llvm/funcnode.py
   pypy/dist/pypy/translator/llvm/gc.py
   pypy/dist/pypy/translator/llvm/module/genexterns.c
   pypy/dist/pypy/translator/llvm/modwrapper.py
   pypy/dist/pypy/translator/llvm/opaquenode.py
   pypy/dist/pypy/translator/llvm/opwriter.py
Log:
progress towards llvm2.0 syntax.

Modified: pypy/dist/pypy/translator/llvm/buildllvm.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/buildllvm.py	(original)
+++ pypy/dist/pypy/translator/llvm/buildllvm.py	Thu Nov  8 00:41:07 2007
@@ -53,22 +53,7 @@
         self.cmds = []
 
     def optimizations(self):
-        if llvm_version() < 2.0:
-            cmd = "gccas /dev/null -o /dev/null -debug-pass=Arguments 2>&1"
-            gccas_output = os.popen(cmd)
-            opts = gccas_output.read()[17:-1] + " "
-            
-            # 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
-
-        else:
-            opts = '-std-compile-opts'
-        return opts
+        return '-std-compile-opts'
 
     def execute_cmds(self):
         c = stdoutcapture.Capture(mixed_out_err=True)

Modified: pypy/dist/pypy/translator/llvm/database.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/database.py	(original)
+++ pypy/dist/pypy/translator/llvm/database.py	Thu Nov  8 00:41:07 2007
@@ -403,11 +403,11 @@
             
             for k, v in [
                 (rcarith.CByte, self.types[lltype.Char]),
-                (rcarith.CUByte, 'ubyte'),
-                (rcarith.CShort, 'short'),
-                (rcarith.CUShort, 'ushort'),
-                (rcarith.CInt, 'int'),
-                (rcarith.CUInt, 'uint'),
+                (rcarith.CUByte, 'i8'),
+                (rcarith.CShort, 'i16'),
+                (rcarith.CUShort, 'i16'),
+                (rcarith.CInt, 'i32'),
+                (rcarith.CUInt, 'i32'),
                 (rcarith.CLong, self.types[lltype.Signed]),
                 (rcarith.CULong, self.types[lltype.Unsigned]),
                 (rcarith.CLonglong, self.types[lltype.SignedLongLong]),
@@ -436,8 +436,10 @@
   
     def repr_char(self, type_, value):
         x = ord(value)
+        print x
         if x >= 128:
-            r = "cast (ubyte %s to sbyte)" % x
+            # XXX check this really works
+            r = "trunc (i16 %s to i8)" % x
         else:
             r = str(x)
         return r
@@ -486,11 +488,12 @@
         return repr
 
     def repr_address(self, type_, value):
+        # XXX why-o-why isnt this an int ???
         if not value:
             return 'null'
         ptr = value.ptr
         node, ref = self.database.repr_constant(ptr)
-        res = "cast(%s to sbyte*)" % (ref,)
+        res = "bitcast(%s to i8*)" % (ref,)
         return res
 
     def repr_weakgcaddress(self, type_, value):

Modified: pypy/dist/pypy/translator/llvm/externs2ll.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/externs2ll.py	(original)
+++ pypy/dist/pypy/translator/llvm/externs2ll.py	Thu Nov  8 00:41:07 2007
@@ -209,9 +209,9 @@
             if c_name.startswith("RPyExc_"):
                 c_name = c_name[1:]
                 ccode.append("void raise%s(char *);\n" % c_name)
-            else:
-                # XXX we really shouldnt do this
-                predeclarefn(c_name, db.obj2node[obj._obj].ref)                
+            #else:
+            #    # XXX we really shouldnt do this
+            #    predeclarefn(c_name, db.obj2node[obj._obj].ref)                
         elif type(c_name) is str and type(obj) is int:
             ccode.append("#define\t%s\t%d\n" % (c_name, obj))
         else:

Modified: pypy/dist/pypy/translator/llvm/extfuncnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/extfuncnode.py	(original)
+++ pypy/dist/pypy/translator/llvm/extfuncnode.py	Thu Nov  8 00:41:07 2007
@@ -14,11 +14,12 @@
 
 # signature of external functions differ from C's implementation
 ext_func_sigs = {
-    "@LL_stack_too_big" : ExtFuncSig("int", None),
+    "@LL_stack_too_big_" : ExtFuncSig("i32", None),
     }
 
-if maxint != 2**31-1:
-    ext_func_sigs["@LL_math_ldexp"] = ExtFuncSig(None, [None, "int"])
+# XXX 64 bit is really broken since 2.x
+#if maxint != 2**31-1:
+#    ext_func_sigs["@LL_math_ldexp"] = ExtFuncSig(None, [None, "int"])
 
 
 class SimplerExternalFuncNode(FuncNode):
@@ -58,12 +59,12 @@
         codewriter.declare(self.getdecl())
 
 class ExternalFuncNode(FuncNode):
+    prefix = '@'
 
     def __init__(self, db, value, extname=None):
         self.db = db
         self.value = value
         name = value._callable.__name__
-        #assert name.startswith("ll")
 
         self.callable = value._callable
         if extname is not None:
@@ -72,7 +73,10 @@
             mapped_name = EXTERNALS[self.callable]
 
         self.make_name(mapped_name)
-        
+        if ext_func_sigs.get(self.ref + '_', None):
+            self.origref = self.ref
+            self.name += "_"
+
     def setup(self):
         self.db.prepare_type(self.value._TYPE.RESULT)
         self.db.prepare_type_multi(self.value._TYPE._trueargs()) 
@@ -80,31 +84,31 @@
     def _get_wrapper(self):
         wrapper = ext_func_sigs.get(self.ref, None)
 
-        if wrapper is None and maxint != 2**31-1:
-            #log("ref=%s" % self.ref)
-            rettype, args = self.getdecl_parts()
-            conversions = False
-            if   rettype == "long":
-                rettype = "int"
-                conversions = True
-            elif rettype == "ulong":
-                rettype = "uint"
-                conversions = True
-            else:
-                rettype = None
-            for i, a in enumerate(args):
-                if   a == "long":
-                    args[i] = "int"
-                    conversions = True
-                elif a == "ulong":
-                    args[i] = "uint"
-                    conversions = True
-                else:
-                    args[i] = None
-            if conversions:
-                wrapper = ExtFuncSig(rettype, args)
-                #log("    rettype=%s" % str(rettype))
-                #log("    args   =%s" % str(args))
+#         if wrapper is None and maxint != 2**31-1:
+#             #log("ref=%s" % self.ref)
+#             rettype, args = self.getdecl_parts()
+#             conversions = False
+#             if   rettype == "long":
+#                 rettype = "int"
+#                 conversions = True
+#             elif rettype == "ulong":
+#                 rettype = "uint"
+#                 conversions = True
+#             else:
+#                 rettype = None
+#             for i, a in enumerate(args):
+#                 if   a == "long":
+#                     args[i] = "int"
+#                     conversions = True
+#                 elif a == "ulong":
+#                     args[i] = "uint"
+#                     conversions = True
+#                 else:
+#                     args[i] = None
+#             if conversions:
+#                 wrapper = ExtFuncSig(rettype, args)
+#                 #log("    rettype=%s" % str(rettype))
+#                 #log("    args   =%s" % str(args))
         return wrapper
 
     def getdecl_parts(self):
@@ -166,15 +170,17 @@
         expected_rettype = wrapper.rettype or rettype
 
         # call
-        codewriter.call(returnval, expected_rettype, self.ref,
+        codewriter.call(returnval, expected_rettype, self.origref,
                         expected_argtypes, expected_argrefs)
 
         if wrapper.rettype:
             # cast to desired return type
             tmpval = returnval
             returnval = self.db.repr_tmpvar()
+            # XXX note we only have one case above - more will need
+            # to specialize the cast
             codewriter.cast(returnval, wrapper.rettype,
-                            tmpval, rettype)
+                            tmpval, rettype, 'trunc')
             
         codewriter.ret(rettype, returnval)
         codewriter.closefunc()

Modified: pypy/dist/pypy/translator/llvm/funcnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/funcnode.py	(original)
+++ pypy/dist/pypy/translator/llvm/funcnode.py	Thu Nov  8 00:41:07 2007
@@ -66,7 +66,7 @@
                 self.write_block(codewriter, block)
         if self.bad_switch_block:
             codewriter.label('badswitch')
-            codewriter._indent('call void %abort()')
+            codewriter._indent('call void @abort()')
             codewriter._indent('unreachable')
         codewriter.closefunc()
     

Modified: pypy/dist/pypy/translator/llvm/gc.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/gc.py	(original)
+++ pypy/dist/pypy/translator/llvm/gc.py	Thu Nov  8 00:41:07 2007
@@ -75,6 +75,7 @@
     def _zeromalloc(self, codewriter, targetvar, size=1, atomic=False,
                     exc_flag=False):
         """ assumes malloc of word size """
+        XXX
         uword = self.db.get_machine_uword()
         boundary_size = 0
 

Modified: pypy/dist/pypy/translator/llvm/module/genexterns.c
==============================================================================
--- pypy/dist/pypy/translator/llvm/module/genexterns.c	(original)
+++ pypy/dist/pypy/translator/llvm/module/genexterns.c	Thu Nov  8 00:41:07 2007
@@ -5,10 +5,17 @@
 #endif
 
 #include "c/src/thread.h"
-//#include "c/src/ll_os.h"
-#include "c/src/ll_math.h"
-#include "c/src/ll_strtod.h"
-#include "c/src/stack.h"
+#ifdef LL_NEED_MATH
+  #include "c/src/ll_math.h"
+#endif
+
+#ifdef LL_NEED_STRTOD
+  #include "c/src/ll_strtod.h"
+#endif
+
+#ifdef LL_NEED_STACK
+  #include "c/src/stack.h"
+#endif
 
 // setup code for ThreadLock Opaque types
 /*char *RPyOpaque_LLVM_SETUP_ThreadLock(struct RPyOpaque_ThreadLock *lock,

Modified: pypy/dist/pypy/translator/llvm/modwrapper.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/modwrapper.py	(original)
+++ pypy/dist/pypy/translator/llvm/modwrapper.py	Thu Nov  8 00:41:07 2007
@@ -52,6 +52,9 @@
 def from_unichar(arg):
     return ord(arg)
 
+def from_float(arg):
+    return ctypes.c_double(arg)
+
 def from_str(arg):
     # XXX wont work over isolate : arg should be converted into a string first
     n = len(arg.chars)
@@ -108,7 +111,7 @@
 
 # %(RT)r
 to_llargs = %(to_llargs)s
-__entrypoint__ = _c.pypy_%(name)s
+__entrypoint__.args = _c.pypy_%(name)s
 
 # %(ARGS)r
 ll_to_res = %(ll_to_res)s
@@ -172,6 +175,9 @@
             if A is lltype.UniChar:
                 action = 'from_unichar'
 
+            elif A is lltype.Float:
+                action = 'from_float'
+
             elif isinstance(A, lltype.Ptr) and A.TO is STR:
                 action = 'from_str'
             else:

Modified: pypy/dist/pypy/translator/llvm/opaquenode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/opaquenode.py	(original)
+++ pypy/dist/pypy/translator/llvm/opaquenode.py	Thu Nov  8 00:41:07 2007
@@ -47,6 +47,7 @@
         T = self.value._TYPE
         # XXX similar non generic hacks to genc for now
         if T.tag == 'ThreadLock':
+            XXX
             argrefs = [self.get_ref()]
             argtypes = [self.db.repr_type(T) + "*"]
             lock = self.value.externalobj

Modified: pypy/dist/pypy/translator/llvm/opwriter.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/opwriter.py	(original)
+++ pypy/dist/pypy/translator/llvm/opwriter.py	Thu Nov  8 00:41:07 2007
@@ -90,12 +90,13 @@
         for oo in 'lt le eq ne ge gt'.split():
             binary_operations['%s_%s' % (tt, oo)] = 'fcmp u%s' % oo
 
-    char_operations = {'char_lt': 'icmp lt',
-                       'char_le': 'icmp le',
-                       'char_eq': 'icmp eq',
-                       'char_ne': 'icmp ne',
-                       'char_ge': 'icmp ge',
-                       'char_gt': 'icmp gt'}
+    # ZZZ check that operation should be checking unsigned
+    binary_operations.update({'char_lt': 'icmp ult',
+                              'char_le': 'icmp ule',
+                              'char_eq': 'icmp eq',
+                              'char_ne': 'icmp ne',
+                              'char_ge': 'icmp uge',
+                              'char_gt': 'icmp ugt'})
 
     def __init__(self, db, codewriter):
         self.db = db
@@ -139,48 +140,14 @@
         elif op.opname in self.shift_operations:
             self.shiftop(opr)
 
-        elif op.opname in self.char_operations:
-            self.char_binaryop(opr)
-
         elif op.opname.startswith('cast_') or op.opname.startswith('truncate_'):
-            if op.opname == 'cast_char_to_int':
-                self.cast_char_to_int(opr)
-            else:
-                self.cast_primitive(opr)
+            self.cast_primitive(opr)
         else:
             meth = getattr(self, op.opname, None)
             if not meth:
                 raise Exception, "operation %s not found" % op.opname
             meth(opr)            
     
-    def _generic_pow(self, opr, onestr): 
-
-        # XXX This broken as... will only work for constants
-        try:
-            value = "NO VALUE"
-            value = opr.op.args[1].value
-            operand = int(value)
-        except Exception, exc:
-            msg = 'XXX: Error: _generic_pow: Variable '\
-                  '%s - failed to convert to int %s' % (value, str(exc))
-            self.codewriter.comment(msg)
-            raise Exception(msg)
-
-        mult_type = opr.argtypes[0]
-        mult_val = opr.argrefs[0]
-        last_val = mult_val
-        
-        if operand < 1:
-            res_val = onestr
-        else:
-            res_val = mult_val
-            for ii in range(operand - 1):
-                res_val = self._tmp()
-                self.codewriter.binaryop("mul", res_val, mult_type,
-                                         last_val, mult_val)
-                last_val = res_val
-        self.codewriter.cast(opr.retref, mult_type, res_val, mult_type)        
-
     def _skipped(self, opr):
         self.codewriter.comment('***Skipping operation %s()' % opr.op.opname)
     keepalive = _skipped
@@ -230,19 +197,12 @@
         self.codewriter.binaryop(name, opr.retref, opr.argtypes[0],
                                  opr.argrefs[0], opr.argrefs[1])
 
-    def char_binaryop(self, opr):
-        assert len(opr.argrefs) == 2
-        name = self.char_operations[opr.op.opname]
-        c1, c2 = self._tmp(2)
-        self.codewriter.cast(c1, "sbyte", opr.argrefs[0], "ubyte")
-        self.codewriter.cast(c2, "sbyte", opr.argrefs[1], "ubyte")
-        self.codewriter.binaryop(name, opr.retref, "ubyte", c1, c2)
-
     def shiftop(self, opr):
         op = opr.op
         name = self.shift_operations[op.opname]
 
         var = opr.argrefs[1]
+        # ZZZ why did we do this???
         #if isinstance(op.args[1], Constant):
         #    var = opr.argrefs[1]
         #else:
@@ -251,21 +211,18 @@
             
         self.codewriter.shiftop(name, opr.retref, opr.argtypes[0], opr.argrefs[0], var)
 
-    def cast_char_to_int(self, opr):
-        " works for all casts "
-        XXX
-        assert len(opr.argrefs) == 1
-        intermediate = self._tmp()
-        self.codewriter.cast(intermediate, opr.argtypes[0],
-                             opr.argrefs[0], "ubyte")
-        self.codewriter.cast(opr.retref, "ubyte", intermediate, opr.rettype)
-
     def cast_primitive(self, opr):
         " works for all casts "
         fromtype = opr.argtypes[0]
         totype = opr.rettype
         casttype = "bitcast"
         if '*' not in fromtype:
+            if fromtype[0] == 'i8':
+                 assert totype[0] == 'i'
+                 tosize = int(totype[1:])
+                 assert tosize > 8
+                 casttype = "zext" 
+                     
             if fromtype[0] == 'i' and totype[0] == 'i':
                 fromsize = int(fromtype[1:])
                 tosize = int(totype[1:])
@@ -299,7 +256,7 @@
     llong_is_true = int_is_true
 
     def float_is_true(self, opr):
-        self.codewriter.binaryop("setne", opr.retref, opr.argtypes[0],
+        self.codewriter.binaryop("fcmp une", opr.retref, opr.argtypes[0],
                                  opr.argrefs[0], "0.0")
 
     def ptr_nonzero(self, opr):
@@ -474,8 +431,8 @@
 
     def adr_delta(self, opr):
         addr1, addr2 = self._tmp(2)
-        self.codewriter.cast(addr1, opr.argtypes[0], opr.argrefs[0], self.word)
-        self.codewriter.cast(addr2, opr.argtypes[1], opr.argrefs[1], self.word)
+        self.codewriter.cast(addr1, opr.argtypes[0], opr.argrefs[0], self.word, 'ptrtoint')
+        self.codewriter.cast(addr2, opr.argtypes[1], opr.argrefs[1], self.word, 'ptrtoint')
         self.codewriter.binaryop("sub", opr.retref, opr.rettype, addr1, addr2)
 
     def _op_adr_generic(self, opr, llvm_op):
@@ -505,16 +462,16 @@
         self._op_adr_cmp(opr, "icmp ne")
 
     def adr_le(self, opr):
-        self._op_adr_cmp(opr, "icmp le")
+        self._op_adr_cmp(opr, "icmp sle")
 
     def adr_gt(self, opr):
-        self._op_adr_cmp(opr, "icmp gt")
+        self._op_adr_cmp(opr, "icmp sgt")
 
     def adr_lt(self, opr):
-        self._op_adr_cmp(opr, "icmp lt")
+        self._op_adr_cmp(opr, "icmp slt")
 
     def adr_ge(self, opr):
-        self._op_adr_cmp(opr, "icmp ge")
+        self._op_adr_cmp(opr, "icmp sge")
 
     # XXX Not sure any of this makes sense - maybe seperate policy for
     # different flavours of mallocs?  Well it depend on what happens the GC



More information about the Pypy-commit mailing list