[lit] Handle plain negations directly in the internal shell

Keep running "not --crash" via the external "not" executable, but
for plain negations, and for cases that use the shell "!" operator,
just skip that argument and invert the return code.

The libcxx tests only use the shell operator "!" for negations,
never the "not" executable, because libcxx tests can be run without
having a fully built llvm tree available providing the "not"
executable.

This allows using the internal shell for libcxx tests.

Differential Revision: https://reviews.llvm.org/D98859
This commit is contained in:
Martin Storsjö 2021-03-18 09:44:01 +02:00
parent a1d6c652e3
commit d09adfd399
1 changed files with 19 additions and 1 deletions

View File

@ -608,6 +608,7 @@ def _executeShCmd(cmd, shenv, results, timeoutHelper):
assert isinstance(cmd, ShUtil.Pipeline)
procs = []
negate_procs = []
default_stdin = subprocess.PIPE
stderrTempFiles = []
opened_files = []
@ -653,6 +654,12 @@ def _executeShCmd(cmd, shenv, results, timeoutHelper):
if not args:
raise InternalShellError(j, "Error: 'not' requires a"
" subcommand")
elif args[0] == '!':
not_args.append(args.pop(0))
not_count += 1
if not args:
raise InternalShellError(j, "Error: '!' requires a"
" subcommand")
else:
break
@ -699,7 +706,15 @@ def _executeShCmd(cmd, shenv, results, timeoutHelper):
# the assumptions that (1) environment variables are not intended to be
# relevant to 'not' commands and (2) the 'env' command should always
# blindly pass along the status it receives from any command it calls.
args = not_args + args
# For plain negations, either 'not' without '--crash', or the shell
# operator '!', leave them out from the command to execute and
# invert the result code afterwards.
if not_crash:
args = not_args + args
not_count = 0
else:
not_args = []
stdin, stdout, stderr = processRedirects(j, default_stdin, cmd_shenv,
opened_files)
@ -763,6 +778,7 @@ def _executeShCmd(cmd, shenv, results, timeoutHelper):
stderr = stderr,
env = cmd_shenv.env,
close_fds = kUseCloseFDs))
negate_procs.append((not_count % 2) != 0)
# Let the helper know about this process
timeoutHelper.addProcess(procs[-1])
except OSError as e:
@ -815,6 +831,8 @@ def _executeShCmd(cmd, shenv, results, timeoutHelper):
# Detect Ctrl-C in subprocess.
if res == -signal.SIGINT:
raise KeyboardInterrupt
if negate_procs[i]:
res = not res
# Ensure the resulting output is always of string type.
try: