99 lines · python
1#!/usr/bin/env python32 3"""Compiles a source file and compares generated .mod files against expected.4 5Parameters:6 sys.argv[1]: a source file with contains the input and expected output7 sys.argv[2]: the Flang frontend driver8 sys.argv[3:]: Optional arguments to the Flang frontend driver"""9 10import sys11import re12import os13import tempfile14import subprocess15import glob16import common as cm17 18from pathlib import Path19from difflib import unified_diff20 21cm.check_args_long(sys.argv)22srcdir = Path(sys.argv[1])23sources = list(glob.iglob(str(srcdir)))24sources = sorted(sources)25diffs = ""26 27flang_fc1 = cm.set_executable(sys.argv[2])28flang_fc_args = sys.argv[3:]29flang_fc1_options = "-fsyntax-only"30 31with tempfile.TemporaryDirectory() as tmpdir:32 for src in sources:33 src = Path(src).resolve()34 actual = ""35 expect = ""36 expected_files = set()37 actual_files = set()38 39 if not src.is_file():40 cm.die(src)41 42 prev_files = set(os.listdir(tmpdir))43 cmd = [flang_fc1, *flang_fc_args, flang_fc1_options, str(src)]44 proc = subprocess.check_output(45 cmd, stderr=subprocess.PIPE, universal_newlines=True, cwd=tmpdir46 )47 actual_files = set(os.listdir(tmpdir)).difference(prev_files)48 49 # The first 3 bytes of the files are an UTF-8 BOM50 with open(src, "r", encoding="utf-8", errors="strict") as f:51 for line in f:52 m = re.search(r"^!Expect: (.*)", line)53 if m:54 expected_files.add(m.group(1))55 56 extra_files = actual_files.difference(expected_files)57 if extra_files:58 print(f"Unexpected .mod files produced: {extra_files}")59 sys.exit(1)60 61 for mod in expected_files:62 mod = Path(tmpdir).joinpath(mod)63 if not mod.is_file():64 print(f"Compilation did not produce expected mod file: {mod}")65 sys.exit(1)66 with open(mod, "r", encoding="utf-8", errors="strict") as f:67 for line in f:68 if "!mod$" in line or "!need$" in line:69 continue70 actual += line71 72 with open(src, "r", encoding="utf-8", errors="strict") as f:73 for line in f:74 if f"!Expect: {mod.name}" in line:75 for line in f:76 if re.match(r"^$", line):77 break78 m = re.sub(r"^!", "", line.lstrip())79 expect += m80 81 diffs = "\n".join(82 unified_diff(83 actual.replace(" ", "").split("\n"),84 expect.replace(" ", "").split("\n"),85 fromfile=mod.name,86 tofile="Expect",87 n=999999,88 )89 )90 91 if diffs != "":92 print(diffs)93 print()94 print("FAIL")95 sys.exit(1)96 97print()98print("PASS")99