[Flang] Ported test_symbols to Python
authorIvan Zhechev <ivan.zhechev@arm.com>
Mon, 9 Aug 2021 14:44:27 +0000 (15:44 +0100)
committerKiran Chandramohan <kiran.chandramohan@arm.com>
Mon, 9 Aug 2021 15:20:06 +0000 (16:20 +0100)
Due to unavailability of Flang testing on Windows, the shell scripts
are being ported to Python. The following changes are being made in
this patch: removed test_symbols.sh and common.sh, and ported them
to Python. Changes to the tests themselves so that they use the
python scripts instead of the shell script.

Reviewed By: Meinersbur, awarzynski, kiranchandramohan

Differential Revision: https://reviews.llvm.org/D107041

45 files changed:
flang/test/Semantics/OpenACC/acc-symbols01.f90
flang/test/Semantics/common.py [new file with mode: 0755]
flang/test/Semantics/kinds01.f90
flang/test/Semantics/kinds03.f90
flang/test/Semantics/omp-do-schedule03.f90
flang/test/Semantics/omp-do-schedule04.f90
flang/test/Semantics/omp-do01-positivecase.f90
flang/test/Semantics/omp-do04-positivecase.f90
flang/test/Semantics/omp-do05-positivecase.f90
flang/test/Semantics/omp-do06-positivecases.f90
flang/test/Semantics/omp-do11.f90
flang/test/Semantics/omp-do12.f90
flang/test/Semantics/omp-do14.f90
flang/test/Semantics/omp-do17.f90
flang/test/Semantics/omp-reduction08.f90
flang/test/Semantics/omp-reduction09.f90
flang/test/Semantics/omp-symbol01.f90
flang/test/Semantics/omp-symbol02.f90
flang/test/Semantics/omp-symbol03.f90
flang/test/Semantics/omp-symbol04.f90
flang/test/Semantics/omp-symbol05.f90
flang/test/Semantics/omp-symbol06.f90
flang/test/Semantics/omp-symbol07.f90
flang/test/Semantics/omp-symbol08.f90
flang/test/Semantics/procinterface01.f90
flang/test/Semantics/symbol01.f90
flang/test/Semantics/symbol02.f90
flang/test/Semantics/symbol03.f90
flang/test/Semantics/symbol05.f90
flang/test/Semantics/symbol06.f90
flang/test/Semantics/symbol07.f90
flang/test/Semantics/symbol08.f90
flang/test/Semantics/symbol09.f90
flang/test/Semantics/symbol10.f90
flang/test/Semantics/symbol11.f90
flang/test/Semantics/symbol12.f90
flang/test/Semantics/symbol13.f90
flang/test/Semantics/symbol14.f90
flang/test/Semantics/symbol15.f90
flang/test/Semantics/symbol16.f90
flang/test/Semantics/symbol17.f90
flang/test/Semantics/symbol18.f90
flang/test/Semantics/symbol19.f90
flang/test/Semantics/test_symbols.py [new file with mode: 0755]
flang/test/Semantics/test_symbols.sh [deleted file]

index f08317a..8e07f8d 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/../test_symbols.sh %s %t %flang_fc1 -fopenacc
-! REQUIRES: shell
+! RUN: %python %S/../test_symbols.py %s %flang_fc1 -fopenacc
 
 !DEF: /mm MainProgram
 program mm
diff --git a/flang/test/Semantics/common.py b/flang/test/Semantics/common.py
new file mode 100755 (executable)
index 0000000..14323f4
--- /dev/null
@@ -0,0 +1,44 @@
+"""Provides common functionality to the test scripts."""
+
+import os
+import sys
+from pathlib import Path
+
+def set_source(source):
+    """Checks whether the source file exists and returns its path."""
+    if not Path(source).is_file():
+        die(source)
+    return Path(source)
+
+def set_executable(executable):
+    """Checks whether a Flang executable has been set and returns its path."""
+    flang_fc1 = Path(executable)
+    if not flang_fc1.is_file():
+        die(flang_fc1)
+    return str(flang_fc1)
+
+def set_temp(tmp):
+    """Sets a temporary directory or creates one if it doesn't exist."""
+    os.makedirs(Path(tmp), exist_ok=True)
+    return Path(tmp)
+
+def die(file=None):
+    """Used in other functions."""
+    if file is None:
+        print(f"{sys.argv[0]}: FAIL")
+    else:
+        print(f"{sys.argv[0]}: File not found: {file}")
+    sys.exit(1)
+
+def check_args(args):
+    """Verifies that 2 arguments have been passed."""
+    if len(args) < 3:
+        print(f"Usage: {args[0]} <fortran-source> <flang-command>")
+        sys.exit(1)
+
+def check_args_long(args):
+    """Verifies that 3 arguments have been passed."""
+    if len(args) < 4:
+        print(f"Usage: {args[0]} <fortran-source> <temp-test-dir> <flang-command>")
+        sys.exit(1)
+
index ef6edfb..5238a90 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1
  !DEF: /MainProgram1/jk1 ObjectEntity INTEGER(1)
  integer(kind=1) jk1
  !DEF: /MainProgram1/js1 ObjectEntity INTEGER(1)
