brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.0 KiB · 0e7806f Raw
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