Author: Armin Rigo <[email protected]>
Branch: py3.5
Changeset: r90573:7b9cf75b06d0
Date: 2017-03-05 21:34 +0100
http://bitbucket.org/pypy/pypy/changeset/7b9cf75b06d0/
Log: hg merge default
diff --git a/rpython/jit/backend/x86/regalloc.py
b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -948,11 +948,11 @@
# If this also contains args[0], this returns the current
# location too.
arglocs = [self.loc(args[i]) for i in range(2, len(args))]
- gcmap = self.get_gcmap()
if op.type == 'v':
# a plain COND_CALL. Calls the function when args[0] is
# true. Often used just after a comparison operation.
+ gcmap = self.get_gcmap()
self.load_condition_into_cc(op.getarg(0))
resloc = None
else:
@@ -969,6 +969,22 @@
resloc = self.rm.force_result_in_reg(op, args[0],
forbidden_vars=args[2:])
+ # Get the gcmap here, possibly including the spilled
+ # location, and always excluding the 'resloc' register.
+ # Some more details: the only interesting case is the case
+ # where we're doing the call (if we are not, the gcmap is
+ # not used); and in this case, the gcmap must include the
+ # spilled location (it contains a valid GC pointer to fix
+ # during the call if a GC occurs), and never 'resloc'
+ # (it will be overwritten with the result of the call, which
+ # is not computed yet if a GC occurs).
+ #
+ # (Note that the spilled value is always NULL at the moment
+ # if the call really occurs, but it's not worth the effort to
+ # not list it in the gcmap and get crashes if we tweak
+ # COND_CALL_VALUE_R in the future)
+ gcmap = self.get_gcmap([resloc])
+
# Test the register for the result.
self.assembler.test_location(resloc)
self.assembler.guard_success_cc = rx86.Conditions['Z']
diff --git a/rpython/memory/gc/incminimark.py b/rpython/memory/gc/incminimark.py
--- a/rpython/memory/gc/incminimark.py
+++ b/rpython/memory/gc/incminimark.py
@@ -2124,7 +2124,8 @@
def _malloc_out_of_nursery(self, totalsize):
"""Allocate non-movable memory for an object of the given
'totalsize' that lives so far in the nursery."""
- if raw_malloc_usage(totalsize) <= self.small_request_threshold:
+ if (r_uint(raw_malloc_usage(totalsize)) <=
+ r_uint(self.small_request_threshold)):
# most common path
return self.ac.malloc(totalsize)
else:
@@ -2133,6 +2134,9 @@
_malloc_out_of_nursery._always_inline_ = True
def _malloc_out_of_nursery_nonsmall(self, totalsize):
+ if r_uint(raw_malloc_usage(totalsize)) > r_uint(self.nursery_size):
+ out_of_memory("memory corruption: bad size for object in the "
+ "nursery")
# 'totalsize' should be aligned.
ll_assert(raw_malloc_usage(totalsize) & (WORD-1) == 0,
"misaligned totalsize in _malloc_out_of_nursery_nonsmall")
diff --git a/rpython/translator/platform/linux.py
b/rpython/translator/platform/linux.py
--- a/rpython/translator/platform/linux.py
+++ b/rpython/translator/platform/linux.py
@@ -14,7 +14,7 @@
extra_libs = ('-lrt',)
cflags = tuple(
['-O3', '-pthread', '-fomit-frame-pointer',
- '-Wall', '-Wno-unused']
+ '-Wall', '-Wno-unused', '-Wno-address']
+ os.environ.get('CFLAGS', '').split())
standalone_only = ()
shared_only = ('-fPIC',)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit