[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