index cd81b28..58a41a7 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1
  !DEF: /MainProgram1/ipdt DerivedType
  !DEF: /MainProgram1/ipdt/k TypeParam INTEGER(4)
  type :: ipdt(k)
index 1f74454..4b5fb02 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Schedule Clause
 ! Test that does not catch non constant integer expressions like xx - xx.
index b3fcd65..05daa05 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Schedule Clause
 ! Test that does not catch non constant integer expressions like xx - yy.
index f77104d..a810f93 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Loop Construct
 ! The loop iteration variable may not appear in a firstprivate directive.
index c9ef677..5a549a8 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Do Loop Constructs
 
index 1886da9..9de1337 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Loop Construct restrictions on single directive.
 ! A positive case
index 5cb8268..0705710 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Loop Construct
 ! The ordered clause must be present on the loop construct if any ordered
index f5e8000..c12eb1c 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Do Loop Constructs
 
index 264eb15..36ba685 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Do Loop constructs.
 
index f49a29f..87e6f72 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Do Loop constructs.
 
index fb23176..0b1245e 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Do Loop constructs.
 
index 1e6c56d..e46585a 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.3.6 Reduction Clause Positive cases
 
index e93699f..e1ca4b0 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.3.6 Reduction Clause Positive cases.
 !DEF: /omp_reduction MainProgram
index 377af74..06d5d7c 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1 -fopenmp
 
 ! Test clauses that accept list.
 ! 2.1 Directive Format
index 3504701..de36505 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1 -fopenmp
 
 ! 1.4.1 Structure of the OpenMP Memory Model
 
index 33dfe27..4c37c5a 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1 -fopenmp
 
 ! 1.4.1 Structure of the OpenMP Memory Model
 ! In the inner OpenMP region, SHARED `a` refers to the `a` in the outer OpenMP
index 0f18b8b..cf892a9 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1 -fopenmp
 
 ! 2.15.3 Data-Sharing Attribute Clauses
 ! Both PARALLEL and DO (worksharing) directives need to create new scope,
index 50e1d91..72be56f 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1 -fopenmp
 
 ! 2.15.2 threadprivate Directive
 ! The threadprivate directive specifies that variables are replicated,
index 5a8325d..5b6621f 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1 -fopenmp
 
 ! 2.15.3 Data-Sharing Attribute Clauses
 ! A list item that specifies a given variable may not appear in more than
index f333e57..0d88276 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1 -fopenmp
 
 ! Generic tests
 !   1. subroutine or function calls should not be fixed for DSA or DMA
index 4fd01e7..25b49ee 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1 -fopenmp
 
 ! 2.15.1.1 Predetermined rules for associated do-loops index variable
 !   a) The loop iteration variable(s) in the associated do-loop(s) of a do,
index 3e794b1..7fc3c75 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1
 ! Tests for "proc-interface" semantics.
 ! These cases are all valid.
 
index 359c183..9fc64e1 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1
 ! Test that intent-stmt and subprogram prefix and suffix are resolved.
 
 !DEF: /m Module
index b266e70..e3f76c7 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1
 ! Test host association in module subroutine and internal subroutine.
 
 !DEF: /m Module
index eb7d4b3..d132747 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1
 ! Test host association in internal subroutine of main program.
 
 !DEF: /main MainProgram
index facaef5..442bd19 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1
 ! Explicit and implicit entities in blocks
 
 !DEF: /s1 (Subroutine) Subprogram
index 1faa177..bbd6d4d 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1
 !DEF: /main MainProgram
 program main
  !DEF: /main/t1 DerivedType
index b4cfbcc..f3cc934 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1
 !DEF: /main MainProgram
 program main
  implicit complex(z)
index fe2c40b..61dab79 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1
 !DEF: /main MainProgram
 program main
  !DEF: /main/x POINTER ObjectEntity REAL(4)
index 95a1421..0b49f45 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1
 !DEF: /s1 (Subroutine) Subprogram
 subroutine s1
  !DEF: /s1/a ObjectEntity REAL(4)
index ea36678..ba1f5ab 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1
 !DEF: /m1 Module
 module m1
 contains
index ebdf65f..b3e6e26 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1
 !DEF: /s1 (Subroutine) Subprogram
 subroutine s1
  implicit none
index ee165cf..bada819 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1
 ! Verify that SAVE attribute is propagated by EQUIVALENCE
 
 !DEF: /s1 (Subroutine) Subprogram
index 17bd99e..9a3395e 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1
 ! Old-style "*length" specifiers (R723)
 
 !DEF: /f1 (Function) Subprogram CHARACTER(1_8,1)
index 037db56..611c43a 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1
 ! "Bare" uses of type parameters and components
 
  !DEF: /MainProgram1/t1 DerivedType
