[pypy-svn] r14228 - pypy/dist/pypy/translator/llvm2

ericvrp at codespeak.net ericvrp at codespeak.net
Mon Jul 4 17:40:01 CEST 2005


Author: ericvrp
Date: Mon Jul  4 17:40:00 2005
New Revision: 14228

Added:
   pypy/dist/pypy/translator/llvm2/atomic.py
Modified:
   pypy/dist/pypy/translator/llvm2/arraynode.py
   pypy/dist/pypy/translator/llvm2/funcnode.py
   pypy/dist/pypy/translator/llvm2/structnode.py
Log:
Added notion of atomic structures


Modified: pypy/dist/pypy/translator/llvm2/arraynode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/arraynode.py	(original)
+++ pypy/dist/pypy/translator/llvm2/arraynode.py	Mon Jul  4 17:40:00 2005
@@ -44,6 +44,8 @@
            store int %len, int* %arraylength 
            ret %array* %result
         }"""
+        from pypy.translator.llvm2.atomic import is_atomic
+
         log.writeimpl(self.ref)
         codewriter.openfunc(self.constructor_decl)
         indices = [("uint", 1), ("int", "%len")]
@@ -51,7 +53,7 @@
                                  "null", *indices)
         fromtype = self.db.repr_arg_type(self.array.OF) 
         codewriter.cast("%usize", fromtype + "*", "%size", "uint")
-        codewriter.malloc("%ptr", "sbyte", "%usize", atomic=False)
+        codewriter.malloc("%ptr", "sbyte", "%usize", atomic=is_atomic(self))
         codewriter.cast("%result", "sbyte*", "%ptr", self.ref+"*")
         codewriter.getelementptr("%arraylength", self.ref+"*", "%result", ("uint", 0))
         codewriter.store("int", "%len", "%arraylength")

Added: pypy/dist/pypy/translator/llvm2/atomic.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/translator/llvm2/atomic.py	Mon Jul  4 17:40:00 2005
@@ -0,0 +1,16 @@
+from pypy.translator.llvm2.log import log
+from pypy.translator.llvm2.structnode import StructTypeNode
+from pypy.translator.llvm2.arraynode import ArrayTypeNode
+
+log = log.atomic
+
+def is_atomic(node):
+    if isinstance(node, StructTypeNode):
+        fields = str([getattr(node.struct, name) for name in node.struct._names_without_voids()])
+        if '*' not in fields:
+            return True #non-pointers only
+        return False    #contains pointer(s)
+    elif isinstance(node, ArrayTypeNode):
+        return False    #because they actually are arrays of pointers
+    log("unknown type %s, assuming non-atomic" % str(type(node)))
+    return False    

Modified: pypy/dist/pypy/translator/llvm2/funcnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/funcnode.py	(original)
+++ pypy/dist/pypy/translator/llvm2/funcnode.py	Mon Jul  4 17:40:00 2005
@@ -5,6 +5,7 @@
 from pypy.translator.backendoptimization import remove_same_as 
 from pypy.translator.unsimplify import remove_double_links                     
 from pypy.translator.llvm2.node import LLVMNode
+from pypy.translator.llvm2.atomic import is_atomic
 from pypy.translator.llvm2.log import log 
 log = log.funcnode
 
@@ -251,8 +252,9 @@
         assert (isinstance(arg, Constant) and 
                 isinstance(arg.value, lltype.Struct))
         #XXX unclean
-        type = self.db.obj2node[arg.value].ref
-        self.codewriter.malloc(targetvar, type, atomic=False) 
+        node  = self.db.obj2node[arg.value]
+        type_ = node.ref
+        self.codewriter.malloc(targetvar, type_, atomic=is_atomic(node)) 
 
     def malloc_varsize(self, op):
         targetvar = self.db.repr_arg(op.result)

Modified: pypy/dist/pypy/translator/llvm2/structnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/structnode.py	(original)
+++ pypy/dist/pypy/translator/llvm2/structnode.py	Mon Jul  4 17:40:00 2005
@@ -48,6 +48,8 @@
         codewriter.declare(self.constructor_name)
 
     def writeimpl(self, codewriter):
+        from pypy.translator.llvm2.atomic import is_atomic
+
         log.writeimpl(self.ref)
         codewriter.openfunc(self.constructor_name)
         codewriter.label("block0")
@@ -65,7 +67,7 @@
 
         #XXX is this ok for 64bit?
         codewriter.cast("%sizeu", arraytype + "*", "%size", "uint")
-        codewriter.malloc("%resulttmp", "sbyte", "%sizeu", atomic=False)
+        codewriter.malloc("%resulttmp", "sbyte", "%sizeu", atomic=is_atomic(self))
         codewriter.cast("%result", "sbyte*", "%resulttmp", self.ref + "*")
 
         # remember the allocated length for later use.



More information about the Pypy-commit mailing list