summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-07-26 22:32:58 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-07-26 22:32:58 +0000
commit2a2a0973b8d67817c30a0105b7a09f87ec3b4fd1 (patch)
tree132fb2aede44ab050147f3664fcd8009548d34a5
parentf9709e753ffefe931b080bcc6ef5e9217e5520e5 (diff)
downloadbcm5719-llvm-2a2a0973b8d67817c30a0105b7a09f87ec3b4fd1.tar.gz
bcm5719-llvm-2a2a0973b8d67817c30a0105b7a09f87ec3b4fd1.zip
Use pipefail when available.
This change makes test with RUN lines like RUN: opt ... | FileCheck fail if opt fails, even if it prints what FileCheck wants. Enabling this found some interesting cases of broken tests that were not being noticed because opt (or some other tool) was crashing late. Pipefail is used when the shell supports it or when using the internal python based tester. llvm-svn: 187261
-rw-r--r--llvm/docs/CommandGuide/lit.rst4
-rw-r--r--llvm/docs/ReleaseNotes.rst4
-rw-r--r--llvm/test/Other/pipefail.txt2
-rw-r--r--llvm/utils/lit/lit/ShUtil.py5
-rw-r--r--llvm/utils/lit/lit/TestRunner.py5
-rw-r--r--llvm/utils/lit/lit/TestingConfig.py1
6 files changed, 18 insertions, 3 deletions
diff --git a/llvm/docs/CommandGuide/lit.rst b/llvm/docs/CommandGuide/lit.rst
index 2f6d9a15561..a4681fb34ca 100644
--- a/llvm/docs/CommandGuide/lit.rst
+++ b/llvm/docs/CommandGuide/lit.rst
@@ -316,6 +316,10 @@ executed, two important global variables are predefined:
*on_clone* function will generally modify), and (3) the test path to the new
directory being scanned.
+ **pipefail** Normally a test using a shell pipe fails if any of the commands
+ on the pipe fail. If this is not desired, setting this variable to false
+ makes the test fail only if the last command in the pipe fails.
+
TEST DISCOVERY
~~~~~~~~~~~~~~
diff --git a/llvm/docs/ReleaseNotes.rst b/llvm/docs/ReleaseNotes.rst
index 93f12e5974d..e776dce29a2 100644
--- a/llvm/docs/ReleaseNotes.rst
+++ b/llvm/docs/ReleaseNotes.rst
@@ -41,6 +41,10 @@ Non-comprehensive list of changes in this release
functionality, or simply have a lot to talk about), see the `NOTE` below
for adding a new subsection.
+* The regression tests now fail if any command in a pipe fails. To disable it in
+ a directory, just add ``config.pipefail = False`` to its ``lit.local.cfg``.
+ See :doc:`Lit <CommandGuide/lit>` for the details.
+
* Support for exception handling has been removed from the old JIT. Use MCJIT
if you need EH support.
diff --git a/llvm/test/Other/pipefail.txt b/llvm/test/Other/pipefail.txt
new file mode 100644
index 00000000000..241080aab66
--- /dev/null
+++ b/llvm/test/Other/pipefail.txt
@@ -0,0 +1,2 @@
+REQUIRES: shell
+RUN: ((false | true) && echo true || echo false) | grep false
diff --git a/llvm/utils/lit/lit/ShUtil.py b/llvm/utils/lit/lit/ShUtil.py
index 50f79103199..00bb40255c9 100644
--- a/llvm/utils/lit/lit/ShUtil.py
+++ b/llvm/utils/lit/lit/ShUtil.py
@@ -166,8 +166,9 @@ class ShLexer:
###
class ShParser:
- def __init__(self, data, win32Escapes = False):
+ def __init__(self, data, win32Escapes = False, pipefail = False):
self.data = data
+ self.pipefail = pipefail
self.tokens = ShLexer(data, win32Escapes = win32Escapes).lex()
def lex(self):
@@ -224,7 +225,7 @@ class ShParser:
while self.look() == ('|',):
self.lex()
commands.append(self.parse_command())
- return Pipeline(commands, negate)
+ return Pipeline(commands, negate, self.pipefail)
def parse(self):
lhs = self.parse_pipeline()
diff --git a/llvm/utils/lit/lit/TestRunner.py b/llvm/utils/lit/lit/TestRunner.py
index 84176996a8c..daa9b7dfbb0 100644
--- a/llvm/utils/lit/lit/TestRunner.py
+++ b/llvm/utils/lit/lit/TestRunner.py
@@ -245,7 +245,8 @@ def executeScriptInternal(test, litConfig, tmpBase, commands, cwd):
cmds = []
for ln in commands:
try:
- cmds.append(ShUtil.ShParser(ln, litConfig.isWindows).parse())
+ cmds.append(ShUtil.ShParser(ln, litConfig.isWindows,
+ test.config.pipefail).parse())
except:
return (Test.FAIL, "shell parser error on: %r" % ln)
@@ -284,6 +285,8 @@ def executeScript(test, litConfig, tmpBase, commands, cwd):
if isWin32CMDEXE:
f.write('\nif %ERRORLEVEL% NEQ 0 EXIT\n'.join(commands))
else:
+ if test.config.pipefail:
+ f.write('set -o pipefail;')
f.write('{ ' + '; } &&\n{ '.join(commands) + '; }')
f.write('\n')
f.close()
diff --git a/llvm/utils/lit/lit/TestingConfig.py b/llvm/utils/lit/lit/TestingConfig.py
index a1f79a3bfc4..5d5832e9bb6 100644
--- a/llvm/utils/lit/lit/TestingConfig.py
+++ b/llvm/utils/lit/lit/TestingConfig.py
@@ -92,6 +92,7 @@ class TestingConfig:
self.test_source_root = test_source_root
self.excludes = set(excludes)
self.available_features = set(available_features)
+ self.pipefail = True
def clone(self, path):
# FIXME: Chain implementations?
OpenPOWER on IntegriCloud