index ff534ba..97dc50a 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1
 ! Forward references in pointer initializers and TBP bindings.
 
 !DEF: /m Module
index ea198b0..b710bc6 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1
 ! Statement functions
 
 !DEF: /p1 MainProgram
index 0b6b930..434f124 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1
 ! Forward references to derived types (non-error cases)
 
 !DEF: /main MainProgram
index 44fdcd5..a37792b 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1
 
 ! Intrinsic function in type declaration statement: type is ignored
 
index d8f4cd5..541c5cc 100644 (file)
@@ -1,5 +1,4 @@
-! RUN: %S/test_symbols.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_symbols.py %s %flang_fc1
 
 ! Test that a procedure is only implicitly resolved as an intrinsic function
 ! (resp. subroutine) if this is a function (resp. subroutine)
diff --git a/flang/test/Semantics/test_symbols.py b/flang/test/Semantics/test_symbols.py
new file mode 100755 (executable)
index 0000000..2ca2301
--- /dev/null
@@ -0,0 +1,59 @@
+#!/usr/bin/env python3
+
+"""Compiles a source file with "-fdebug-unparse-with-symbols' and verifies
+we get the right symbols in the output, i.e. the output should be
+the same as the input, except for the copyright comment.
+Expects a source file passed as the first argument;
+Expects the Flang frontdriver with options as second argument."""
+
+import sys
+import re
+import subprocess
+import common as cm
+
+from difflib import unified_diff
+
+cm.check_args(sys.argv)
+src = cm.set_source(sys.argv[1])
+diff1 = ""
+diff2 = ""
+
+flang_fc1 = cm.set_executable(sys.argv[2])
+flang_fc1_args = sys.argv[3:]
+flang_fc1_options = "-fdebug-unparse-with-symbols"
+
+# Strips out blank lines and all comments except for "!DEF:", "!REF:", "!$acc" and "!$omp"
+with open(src, 'r') as text_in:
+    for line in text_in:
+        text = re.sub(r"!(?![DR]EF:|\$omp|\$acc).*", "", line)
+        text = re.sub(r"^\s*$", "", text)
+        diff1 += text
+
+# Strips out "!DEF:" and "!REF:" comments
+for line in diff1:
+    text = re.sub(r"![DR]EF:.*", "", line)
+    diff2 += text
+
+# Compiles, inserting comments for symbols:
+cmd = [flang_fc1, *flang_fc1_args, flang_fc1_options]
+diff3 = subprocess.check_output(cmd, input=diff2, universal_newlines=True)
+
+# Removes all whitespace to compare differences in files
+diff1 = diff1.replace(" ", "")
+diff3 = diff3.replace(" ", "")
+diff_check = ""
+
+# Compares the input with the output
+for line in unified_diff(diff1, diff3, n=999999,
+                         fromfile="Expected output", tofile="Actual output"):
+    diff_check += line
+
+if diff_check != "":
+    print(diff_check.replace(" ", ""))
+    print()
+    print("FAIL")
+    sys.exit(1)
+else:
+    print()
+    print("PASS")
+
diff --git a/flang/test/Semantics/test_symbols.sh b/flang/test/Semantics/test_symbols.sh
deleted file mode 100755 (executable)
index 56337c2..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/usr/bin/env bash
-# Compile a source file with '-fdebug-unparse-with-symbols' and verify
-# we get the right symbols in the output, i.e. the output should be
-# the same as the input, except for the copyright comment.
-# Change the frontend driver by setting the FLANG_FC1 environment variable.
-
-FLANG_FC1_OPTIONS="-fdebug-unparse-with-symbols"
-srcdir=$(dirname $0)
-source $srcdir/common.sh
-[[ ! -f $src ]] && echo "File not found: $src" && exit 1
-
-src1=$temp/1.f90
-src2=$temp/2.f90
-src3=$temp/3.f90
-diffs=$temp/diffs
-
-# Strip out blank lines and all comments except "!DEF:", "!REF:", and "!$omp"
-sed -e 's/!\([DR]EF:\)/KEEP \1/' -e 's/!\($omp\)/KEEP \1/' \
-  -e 's/!\($acc\)/KEEP \1/' -e 's/!.*//' -e 's/ *$//' -e '/^$/d' \
-  -e 's/KEEP \([DR]EF:\)/!\1/' -e 's/KEEP \($omp\)/!\1/' \
-  -e 's/KEEP \($acc\)/!\1/' \
-  $src > $src1
-egrep -v '![DR]EF:' $src1 > $src2  # strip out DEF and REF comments
-# compile, inserting comments for symbols:
-( cd $temp; $FLANG_FC1 $FLANG_FC1_OPTIONS $(basename $src2) ) > $src3
-
-if diff -w -U999999 $src1 $src3 > $diffs; then
-  echo PASS
-else
-  sed '1,/^\@\@/d' $diffs
-  echo
-  echo FAIL
-  exit 1
-fi