summaryrefslogtreecommitdiffstats
path: root/llvm/utils
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/utils')
-rw-r--r--llvm/utils/lit/lit/Test.py16
-rw-r--r--llvm/utils/lit/lit/TestRunner.py54
-rw-r--r--llvm/utils/lit/lit/run.py20
3 files changed, 39 insertions, 51 deletions
diff --git a/llvm/utils/lit/lit/Test.py b/llvm/utils/lit/lit/Test.py
index dc82670358a..1a9e3fe80fb 100644
--- a/llvm/utils/lit/lit/Test.py
+++ b/llvm/utils/lit/lit/Test.py
@@ -172,7 +172,7 @@ class TestSuite:
return os.path.join(self.source_root, *components)
def getExecPath(self, components):
- return os.path.join(self.exec_root, "Output", *components)
+ return os.path.join(self.exec_root, *components)
class Test:
"""Test - Information on a single test instance."""
@@ -222,13 +222,10 @@ class Test:
# Syntax error in an XFAIL line.
self.result.code = UNRESOLVED
self.result.output = str(e)
-
+
def getFullName(self):
return self.suite.config.name + ' :: ' + '/'.join(self.path_in_suite)
- def getTestBaseName(self):
- return self.path_in_suite[-1]
-
def getFilePath(self):
if self.file_path:
return self.file_path
@@ -237,11 +234,8 @@ class Test:
def getSourcePath(self):
return self.suite.getSourcePath(self.path_in_suite)
- def getTempFilePrefix(self):
- return self.suite.getExecPath(self.path_in_suite) + ".tmp"
-
- def getTempFileDir(self):
- return os.path.dirname(self.getTempFilePrefix())
+ def getExecPath(self):
+ return self.suite.getExecPath(self.path_in_suite)
def isExpectedToFail(self):
"""
@@ -353,7 +347,7 @@ class Test:
safe_name = self.suite.name.replace(".","-")
if safe_test_path:
- class_name = safe_name + "." + "/".join(safe_test_path)
+ class_name = safe_name + "." + "/".join(safe_test_path)
else:
class_name = safe_name + "." + safe_name
diff --git a/llvm/utils/lit/lit/TestRunner.py b/llvm/utils/lit/lit/TestRunner.py
index e72be025308..37b03cc19f8 100644
--- a/llvm/utils/lit/lit/TestRunner.py
+++ b/llvm/utils/lit/lit/TestRunner.py
@@ -123,7 +123,7 @@ class ShellCommandResult(object):
self.exitCode = exitCode
self.timeoutReached = timeoutReached
self.outputFiles = list(outputFiles)
-
+
def executeShCmd(cmd, shenv, results, timeout=0):
"""
Wrapper around _executeShCmd that handles
@@ -501,7 +501,7 @@ def _executeShCmd(cmd, shenv, results, timeoutHelper):
data = None
if data is not None:
output_files.append((name, path, data))
-
+
results.append(ShellCommandResult(
cmd.commands[i], out, err, res, timeoutHelper.timeoutReached(),
output_files))
@@ -573,7 +573,7 @@ def executeScriptInternal(test, litConfig, tmpBase, commands, cwd):
else:
out += data
out += "\n"
-
+
if result.stdout.strip():
out += '# command output:\n%s\n' % (result.stdout,)
if result.stderr.strip():
@@ -690,28 +690,37 @@ def parseIntegratedTestScriptCommands(source_path, keywords):
finally:
f.close()
-def getDefaultSubstitutions(test, normalize_slashes=False):
+def getTempPaths(test):
+ """Get the temporary location, this is always relative to the test suite
+ root, not test source root."""
+ execpath = test.getExecPath()
+ execdir,execbase = os.path.split(execpath)
+ tmpDir = os.path.join(execdir, 'Output')
+ tmpBase = os.path.join(tmpDir, execbase)
+ return tmpDir, tmpBase
+
+def getDefaultSubstitutions(test, tmpDir, tmpBase, normalize_slashes=False):
sourcepath = test.getSourcePath()
sourcedir = os.path.dirname(sourcepath)
- tmpDir = test.getTempFileDir()
- tmpPrefix = test.getTempFilePrefix()
- baseName = test.getTestBaseName()
# Normalize slashes, if requested.
if normalize_slashes:
sourcepath = sourcepath.replace('\\', '/')
sourcedir = sourcedir.replace('\\', '/')
tmpDir = tmpDir.replace('\\', '/')
+ tmpBase = tmpBase.replace('\\', '/')
# We use #_MARKER_# to hide %% while we do the other substitutions.
substitutions = []
substitutions.extend([('%%', '#_MARKER_#')])
substitutions.extend(test.config.substitutions)
+ tmpName = tmpBase + '.tmp'
+ baseName = os.path.basename(tmpBase)
substitutions.extend([('%s', sourcepath),
('%S', sourcedir),
('%p', sourcedir),
('%{pathsep}', os.pathsep),
- ('%t', tmpPrefix),
+ ('%t', tmpName),
('%basename_t', baseName),
('%T', tmpDir),
('#_MARKER_#', '%')])
@@ -721,7 +730,7 @@ def getDefaultSubstitutions(test, normalize_slashes=False):
('%/s', sourcepath.replace('\\', '/')),
('%/S', sourcedir.replace('\\', '/')),
('%/p', sourcedir.replace('\\', '/')),
- ('%/t', tmpPrefix.replace('\\', '/')),
+ ('%/t', tmpBase.replace('\\', '/') + '.tmp'),
('%/T', tmpDir.replace('\\', '/')),
])
@@ -731,7 +740,7 @@ def getDefaultSubstitutions(test, normalize_slashes=False):
('%:s', re.sub(r'^(.):', r'\1', sourcepath)),
('%:S', re.sub(r'^(.):', r'\1', sourcedir)),
('%:p', re.sub(r'^(.):', r'\1', sourcedir)),
- ('%:t', re.sub(r'^(.):', r'\1', tmpPrefix)),
+ ('%:t', re.sub(r'^(.):', r'\1', tmpBase) + '.tmp'),
('%:T', re.sub(r'^(.):', r'\1', tmpDir)),
])
else:
@@ -739,7 +748,7 @@ def getDefaultSubstitutions(test, normalize_slashes=False):
('%:s', sourcepath),
('%:S', sourcedir),
('%:p', sourcedir),
- ('%:t', tmpPrefix),
+ ('%:t', tmpBase + '.tmp'),
('%:T', tmpDir),
])
return substitutions
@@ -770,7 +779,7 @@ class ParserKind(object):
TAG: A keyword taking no value. Ex 'END.'
COMMAND: A keyword taking a list of shell commands. Ex 'RUN:'
LIST: A keyword taking a comma-separated list of values.
- BOOLEAN_EXPR: A keyword taking a comma-separated list of
+ BOOLEAN_EXPR: A keyword taking a comma-separated list of
boolean expressions. Ex 'XFAIL:'
CUSTOM: A keyword with custom parsing semantics.
"""
@@ -942,14 +951,14 @@ def parseIntegratedTestScript(test, additional_parsers=[],
IntegratedTestKeywordParser('REQUIRES:', ParserKind.BOOLEAN_EXPR,
initial_value=test.requires),
IntegratedTestKeywordParser('REQUIRES-ANY:', ParserKind.CUSTOM,
- IntegratedTestKeywordParser._handleRequiresAny,
- initial_value=test.requires),
+ IntegratedTestKeywordParser._handleRequiresAny,
+ initial_value=test.requires),
IntegratedTestKeywordParser('UNSUPPORTED:', ParserKind.BOOLEAN_EXPR,
initial_value=test.unsupported),
IntegratedTestKeywordParser('END.', ParserKind.TAG)
]
keyword_parsers = {p.keyword: p for p in builtin_parsers}
-
+
# Install user-defined additional parsers.
for parser in additional_parsers:
if not isinstance(parser, IntegratedTestKeywordParser):
@@ -959,7 +968,7 @@ def parseIntegratedTestScript(test, additional_parsers=[],
raise ValueError("Parser for keyword '%s' already exists"
% parser.keyword)
keyword_parsers[parser.keyword] = parser
-
+
# Collect the test lines from the script.
sourcepath = test.getSourcePath()
for line_number, command_type, ln in \
@@ -1005,8 +1014,12 @@ def parseIntegratedTestScript(test, additional_parsers=[],
return script
+
def _runShTest(test, litConfig, useExternalSh, script, tmpBase):
- execdir = os.path.dirname(test.getTempFileDir())
+ # Create the output directory if it does not already exist.
+ lit.util.mkdir_p(os.path.dirname(tmpBase))
+
+ execdir = os.path.dirname(test.getExecPath())
if useExternalSh:
res = executeScript(test, litConfig, tmpBase, script, execdir)
else:
@@ -1050,8 +1063,10 @@ def executeShTest(test, litConfig, useExternalSh,
return script
if litConfig.noExecute:
return lit.Test.Result(Test.PASS)
+
+ tmpDir, tmpBase = getTempPaths(test)
substitutions = list(extra_substitutions)
- substitutions += getDefaultSubstitutions(test,
+ substitutions += getDefaultSubstitutions(test, tmpDir, tmpBase,
normalize_slashes=useExternalSh)
script = applySubstitutions(script, substitutions)
@@ -1060,8 +1075,7 @@ def executeShTest(test, litConfig, useExternalSh,
if hasattr(test.config, 'test_retry_attempts'):
attempts += test.config.test_retry_attempts
for i in range(attempts):
- res = _runShTest(test, litConfig, useExternalSh, script,
- test.getTempFilePrefix())
+ res = _runShTest(test, litConfig, useExternalSh, script, tmpBase)
if res.code != Test.FAIL:
break
# If we had to run the test more than once, count it as a flaky pass. These
diff --git a/llvm/utils/lit/lit/run.py b/llvm/utils/lit/lit/run.py
index bdaf1415a1c..1290c142c83 100644
--- a/llvm/utils/lit/lit/run.py
+++ b/llvm/utils/lit/lit/run.py
@@ -1,5 +1,4 @@
import os
-import shutil
import sys
import threading
import time
@@ -75,25 +74,6 @@ class Run(object):
if not self.tests or jobs == 0:
return
- # Create fresh output directories for each test we're going to run.
- # This guarantees that test runs will not remnants of previous test
- # runs' output.
- clean_paths = set()
- for test in self.tests:
- clean_paths.add(os.path.normpath(test.getTempFileDir()))
- clean_paths = list(clean_paths)
- # Sort by number of path components, to ensure that parent directories
- # get deleted and re-created before child directories.
- clean_paths.sort(key=lambda x: len(x.split(os.sep)))
- for base in clean_paths:
- if os.path.exists(base):
- if not os.path.islink(base) and os.path.isdir(base):
- shutil.rmtree(base, True)
- else:
- os.unlink(os.path)
- if not os.path.exists(base):
- lit.util.mkdir_p(base)
-
# Set up semaphores to limit parallelism of certain classes of tests.
# For example, some ASan tests require lots of virtual memory and run
# faster with less parallelism on OS X.
OpenPOWER on IntegriCloud