[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