|  | #!/usr/bin/env python | 
|  | # 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: python {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() |