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 0x0000000a1a3ce7c8>
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 'iiiiiiiiiiiiiii'
E x14: got 0L, expected 4486L
jit/backend/test/runner_test.py:3125: AssertionError
---------- Captured stdout call ----------
random seed 4328
Xffffffffffffff
^^^ ^ ^ ^ ^ ^^^
Xufffuuuu
^ ^
Xiiiii
^^^^^^
Xfuufufuffffffffufff
^^ ^ ^ ^
Xufiii
^ ^^^^
Xiuiuiuuiiuiii
^ ^^ ^ ^
Xiiiiiii
^
Xfffiuuii
^ ^
Xfuufiiiiiuiuf
^ ^
Xfufffffffufffuffu
Xiiuf
^ ^
Xifuiuuiuiff
^^^ ^^^^^^^^
Xiiiiiiiiiiiiiii
^^^ ^^^^^^ ^ ^
---------- Captured stderr call ----------
x0 = -183816851866.232483
x1 = -247209152806.263153
x2 = 109176104358.912079
x3 = 176363433956.090240
x4 = -497425707257.403015
x5 = -495013440509.895386
x6 = 374226908952.348206
x7 = -62934328379.322708
x8 = 425994334274.015259
x9 = -401046800361.869995
x10 = -303460836671.050171
x11 = 451569489407.621155
x12 = -348253744847.038208
x13 = 70682503935.105591
x0 = 3557931044
x1 = 458744860327.893738
x2 = -441425834219.623840
x3 = 63671638048.473610
x4 = 2582287518
x5 = 1485829129
x6 = 116129908
x0 = 302263234416.649109
x1 = 724065248
x2 = 1340535893
x3 = -99782167927.975021
x4 = 275706745
x5 = -360361508507.151611
x6 = 1878667322
x7 = 89055681108.041824
x8 = 387105207218.134644
x9 = -335387495920.464478
x10 = -289376372584.546753
x11 = 176189787009.388306
x12 = 305381591392.169922
x13 = 443495789488.567444
x14 = 325033107409.249573
x15 = 3294894299
x16 = 202352314495.764832
x17 = 449773479552.445374
x18 = 198373194137.300079
x1 = -450726895597.914795
x0 = 446364295816
x1 = 1059828720
x2 = -143158249894
x4 = 447319958601
x6 = 3571831925
x7 = -15199037317
x8 = 166435309111
x10 = -451973843484
x11 = 296846187770
x12 = 45294061099
x0 = -113057586904.878464
x1 = 248723548532.851501
x2 = -383914955094.727844
x7 = -434163685240
x0 = -221531426188.983643
x3 = 88454288018.247772
x12 = 498294152150.690002
x0 = -208094380911.927948
x1 = 1253541666
x2 = 94596109966.953979
x3 = -214628393459.018036
x4 = -308357048402.535645
x5 = 423343906266.720886
x6 = 304399878328.535767
x7 = 32579783232.263588
x8 = -476771717178.188416
x9 = 1582879996
x10 = -233166825167.664185
x11 = -496934833200.252747
x12 = -229506993332.194519
x13 = 1589186067
x14 = -150511287120.463531
x15 = -129876389554.989380
x16 = 3954671254
x3 = 401189508346.678650
x1 = 398123608273.941162
x2 = 1760687895
x4 = 1383982105
x5 = 3694266133
x7 = 1389551696
x9 = -153124595775.828491
x10 = -375088909959.162109
x3 = -70252714178
x6 = 150728943714
x7 = -491190009438
x8 = 449365188013
x10 = -186227647186
x11 = 228045925168
x12 = 277666310081
builder: rpython-macos-arm64 build #742*
test: jit/backend/aarch64/test/test_runner.py::TestARM64::()::test_call_release_gil_variable_function_and_arguments