jit/backend/aarch64/test/test_runner.py::TestARM64::()::test_call_release_gil_variable_function_and_arguments
self = <rpython.jit.backend.aarch64.test.test_runner.TestARM64 object at 0x00000001126cd600>
def test_call_release_gil_variable_function_and_arguments(self):
from rpython.translator.tool.cbuild import ExternalCompilationInfo
from rpython.rlib.libffi import types
from rpython.rlib.rarithmetic import r_uint, r_longlong, r_ulonglong
from rpython.rlib.rarithmetic import r_singlefloat
from rpython.translator.c import primitive
def same_as_for_box(b):
if b.type == 'i':
return rop.SAME_AS_I
elif b.type == 'f':
return rop.SAME_AS_F
else:
assert False
cpu = self.cpu
rnd = random.Random(525)
seed = py.test.config.option.randomseed
print("random seed %d" % seed)
ALL_TYPES = [
(types.unsigned, lltype.Unsigned),
(types.signed, lltype.Signed),
(types.uint8, rffi.UCHAR),
(types.sint8, rffi.SIGNEDCHAR),
(types.uint16, rffi.USHORT),
(types.sint16, rffi.SHORT),
(types.uint32, rffi.UINT),
(types.sint32, rffi.INT),
]
if IS_32_BIT and cpu.supports_longlong:
ALL_TYPES += [
(types.uint64, lltype.UnsignedLongLong),
(types.sint64, lltype.SignedLongLong),
] * 2
if cpu.supports_floats:
ALL_TYPES += [
(types.double, rffi.DOUBLE),
] * 4
if cpu.supports_singlefloats:
ALL_TYPES += [
(types.float, rffi.FLOAT),
] * 4
NB_TESTS = 100
c_source = []
all_tests = []
def prepare_c_source():
"""Pick a random choice of argument types and length,
and build a C function with these arguments. The C
function will simply copy them all into static global
variables. There are then additional functions to fetch
them, one per argument, with a signature 'void(ARG *)'.
"""
POSSIBLE_TYPES = [rnd.choice(ALL_TYPES)
for i in range(random.randrange(2, 5))]
load_factor = rnd.random()
keepalive_factor = rnd.random()
#
ffitypes = []
ARGTYPES = []
for i in range(rnd.randrange(4, 20)):
ffitype, TP = rnd.choice(POSSIBLE_TYPES)
ffitypes.append(ffitype)
ARGTYPES.append(TP)
fn_name = 'vartest%d' % k
all_tests.append((ARGTYPES, ffitypes, fn_name))
#
fn_args = []
for i, ARG in enumerate(ARGTYPES):
arg_decl = primitive.cdecl(primitive.PrimitiveType[ARG],
'x%d' % i)
fn_args.append(arg_decl)
var_name = 'argcopy_%s_x%d' % (fn_name, i)
var_decl = primitive.cdecl(primitive.PrimitiveType[ARG],
var_name)
c_source.append('static %s;' % var_decl)
getter_name = '%s_get%d' % (fn_name, i)
c_source.append('RPY_EXPORTED void %s(%s) { *p = %s; }' % (
getter_name,
primitive.cdecl(primitive.PrimitiveType[ARG], '*p'),
var_name))
c_source.append('#include <stdio.h>')
c_source.append('')
c_source.append('static void real%s(%s)' % (
fn_name, ', '.join(fn_args)))
c_source.append('{')
for i in range(len(ARGTYPES)):
if ARGTYPES[i] is lltype.Float:
c_source.append(' fprintf(stderr, "x%d = %%f\\n", x%d);' % (i, i))
elif ARGTYPES[i] is lltype.Signed:
c_source.append(' fprintf(stderr, "x%d = %%ld\\n", x%d);' % (i, i))
elif ARGTYPES[i] is rffi.UINT:
c_source.append(' fprintf(stderr, "x%d = %%u\\n", x%d);' % (i, i))
for i in range(len(ARGTYPES)):
c_source.append(' argcopy_%s_x%d = x%d;' % (fn_name, i, i))
c_source.append('}')
c_source.append('RPY_EXPORTED void *%s(void)' % fn_name)
c_source.append('{')
c_source.append(' return (void *)&real%s;' % fn_name)
c_source.append('}')
c_source.append('')
for k in range(NB_TESTS):
prepare_c_source()
eci = ExternalCompilationInfo(
separate_module_sources=['\n'.join(c_source)])
for k in range(NB_TESTS):
ARGTYPES, ffitypes, fn_name = all_tests[k]
func_getter_ptr = rffi.llexternal(fn_name, [], lltype.Signed,
compilation_info=eci, _nowrapper=True)
load_factor = rnd.random()
keepalive_factor = rnd.random()
#
func_raw = func_getter_ptr()
calldescr = cpu._calldescr_dynamic_for_tests(ffitypes, types.void)
faildescr = BasicFailDescr(1)
#
argboxes = [InputArgInt()] # for the function to call
codes = ['X']
for ffitype in ffitypes:
kind = types.getkind(ffitype)
codes.append(kind)
if kind in 'uis':
b1 = InputArgInt()
elif kind in 'fUI':
b1 = InputArgFloat()
else:
assert 0, kind
argboxes.append(b1)
codes = ''.join(codes) # useful for pdb
print()
print(codes)
#
argvalues = [func_raw]
for TP in ARGTYPES:
r = (rnd.random() - 0.5) * 999999999999.9
r = rffi.cast(TP, r)
argvalues.append(r)
#
argvalues_normal = argvalues[:1]
for ffitype, r in zip(ffitypes, argvalues[1:]):
kind = types.getkind(ffitype)
if kind in 'ui':
r = rffi.cast(lltype.Signed, r)
elif kind in 's':
r, = struct.unpack("i", struct.pack("f", float(r)))
elif kind in 'f':
r = longlong.getfloatstorage(r)
elif kind in 'UI': # 32-bit only
r = rffi.cast(lltype.SignedLongLong, r)
else:
assert 0
argvalues_normal.append(r)
#
ops = []
loadcodes = []
insideboxes = []
for b1 in argboxes:
load = rnd.random() < load_factor
loadcodes.append(' ^'[load])
if load:
b2 = ResOperation(same_as_for_box(b1), [b1])
ops.insert(rnd.randrange(0, len(ops)+1), b2)
b1 = b2
insideboxes.append(b1)
loadcodes = ''.join(loadcodes)
print(loadcodes)
ops += [
ResOperation(rop.CALL_RELEASE_GIL_N,
[ConstInt(0)] + insideboxes,
descr=calldescr),
ResOperation(rop.GUARD_NOT_FORCED, [], descr=faildescr),
ResOperation(rop.FINISH, [], descr=BasicFinalDescr(0))
]
ops[-2].setfailargs([])
# keep alive a random subset of the insideboxes
for b1 in insideboxes:
if rnd.random() < keepalive_factor:
ops.insert(-1, ResOperation(same_as_for_box(b1), [b1]))
looptoken = JitCellToken()
self.cpu.compile_loop(argboxes, ops, looptoken)
#
deadframe = self.cpu.execute_token(looptoken, *argvalues_normal)
fail = self.cpu.get_latest_descr(deadframe)
assert fail.identifier == 0
expected = argvalues[1:]
got = []
for i, ARG in enumerate(ARGTYPES):
PARG = rffi.CArrayPtr(ARG)
getter_name = '%s_get%d' % (fn_name, i)
getter_ptr = rffi.llexternal(getter_name, [PARG], lltype.Void,
compilation_info=eci,
_nowrapper=True)
my_arg = lltype.malloc(PARG.TO, 1, zero=True, flavor='raw')
getter_ptr(my_arg)
got.append(my_arg[0])
lltype.free(my_arg, flavor='raw')
different_values = ['x%d: got %r, expected %r' % (i, a, b)
for i, (a, b) in enumerate(zip(got, expected))
if a != b]
assert got == expected, '\n'.join(
> ['bad args, signature %r' % codes[1:]] + different_values)
E AssertionError: bad args, signature 'uuuuiufiffuuiuufuf'
E x12: got 0L, expected 117L
E x13: got 117L, expected 3945817773L
E x14: got 0L, expected 903130545L
E x16: got 3945817773L, expected 18446743929789961853L
jit/backend/test/runner_test.py:3125: AssertionError
---------- Captured stderr setup ----------
[c58dc5c87c74980] {jit-backend-dump
BACKEND arm
SYS_EXECUTABLE ??
CODE_DUMP @7003600000 +0 A02300F9A12700F9A22B00F9A32F00F9A43300F9A53700F9A63B00F9A73F00F9A84300F9A94700F9AA4B00F9AB4F00F9AC5300F9AD5700F9B35B00F9B45F00F9E0031DAAF35344A9FE77C5A8C0035FD6
[c58dc5c87d6c600] jit-backend-dump}
[c58dc5c88070b80] {jit-backend-dump
BACKEND arm
SYS_EXECUTABLE ??
CODE_DUMP @7003600060 +0 A02300F9A12700F9A22B00F9A32F00F9A43300F9A53700F9A63B00F9A73F00F9A84300F9A94700F9AA4B00F9AB4F00F9AC5300F9AD5700F9B35B00F9B45F00F905FF99D2A526A0F20500CCF2A40040F9060080D2A60000F905FE99D2A526A0F20500CCF2A60000F9A41700F9E0031DAAF35344A9FE77C5A8C0035FD6
[c58dc5c881e1d80] jit-backend-dump}
[c58dc5c88994d00] {jit-backend-dump
BACKEND arm
SYS_EXECUTABLE ??
CODE_DUMP @70036000f0 +0 A02300F9A12700F9A22B00F9A32F00F9A43300F9A53700F9A63B00F9A73F00F9A84300F9A94700F9AA4B00F9AB4F00F9AC5300F9AD5700F9B35B00F9B45F00F9A06300FDA16700FDA26B00FDA36F00FDA47300FDA57700FDA67B00FDA77F00FDE00740A9FE0300F9A00F00F9E0031DAA10FF99D2B026A0F21000CCF2100240F9B01700F910FE99D2B026A0F21000CCF2130240F910FF99D2B026A0F21000CCF2110080D2110200F910FE99D2B026A0F21000CCF2110200F9106281D2F084A0F23000C0F21000E0F200023FD6FD0300AA10FF99D2B026A0F21000CCF2B11740F9110200F9110080D2B11700F910FE99D2B026A0F21000CCF2130200F9100080D2B00F00F9A02340F9A12740F9A22B40F9A32F40F9A43340F9A53740F9A63B40F9A73F40F9A84340F9A94740F9AA4B40F9AB4F40F9AC5340F9AD5740F9B35B40F9B45F40F9A06340FDA16740FDA26B40FDA36F40FDA47340FDA57740FDA67B40FDA77F40FDFE0340F9FF430091C0035FD6
[c58dc5c88d9b380] jit-backend-dump}
[c58dc5c8900bd80] {jit-backend-dump
BACKEND arm
SYS_EXECUTABLE ??
CODE_DUMP @7003600270 +0 A02300F9A12700F9A22B00F9A32F00F9A43300F9A53700F9A63B00F9A73F00F9A84300F9A94700F9AA4B00F9AB4F00F9AC5300F9AD5700F9B35B00F9B45F00F9A06300FDA16700FDA26B00FDA36F00FDA47300FDA57700FDA67B00FDA77F00FDE0031DAAF35344A9FE77C5A8C0035FD6
[c58dc5c89159580] jit-backend-dump}
[c58dc5c89495b00] {jit-backend-dump
BACKEND arm
SYS_EXECUTABLE ??
CODE_DUMP @70036002f0 +0 A02300F9A12700F9A22B00F9A32F00F9A43300F9A53700F9A63B00F9A73F00F9A84300F9A94700F9AA4B00F9AB4F00F9AC5300F9AD5700F9B35B00F9B45F00F9A06300FDA16700FDA26B00FDA36F00FDA47300FDA57700FDA67B00FDA77F00FD05FF99D2A526A0F20500CCF2A40040F9060080D2A60000F905FE99D2A526A0F20500CCF2A60000F9A41700F9E0031DAAF35344A9FE77C5A8C0035FD6
[c58dc5c8965cc80] jit-backend-dump}
[c58dc5c897fdc00] {jit-backend-dump
BACKEND arm
SYS_EXECUTABLE ??
CODE_DUMP @70036003a0 +0 10FF99D2B026A0F21000CCF2000240F9110080D2110200F910FE99D2B026A0F21000CCF2110200F9A01700F9000080D2A00700F9E0031DAAF35344A9FE77C5A8C0035FD6
[c58dc5c898d1d00] jit-backend-dump}
[c58dc5c89cadb80] {jit-backend-dump
BACKEND arm
SYS_EXECUTABLE ??
CODE_DUMP @70036003f0 +0 A02300F9A12700F9A22B00F9A32F00F9A43300F9A53700F9A63B00F9A73F00F9A84300F9A94700F9AA4B00F9AB4F00F9AC5300F9AD5700F9B35B00F9B45F00F9A06300FDA16700FDA26B00FDA36F00FDA47300FDA57700FDA67B00FDA77F00FDFF4300D1F00700F9FE0300F920023FD6F10300AAA02340F9A12740F9A22B40F9A32F40F9A43340F9A53740F9A63B40F9A73F40F9A84340F9A94740F9AA4B40F9AB4F40F9AC5340F9AD5740F9B35B40F9B45F40F9F00340F9FF43009100025FD6
[c58dc5c89ed4600] jit-backend-dump}
[c58dc5c8a26b780] {jit-backend-dump
BACKEND arm
SYS_EXECUTABLE ??
CODE_DUMP @70036004c0 +0 A02300F9A12700F9A22B00F9A32F00F9A43300F9A53700F9A63B00F9A73F00F9A84300F9A94700F9AA4B00F9AB4F00F9AC5300F9AD5700F9A06300FDA16700FDA26B00FDA36F00FDA47300FDA57700FDA67B00FDA77F00FDFF4300D1F00700F9FE0300F920023FD6F10300AAA02340F9A12740F9A22B40F9A32F40F9A43340F9A53740F9A63B40F9A73F40F9A84340F9A94740F9AA4B40F9AB4F40F9AC5340F9AD5740F9F00340F9FF43009100025FD6
[c58dc5c8a46ab00] jit-backend-dump}
[c58dc5c8a8f6800] {jit-backend-dump
BACKEND arm
SYS_EXECUTABLE ??
CODE_DUMP @7003600580 +0 A02300F9A12700F9A22B00F9A32F00F9A43300F9A53700F9A63B00F9A73F00F9A84300F9A94700F9AA4B00F9AB4F00F9AC5300F9AD5700F9B35B00F9B45F00F9A06300FDA16700FDA26B00FDA36F00FDA47300FDA57700FDA67B00FDA77F00FDFF4300D1F00700F9FE0300F920023FD6F10300AAA02340F9A12740F9A22B40F9A32F40F9A43340F9A53740F9A63B40F9A73F40F9A84340F9A94740F9AA4B40F9AB4F40F9AC5340F9AD5740F9B35B40F9B45F40F9A06340FDA16740FDA26B40FDA36F40FDA47340FDA57740FDA67B40FDA77F40FDF00340F9FF43009100025FD6
[c58dc5c8ab82000] jit-backend-dump}
[c58dc5c8afb6080] {jit-backend-dump
BACKEND arm
SYS_EXECUTABLE ??
CODE_DUMP @7003600670 +0 A02300F9A12700F9A22B00F9A32F00F9A43300F9A53700F9A63B00F9A73F00F9A84300F9A94700F9AA4B00F9AB4F00F9AC5300F9AD5700F9A06300FDA16700FDA26B00FDA36F00FDA47300FDA57700FDA67B00FDA77F00FDFF4300D1F00700F9FE0300F920023FD6F10300AAA02340F9A12740F9A22B40F9A32F40F9A43340F9A53740F9A63B40F9A73F40F9A84340F9A94740F9AA4B40F9AB4F40F9AC5340F9AD5740F9A06340FDA16740FDA26B40FDA36F40FDA47340FDA57740FDA67B40FDA77F40FDF00340F9FF43009100025FD6
[c58dc5c8b29fc80] jit-backend-dump}
---------- Captured stdout call ----------
random seed 9927
Xffffffffffffff
^ ^^ ^ ^ ^ ^
Xuuuuu
^ ^
Xuuuuiufiffuuiuufuf
---------- Captured stderr call ----------
[c58dc5c99b90500] {jit-mem-looptoken-alloc
allocating Loop # -1
[c58dc5c99bb4380] jit-mem-looptoken-alloc}
[c58dc5c9a6df200] {jit-backend-dump
BACKEND arm
SYS_EXECUTABLE ??
CODE_DUMP @7003600780 +0 00000000000000000000000000000000FE77BBA9F35304A9E10F00F9FD0300AA007491D26023A0F20000CCF2010040F921040091010000F9A0A740FDA18B40FDA18340F9A2B740FDA39740FDA49F40FDA58F40FD70FDFF58B00B00F9FFC300D1E00300FDB0AB40F9F00700F9B0AF40F9F00B00F9B0B340F9F00F00F9E21300FDB0BB40F9F01700F9F10301AAA08740FDA240601EA59B40FD8640601EA7A340FD6440601EA39340FDE80311AA10EB80D2106CA0F2100EC0F2B00F00F9113988D27189A0F23100C0F2330240F93FFE9FC8BD07009100013FD6FFC300910F3988D26F89A0F22F00C0F2E17D5FC8610000B5F3FD03C8A3FFFF35BF3B03D5C10000B4101280D2F084A0F23000C0F21000E0F200023FD6BD0700D1100080D2B00F00F9B00740F91F0200F1000020D4F0F6FF58B00700F9BF0F00F9E0031DAAF35344A9FE77C5A8C0035FD6000020D4B0F5FF58B00700F910ED80D2106CA0F2100EC0F2B00F00F9100C80D2106CA0F2100EC0F21000E0F200023FD6
[c58dc5c9ab01780] jit-backend-dump}
[c58dc5c9abae900] {jit-backend-dump
BACKEND arm
SYS_EXECUTABLE ??
CODE_DUMP @70036008a8 +0 21010054
[c58dc5c9abd1980] jit-backend-dump}
[c58dc5c9aff1000] {jit-backend-addr
Loop -1 () has address 0x70036007a0 to 0x70036008cc (bootstrap 0x7003600790)
gc table: 0x7003600780
function: 0x7003600790
resops: 0x70036007a0
failures: 0x70036008cc
end: 0x70036008f8
[c58dc5c9b004700] jit-backend-addr}
x0 = -75082577470.828400
x1 = -279033511740.873596
x2 = -262832926174.033356
x3 = -84477706253.381241
x4 = 103151630385.189056
x5 = 177863787870.770386
x6 = 492302571011.912292
x7 = 400755024866.539368
x8 = 127941291722.106201
x9 = 400015262048.483459
x10 = -335452569335.082825
x11 = -653028674.568558
x12 = 35045871733.236305
x13 = -169469646564.412354
[c58dc5cb9731980] {jit-mem-looptoken-alloc
allocating Loop # -1
[c58dc5cb973b980] jit-mem-looptoken-alloc}
[c58dc5cb9ef1380] {jit-backend-dump
BACKEND arm
SYS_EXECUTABLE ??
CODE_DUMP @7003600930 +0 00000000000000000000000000000000FE77BBA9F35304A9E10F00F9FD0300AA00C081D28023A0F20000CCF2010040F921040091010000F9A19740F9A08B40F910FEFF58B00B00F9B18340F9A28F40F9A39340F9E40301AAE10300AAA08740F9E80311AA102281D2106CA0F2100EC0F2B00F00F9113988D27189A0F23100C0F2330240F93FFE9FC8BD07009100013FD60F3988D26F89A0F22F00C0F2E17D5FC8610000B5F3FD03C8A3FFFF35BF3B03D5C10000B4101280D2F084A0F23000C0F21000E0F200023FD6BD0700D1100080D2B00F00F9B00740F91F0200F1000020D450F9FF58B00700F9BF0F00F9E0031DAAF35344A9FE77C5A8C0035FD6000020D410F8FF58B00700F9102481D2106CA0F2100EC0F2B00F00F9100C80D2106CA0F2100EC0F21000E0F200023FD6
[c58dc5cba243500] jit-backend-dump}
[c58dc5cba2d8400] {jit-backend-dump
BACKEND arm
SYS_EXECUTABLE ??
CODE_DUMP @7003600a0c +0 21010054
[c58dc5cba2f9d00] jit-backend-dump}
[c58dc5cba650880] {jit-backend-addr
Loop -1 () has address 0x7003600950 to 0x7003600a30 (bootstrap 0x7003600940)
gc table: 0x7003600930
function: 0x7003600940
resops: 0x7003600950
failures: 0x7003600a30
end: 0x7003600a5c
[c58dc5cba663f80] jit-backend-addr}
x0 = 3998244656
x2 = 624799463
x3 = 4219456146
x4 = 165451004
[c58dc5cc748db00] {jit-mem-looptoken-alloc
allocating Loop # -1
[c58dc5cc7497b00] jit-mem-looptoken-alloc}
[c58dc5cc7e04680] {jit-backend-dump
BACKEND arm
SYS_EXECUTABLE ??
CODE_DUMP @7003600aa0 +0 00000000000000000000000000000000FE77BBA9F35304A9E10F00F9FD0300AA00D890D26023A0F20000CCF2010040F921040091010000F950FEFF58B00B00F9FFC300D1B0B340F9F00300F9B0B740F9F00700F9B0BB40F9F00B00F9B0BF40F9F00F00F9B0C740F9F01300F9B18340F9A08740F9A18B40F9A28F40F9A39340F9A49740F9A59B40F9A6A340F9A7AF40F9A09F40FDA1A740FDA2AB40FDA3C340FDA4CB40FDE80311AA105081D2106CA0F2100EC0F2B00F00F9113988D27189A0F23100C0F2330240F93FFE9FC8BD07009100013FD6FFC300910F3988D26F89A0F22F00C0F2E17D5FC8610000B5F3FD03C8A3FFFF35BF3B03D5C10000B4101280D2F084A0F23000C0F21000E0F200023FD6BD0700D1100080D2B00F00F9B00740F91F0200F1000020D410F7FF58B00700F9BF0F00F9E0031DAAF35344A9FE77C5A8C0035FD6000020D4D0F5FF58B00700F9105281D2106CA0F2100EC0F2B00F00F9100C80D2106CA0F2100EC0F21000E0F200023FD6
[c58dc5cc82e6480] jit-backend-dump}
[c58dc5cc8387e80] {jit-backend-dump
BACKEND arm
SYS_EXECUTABLE ??
CODE_DUMP @7003600bc4 +0 21010054
[c58dc5cc83ac280] jit-backend-dump}
[c58dc5cc87cad80] {jit-backend-addr
Loop -1 () has address 0x7003600ac0 to 0x7003600be8 (bootstrap 0x7003600ab0)
gc table: 0x7003600aa0
function: 0x7003600ab0
resops: 0x7003600ac0
failures: 0x7003600be8
end: 0x7003600c14
[c58dc5cc87e0d00] jit-backend-addr}
x3 = 2680125463
x6 = -348253744847.038208
x8 = -10334326339.404753
x9 = 245907917194.907410
x10 = 4178897471
x11 = 3829224532
x13 = 117
x14 = 0
x15 = -170255277941.966797
x17 = 228803711161.628235
builder: rpython-macos-arm64 build #263
test: jit/backend/aarch64/test/test_runner/py/TestARM64/()/test_call_release_gil_variable_function_and_arguments