[pypy-svn] r30186 - in pypy/dist/pypy/translator/llvm: . test
rxe at codespeak.net
rxe at codespeak.net
Tue Jul 18 23:17:32 CEST 2006
Author: rxe
Date: Tue Jul 18 23:17:29 2006
New Revision: 30186
Modified:
pypy/dist/pypy/translator/llvm/database.py
pypy/dist/pypy/translator/llvm/test/test_lladdresses.py
Log:
Tentatively (very) add support for fixedaddress.
Modified: pypy/dist/pypy/translator/llvm/database.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/database.py (original)
+++ pypy/dist/pypy/translator/llvm/database.py Tue Jul 18 23:17:29 2006
@@ -145,8 +145,7 @@
#log.prepareconstant(value, "(is primitive)")
return
- if isinstance(type_, lltype.Ptr):
-
+ if isinstance(type_, lltype.Ptr):
type_ = type_.TO
value = value._obj
@@ -170,11 +169,23 @@
if isinstance(const_or_var, Constant):
ct = const_or_var.concretetype
if isinstance(ct, lltype.Primitive):
- #log.prepare(const_or_var, "(is primitive)")
- return
-
- assert isinstance(ct, lltype.Ptr), "Preparation of non primitive and non pointer"
- value = const_or_var.value._obj
+ # special cases for address
+ if ct is llmemory.Address:
+ fakedaddress = const_or_var.value
+ if fakedaddress is not None and fakedaddress.ob is not None:
+ ptrvalue = fakedaddress.ob
+ ct = lltype.typeOf(ptrvalue)
+ else:
+ return
+ elif ct is llmemory.WeakGcAddress:
+ return # XXX sometime soon
+ else:
+ return
+ else:
+ assert isinstance(ct, lltype.Ptr), "Preparation of non primitive and non pointer"
+ ptrvalue = const_or_var.value
+
+ value = ptrvalue._obj
# Only prepare root values at this point
if isinstance(ct, lltype.Array) or isinstance(ct, lltype.Struct):
@@ -264,7 +275,7 @@
# special case, null pointer
if value is None:
- return None, "%s null" % (toptr,)
+ return None, "%s null" % toptr
node = self.obj2node[value]
ref = node.get_pbcref(toptr)
@@ -290,6 +301,7 @@
return self.obj2node[type_].constructor_ref
def repr_name(self, obj):
+ " simply returns a reference to constant value "
return self.obj2node[obj].ref
def repr_value(self, value):
@@ -358,7 +370,7 @@
lltype.Bool : self.repr_bool,
lltype.Void : self.repr_void,
llmemory.Address : self.repr_address,
- llmemory.WeakGcAddress : self.repr_address,
+ llmemory.WeakGcAddress : self.repr_weakgcaddress,
}
#XXX
# try:
@@ -420,9 +432,37 @@
return repr
def repr_address(self, type_, value):
- # XXX fix this
- assert value == NULL
- return 'null'
+ if value is NULL:
+ return 'null'
+
+ assert isinstance(value, llmemory.fakeaddress)
+
+ if value.offset is None:
+ if value.ob is None:
+ return 'null'
+ else:
+ obj = value.ob._obj
+ typename = self.database.repr_type(lltype.typeOf(obj))
+ ref = self.database.repr_name(obj)
+ else:
+ from_, indices, to = self.get_offset(value.offset)
+ indices_as_str = ", ".join("%s %s" % (w, i) for w, i in indices)
+
+ original_typename = self.database.repr_type(from_)
+ orignal_ref = self.database.repr_name(value.ob._obj)
+
+ typename = self.database.repr_type(to)
+ ref = "getelementptr(%s* %s, %s)" % (original_typename,
+ orignal_ref,
+ indices_as_str)
+
+ res = "cast(%s* %s to sbyte*)" % (typename, ref)
+ return res
+
+ def repr_weakgcaddress(self, type_, value):
+ assert isinstance(value, llmemory.fakeweakaddress)
+ log.settingup("XXXX weakgcaddress completely ignored...")
+ return 'null'
def repr_signed(self, type_, value):
if isinstance(value, Symbolic):
@@ -433,20 +473,14 @@
return str(value)
def repr_symbolic(self, type_, value):
+ """ returns an int value for pointer arithmetic - not sure this is the
+ llvm way, but well XXX need to fix adr_xxx operations """
if isinstance(value, llmemory.AddressOffset):
- if isinstance(value, llmemory.CompositeOffset):
- # add offsets together...
- from_, indices, to = self.get_offset(value.offsets[0])
- indices = list(indices)
- for item in value.offsets[1:]:
- _, more, to = self.get_offset(item, fromoffset=True)
- indices.extend(more)
- else:
- from_, indices, to = self.get_offset(value)
-
+ from_, indices, to = self.get_offset(value)
indices_as_str = ", ".join("%s %s" % (w, i) for w, i in indices)
- repr = "cast(%s* getelementptr(%s* null, %s) to int)" % (to,
- from_,
+ r = self.database.repr_type
+ repr = "cast(%s* getelementptr(%s* null, %s) to int)" % (r(to),
+ r(from_),
indices_as_str)
elif isinstance(value, ComputedIntSymbolic):
# XXX what does this do? Is this safe?
@@ -485,8 +519,15 @@
indices.append((uword, 1))
from_ = value.TYPE
to = value.TYPE.OF
+
+ elif isinstance(value, llmemory.CompositeOffset):
+ from_, indices, to = self.get_offset(value.offsets[0])
+ indices = list(indices)
+ for item in value.offsets[1:]:
+ _, more, to = self.get_offset(item, fromoffset=True)
+ indices.extend(more)
else:
raise Exception("unsupported offset")
- return self.database.repr_type(from_), indices, self.database.repr_type(to)
+ return from_, indices, to
Modified: pypy/dist/pypy/translator/llvm/test/test_lladdresses.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/test/test_lladdresses.py (original)
+++ pypy/dist/pypy/translator/llvm/test/test_lladdresses.py Tue Jul 18 23:17:29 2006
@@ -137,6 +137,39 @@
fn = compile_function(f, [int])
assert fn(1) == 2
+def test_fakeaddress():
+ S = lltype.GcStruct('s', ('val', lltype.Signed))
+ s = lltype.malloc(S)
+ s.val = 10
+ PtrS = lltype.Ptr(S)
+ adr = llmemory.cast_ptr_to_adr(s)
+ def f(n):
+ s1 = llmemory.cast_adr_to_ptr(adr, PtrS)
+ old = s1.val
+ s1.val = n
+ return old + s1.val
+ fn = compile_function(f, [int])
+ assert fn(32) == 42
+
+def test_fakeaddress2():
+ S1 = lltype.GcStruct("S1", ("x", lltype.Signed), ("y", lltype.Signed))
+ PtrS1 = lltype.Ptr(S1)
+ S2 = lltype.GcStruct("S2", ("s", S1))
+
+ s2 = lltype.malloc(S2)
+ s2.s.x = 123
+ s2.s.y = 456
+
+ addr_s2 = llmemory.cast_ptr_to_adr(s2)
+ addr_s1 = addr_s2 + llmemory.FieldOffset(S2, 's')
+
+ def f():
+ s1 = llmemory.cast_adr_to_ptr(addr_s1, PtrS1)
+ return s1.x + s1.y
+
+ fn = compile_function(f, [])
+ assert f() == 579
+
def test_weakaddress():
from pypy.rpython.objectmodel import cast_object_to_weakgcaddress
from pypy.rpython.objectmodel import cast_weakgcaddress_to_object
@@ -153,3 +186,4 @@
return len(l1) == len(l2)
fn = compile_function(func, [int])
assert fn(10)
+
More information about the Pypy-commit
mailing list