| #!/usr/bin/env python3 |
| """A script to generate FileCheck statements for Fortran runtime funcs. |
| |
| This script can be used to update |
| flang/test/Transforms/verify-known-runtime-functions.fir |
| whenever new recognized Fortran runtime functions are added |
| into flang/Optimizer/Transforms/RuntimeFunctions.inc |
| or any of the recognized functions changes its signature. |
| """ |
| |
| # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| # See https://llvm.org/LICENSE.txt for license information. |
| # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| |
| import argparse |
| import os |
| import re |
| import sys |
| |
| ADVERT_BEGIN = "// NOTE: Assertions have been autogenerated by " |
| ADVERT_END = """ |
| // The script allows updating Flang LIT test |
| // flang/test/Transforms/verify-known-runtime-functions.fir, |
| // which is intended to verify signatures of Fortran runtime |
| // functions recognized in flang/Optimizer/Transforms/RuntimeFunctions.inc |
| // table. If new function is added into the table or |
| // an existing function changes its signature, |
| // the SetRuntimeCallAttributesPass may need to be updated |
| // to properly handle it. Once the pass is verified to work, |
| // one can update this test using the following output: |
| // echo "module {}" | fir-opt --gen-runtime-calls-for-test | \\ |
| // generate-checks-for-runtime-funcs.py |
| """ |
| |
| CHECK_RE_STR = "func.func.*@_Fortran.*" |
| CHECK_RE = re.compile(CHECK_RE_STR) |
| |
| CHECK_NOT_STR = "// CHECK-NOT: func.func" |
| CHECK_STR = "// CHECK:" |
| CHECK_NEXT_STR = "// CHECK-NEXT:" |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser( |
| description=__doc__, formatter_class=argparse.RawTextHelpFormatter |
| ) |
| parser.add_argument( |
| "input", nargs="?", type=argparse.FileType("r"), default=sys.stdin |
| ) |
| args = parser.parse_args() |
| input_lines = [l.rstrip() for l in args.input] |
| args.input.close() |
| |
| repo_path = os.path.join(os.path.dirname(__file__), "..", "..", "..") |
| script_name = os.path.relpath(__file__, repo_path) |
| autogenerated_note = ADVERT_BEGIN + script_name + "\n" + ADVERT_END |
| |
| output = sys.stdout |
| output.write(autogenerated_note + "\n") |
| |
| output_lines = [] |
| output_lines.append(CHECK_NOT_STR) |
| check_prefix = CHECK_STR |
| for input_line in input_lines: |
| if not input_line: |
| continue |
| |
| m = CHECK_RE.match(input_line.lstrip()) |
| if m: |
| output_lines.append(check_prefix + " " + input_line.lstrip()) |
| check_prefix = CHECK_NEXT_STR |
| |
| output_lines.append(CHECK_NOT_STR) |
| for line in output_lines: |
| output.write(line + "\n") |
| |
| output.close() |
| |
| |
| if __name__ == "__main__": |
| main() |