xref: /aosp_15_r20/external/mesa3d/src/intel/compiler/tests/run-test.py (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1#!/usr/bin/env python3
2
3import argparse
4import difflib
5import errno
6import os
7import pathlib
8import subprocess
9import sys
10
11# The meson version handles windows paths better, but if it's not available
12# fall back to shlex
13try:
14    from meson.mesonlib import split_args
15except ImportError:
16    from shlex import split as split_args
17
18parser = argparse.ArgumentParser()
19parser.add_argument('--brw_asm',
20                    help='path to brw_asm binary')
21parser.add_argument('--gen_name',
22                    help='name of the hardware generation (as understood by brw_asm)')
23parser.add_argument('--gen_folder',
24                    type=pathlib.Path,
25                    help='name of the folder for the generation')
26args = parser.parse_args()
27
28wrapper = os.environ.get('MESON_EXE_WRAPPER')
29if wrapper is not None:
30    brw_asm = split_args(wrapper) + [args.brw_asm]
31else:
32    brw_asm = [args.brw_asm]
33
34if not args.gen_folder.is_dir():
35    print('Test files path does not exist or is not a directory.',
36          file=sys.stderr)
37    exit(99)
38
39success = True
40
41for asm_file in args.gen_folder.glob('*.asm'):
42    expected_file = asm_file.stem + '.expected'
43    expected_path = args.gen_folder / expected_file
44
45    try:
46        command = brw_asm + [
47            '--type', 'hex',
48            '--gen', args.gen_name,
49            asm_file
50        ]
51        with subprocess.Popen(command,
52                              stdout=subprocess.PIPE,
53                              stderr=subprocess.DEVNULL) as cmd:
54            lines_after = [line.decode('ascii') for line in cmd.stdout.readlines()]
55    except OSError as e:
56        if e.errno == errno.ENOEXEC:
57            print('Skipping due to inability to run host binaries.',
58                  file=sys.stderr)
59            exit(77)
60        raise
61
62    with expected_path.open() as f:
63        lines_before = f.readlines()
64
65    diff = ''.join(difflib.unified_diff(lines_before, lines_after,
66                                        expected_file, asm_file.stem + '.out'))
67
68    if diff:
69        print('Output comparison for {}:'.format(asm_file.name))
70        print(diff)
71        success = False
72    else:
73        print('{} : PASS'.format(asm_file.name))
74
75if not success:
76    exit(1)
77