File: test_compact_ids.py

package info (click to toggle)
spirv-tools 2025.5-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 28,588 kB
  • sloc: cpp: 470,407; javascript: 5,893; python: 3,326; ansic: 488; sh: 450; ruby: 88; makefile: 18; lisp: 9
file content (100 lines) | stat: -rw-r--r-- 2,983 bytes parent folder | download | duplicates (13)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#!/usr/bin/env python3
# Copyright (c) 2017 Google Inc.

# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Tests correctness of opt pass tools/opt --compact-ids."""

import os.path
import sys
import tempfile

def test_spirv_file(path, temp_dir):
  optimized_spv_path = os.path.join(temp_dir, 'optimized.spv')
  optimized_dis_path = os.path.join(temp_dir, 'optimized.dis')
  converted_spv_path = os.path.join(temp_dir, 'converted.spv')
  converted_dis_path = os.path.join(temp_dir, 'converted.dis')

  os.system('tools/spirv-opt ' + path + ' -o ' + optimized_spv_path +
            ' --compact-ids')
  os.system('tools/spirv-dis ' + optimized_spv_path + ' -o ' +
            optimized_dis_path)

  os.system('tools/spirv-dis ' + path + ' -o ' + converted_dis_path)
  os.system('tools/spirv-as ' + converted_dis_path + ' -o ' +
            converted_spv_path)
  os.system('tools/spirv-dis ' + converted_spv_path + ' -o ' +
            converted_dis_path)

  with open(converted_dis_path, 'r') as f:
    converted_dis = f.readlines()[3:]

  with open(optimized_dis_path, 'r') as f:
    optimized_dis = f.readlines()[3:]

  return converted_dis == optimized_dis

def print_usage():
  template= \
"""{script} tests correctness of opt pass tools/opt --compact-ids

USAGE: python3 {script} [<spirv_files>]

Requires tools/spirv-dis, tools/spirv-as and tools/spirv-opt to be in path
(call the script from the SPIRV-Tools build output directory).

TIP: In order to test all .spv files under current dir use
find <path> -name "*.spv" -print0 | xargs -0 -s 2000000 python {script}
"""
  print(template.format(script=sys.argv[0]));

def main():
  if not os.path.isfile('tools/spirv-dis'):
      print('error: tools/spirv-dis not found')
      print_usage()
      exit(1)

  if not os.path.isfile('tools/spirv-as'):
      print('error: tools/spirv-as not found')
      print_usage()
      exit(1)

  if not os.path.isfile('tools/spirv-opt'):
      print('error: tools/spirv-opt not found')
      print_usage()
      exit(1)

  paths = sys.argv[1:]
  if not paths:
      print_usage()

  num_failed = 0

  temp_dir = tempfile.mkdtemp()

  for path in paths:
    success = test_spirv_file(path, temp_dir)
    if not success:
      print('Test failed for ' + path)
      num_failed += 1

  print('Tested ' + str(len(paths)) + ' files')

  if num_failed:
    print(str(num_failed) + ' tests failed')
    exit(1)
  else:
    print('All tests successful')
    exit(0)

if __name__ == '__main__':
  main()