diff --git a/src/compiler/spirv/tests/spirv-to-c-array.py b/src/compiler/spirv/tests/spirv-to-c-array.py new file mode 100755 index 00000000000..c071aba8f56 --- /dev/null +++ b/src/compiler/spirv/tests/spirv-to-c-array.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 + +import argparse +import filecmp +import os +import struct +import subprocess +import tempfile +import sys + +p = argparse.ArgumentParser(usage="%(prog)s SOURCE [-- [EXTRA_FLAGS ...]]") +p.add_argument('SOURCE', + help='SPIR-V assembly source filename') +p.add_argument('EXTRA_FLAGS', + help='extra flags passed to spirv-as, e.g. --target-env spv1.0', + nargs=argparse.REMAINDER) +args = p.parse_args() +source = args.SOURCE + +fd, generated = tempfile.mkstemp(prefix="spirv-to-c-array.", suffix=".spv") +os.close(fd) + +assembler_cmd = ['spirv-as'] + args.EXTRA_FLAGS + +ret = subprocess.run(assembler_cmd + ['-o', generated, source]) + +if ret.returncode != 0: + print(f'Failed to assemble {source}, see error above.') + sys.exit(1) + +if os.path.getsize(generated) == 0: + print(f'Failed to assemble {source}. Output {generated} is empty.') + sys.exit(1) + +if (os.path.getsize(generated) % 4) != 0: + print(f'Failed to assemble {source}. Output {generated} size is not multiple of 4 bytes.') + sys.exit(1) + +ret = subprocess.run(['spirv-dis', '--raw-id', generated], capture_output=True) +if ret.returncode != 0: + print(ret.stderr.decode('ascii')) + print(f'Something is wrong: assembled binary {generated} ') + print('failed to disassemble for checking.') + sys.exit(1) + +disassembled_source = ret.stdout + +generated_check = os.path.splitext(generated)[0] + '.check.spv' + +ret = subprocess.run(assembler_cmd + ['-o', generated_check], + input=disassembled_source, capture_output=True) +if ret.returncode != 0: + print(ret.stderr.decode('ascii')) + print(f'Something is wrong: assembled binary {generated} ') + print('failed to reassemble for checking.') + sys.exit(1) + +if not filecmp.cmp(generated, generated_check, shallow=False): + print('Something is wrong: assembled binary generated ') + print('does not match after round trip of using disassembler ') + print('and assembler again. See files:') + print() + print(f' {generated}') + print(f' {generated_check}') + print() + print(f'Extra arguments for spirv-as {" ".join(args.EXTRA_FLAGS)}') + sys.exit(1) + +with open(source, 'r') as f: + source_lines = f.readlines() + +words = [] +with open(generated, 'rb') as f: + while True: + w = f.read(4) + if not w: + break + v = struct.unpack('