[libcxx-commits] [libcxx] 38a9528 - [libc++] NFC: Expose a top-level parseScript function in the new format

Louis Dionne via libcxx-commits libcxx-commits at lists.llvm.org
Fri Apr 24 13:56:24 PDT 2020


Author: Louis Dionne
Date: 2020-04-24T16:55:38-04:00
New Revision: 38a9528ca238c7034b4d8f4c30e0357f2cd71fda

URL: https://github.com/llvm/llvm-project/commit/38a9528ca238c7034b4d8f4c30e0357f2cd71fda
DIFF: https://github.com/llvm/llvm-project/commit/38a9528ca238c7034b4d8f4c30e0357f2cd71fda.diff

LOG: [libc++] NFC: Expose a top-level parseScript function in the new format

Added: 
    

Modified: 
    libcxx/utils/libcxx/test/newformat.py

Removed: 
    


################################################################################
diff  --git a/libcxx/utils/libcxx/test/newformat.py b/libcxx/utils/libcxx/test/newformat.py
index d9d2a5073b40..2ee6e502da6d 100644
--- a/libcxx/utils/libcxx/test/newformat.py
+++ b/libcxx/utils/libcxx/test/newformat.py
@@ -13,6 +13,97 @@
 import re
 import subprocess
 
+def _supportsVerify(test):
+    """
+    Determine whether clang-verify is supported for that test.
+
+    This is done by checking whether the %{cxx} substitution supports certain
+    compiler flags.
+    """
+    command = "%{{cxx}} -xc++ {} -Werror -fsyntax-only -Xclang -verify-ignore-unexpected".format(os.devnull)
+    command = lit.TestRunner.applySubstitutions([command], test.config.substitutions,
+                                                recursion_limit=test.config.recursiveExpansionLimit)[0]
+    devNull = open(os.devnull, 'w')
+    result = subprocess.call(command, shell=True, stdout=devNull, stderr=devNull)
+    return result == 0
+
+def parseScript(test, preamble, fileDependencies):
+    """
+    Extract the script from a test, with substitutions applied.
+
+    Returns a list of commands ready to be executed.
+
+    - test
+        The lit.Test to parse.
+
+    - preamble
+        A list of commands to perform before any command in the test.
+        These commands can contain unexpanded substitutions, but they
+        must not be of the form 'RUN:' -- they must be proper commands
+        once substituted.
+
+    - fileDependencies
+        A list of additional file dependencies for the test.
+    """
+
+    # Get the default substitutions
+    tmpDir, tmpBase = lit.TestRunner.getTempPaths(test)
+    useExternalSh = True
+    substitutions = lit.TestRunner.getDefaultSubstitutions(test, tmpDir, tmpBase,
+                                                           normalize_slashes=useExternalSh)
+
+    # Add the %{build} and %{run} convenience substitutions
+    substitutions.append(('%{build}', '%{cxx} %s %{flags} %{compile_flags} %{link_flags} -o %t.exe'))
+    substitutions.append(('%{run}', '%{exec} %t.exe'))
+
+    # Add the %{verify} substitution and the verify-support feature if Clang-verify is supported
+    if _supportsVerify(test):
+        test.config.available_features.add('verify-support')
+        substitutions.append(('%{verify}', '-Xclang -verify -Xclang -verify-ignore-unexpected=note -ferror-limit=0'))
+
+    # Parse the test file, including custom directives
+    additionalCompileFlags = []
+    fileDependencies = list(fileDependencies)
+    parsers = [
+        lit.TestRunner.IntegratedTestKeywordParser('FILE_DEPENDENCIES:',
+                                                   lit.TestRunner.ParserKind.LIST,
+                                                   initial_value=fileDependencies),
+        lit.TestRunner.IntegratedTestKeywordParser('ADDITIONAL_COMPILE_FLAGS:',
+                                                   lit.TestRunner.ParserKind.LIST,
+                                                   initial_value=additionalCompileFlags)
+    ]
+
+    script = list(preamble)
+    parsed = lit.TestRunner.parseIntegratedTestScript(test, additional_parsers=parsers,
+                                                            require_script=not script)
+    if isinstance(parsed, lit.Test.Result):
+        return parsed
+    script += parsed
+
+    # Add compile flags specified with ADDITIONAL_COMPILE_FLAGS.
+    substitutions = [(s, x + ' ' + ' '.join(additionalCompileFlags)) if s == '%{compile_flags}'
+                            else (s, x) for (s, x) in substitutions]
+
+    # Perform substitutions inside FILE_DEPENDENCIES lines (or injected dependencies).
+    # This allows using variables like %t in file dependencies. Also note that we really
+    # need to resolve %{file_dependencies} now, because otherwise we won't be able to
+    # make all paths absolute below.
+    fileDependencies = lit.TestRunner.applySubstitutions(fileDependencies, substitutions,
+                                                         recursion_limit=test.config.recursiveExpansionLimit)
+
+    # Add the %{file_dependencies} substitution before we perform substitutions
+    # inside the script.
+    testDir = os.path.dirname(test.getSourcePath())
+    fileDependencies = [f if os.path.isabs(f) else os.path.join(testDir, f) for f in fileDependencies]
+    substitutions.append(('%{file_dependencies}', ' '.join(map(pipes.quote, fileDependencies))))
+
+    # Perform substitutions in the script itself.
+    script = lit.TestRunner.applySubstitutions(script, substitutions,
+                                               recursion_limit=test.config.recursiveExpansionLimit)
+
+    return script
+
+
 class CxxStandardLibraryTest(lit.formats.TestFormat):
     """
     Lit test format for the C++ Standard Library conformance test suite.
@@ -148,15 +239,6 @@ def _checkBaseSubstitutions(self, substitutions):
         for s in ['%{cxx}', '%{compile_flags}', '%{link_flags}', '%{flags}', '%{exec}']:
             assert s in substitutions, "Required substitution {} was not provided".format(s)
 
-    # Determine whether clang-verify is supported.
-    def _supportsVerify(self, test):
-        command = "%{{cxx}} -xc++ {} -Werror -fsyntax-only -Xclang -verify-ignore-unexpected".format(os.devnull)
-        command = lit.TestRunner.applySubstitutions([command], test.config.substitutions,
-                                                    recursion_limit=test.config.recursiveExpansionLimit)[0]
-        devNull = open(os.devnull, 'w')
-        result = subprocess.call(command, shell=True, stdout=devNull, stderr=devNull)
-        return result == 0
-
     def _disableWithModules(self, test):
         with open(test.getSourcePath(), 'rb') as f:
             contents = f.read()
@@ -225,7 +307,7 @@ def execute(self, test, litConfig):
         # otherwise it's like a .compile.fail.cpp test. This is only provided
         # for backwards compatibility with the test suite.
         elif filename.endswith('.fail.cpp'):
-            if self._supportsVerify(test):
+            if _supportsVerify(test):
                 steps = [
                     "%dbg(COMPILED WITH) %{cxx} %s %{flags} %{compile_flags} -fsyntax-only %{verify}"
                 ]
@@ -242,87 +324,11 @@ def addCompileFlags(self, config, *flags):
         string = ' '.join(flags)
         config.substitutions = [(s, x + ' ' + string) if s == '%{compile_flags}' else (s, x) for (s, x) in config.substitutions]
 
-    def _parseScript(self, test, preamble, fileDependencies):
-        """
-        Extract the script from a test, with substitutions applied.
-
-        Returns a list of commands ready to be executed.
-
-        - test
-            The lit.Test to parse.
-
-        - preamble
-            A list of commands to perform before any command in the test.
-            These commands can contain unexpanded substitutions, but they
-            must not be of the form 'RUN:' -- they must be proper commands
-            once substituted.
-
-        - fileDependencies
-            A list of additional file dependencies for the test.
-        """
-
-        # Get the default substitutions
-        tmpDir, tmpBase = lit.TestRunner.getTempPaths(test)
-        useExternalSh = True
-        substitutions = lit.TestRunner.getDefaultSubstitutions(test, tmpDir, tmpBase,
-                                                               normalize_slashes=useExternalSh)
-
-        # Add the %{build} and %{run} convenience substitutions
-        substitutions.append(('%{build}', '%{cxx} %s %{flags} %{compile_flags} %{link_flags} -o %t.exe'))
-        substitutions.append(('%{run}', '%{exec} %t.exe'))
-
-        # Add the %{verify} substitution and the verify-support feature if Clang-verify is supported
-        if self._supportsVerify(test):
-            test.config.available_features.add('verify-support')
-            substitutions.append(('%{verify}', '-Xclang -verify -Xclang -verify-ignore-unexpected=note -ferror-limit=0'))
-
-        # Parse the test file, including custom directives
-        additionalCompileFlags = []
-        fileDependencies = list(fileDependencies)
-        parsers = [
-            lit.TestRunner.IntegratedTestKeywordParser('FILE_DEPENDENCIES:',
-                                                       lit.TestRunner.ParserKind.LIST,
-                                                       initial_value=fileDependencies),
-            lit.TestRunner.IntegratedTestKeywordParser('ADDITIONAL_COMPILE_FLAGS:',
-                                                       lit.TestRunner.ParserKind.LIST,
-                                                       initial_value=additionalCompileFlags)
-        ]
-
-        script = list(preamble)
-        parsed = lit.TestRunner.parseIntegratedTestScript(test, additional_parsers=parsers,
-                                                                require_script=not script)
-        if isinstance(parsed, lit.Test.Result):
-            return parsed
-        script += parsed
-
-        # Add compile flags specified with ADDITIONAL_COMPILE_FLAGS.
-        substitutions = [(s, x + ' ' + ' '.join(additionalCompileFlags)) if s == '%{compile_flags}'
-                                else (s, x) for (s, x) in substitutions]
-
-        # Perform substitutions inside FILE_DEPENDENCIES lines (or injected dependencies).
-        # This allows using variables like %t in file dependencies. Also note that we really
-        # need to resolve %{file_dependencies} now, because otherwise we won't be able to
-        # make all paths absolute below.
-        fileDependencies = lit.TestRunner.applySubstitutions(fileDependencies, substitutions,
-                                                             recursion_limit=test.config.recursiveExpansionLimit)
-
-        # Add the %{file_dependencies} substitution before we perform substitutions
-        # inside the script.
-        testDir = os.path.dirname(test.getSourcePath())
-        fileDependencies = [f if os.path.isabs(f) else os.path.join(testDir, f) for f in fileDependencies]
-        substitutions.append(('%{file_dependencies}', ' '.join(map(pipes.quote, fileDependencies))))
-
-        # Perform substitutions in the script itself.
-        script = lit.TestRunner.applySubstitutions(script, substitutions,
-                                                   recursion_limit=test.config.recursiveExpansionLimit)
-
-        return script
-
     def _executeShTest(self, test, litConfig, steps, fileDependencies=None):
         if test.config.unsupported:
             return lit.Test.Result(lit.Test.UNSUPPORTED, 'Test is unsupported')
 
-        script = self._parseScript(test, steps, fileDependencies or [])
+        script = parseScript(test, steps, fileDependencies or [])
         if isinstance(script, lit.Test.Result):
             return script
 


        


More information about the libcxx-commits mailing list