forked from OSchip/llvm-project
[Driver] check for exit code from SIGPIPE
Summary: D53000 adds a special exit code for SIGPIPE (writing to a closed reader), and rather than print a fatal warning, skips printing the error. This can be seen commonly from piping into head, tee, or split. Fixes PR25349, rdar://problem/14285346, b/77310947. Reviewers: jfb Reviewed By: jfb Subscribers: cfe-commits, thakis, srhines Differential Revision: https://reviews.llvm.org/D53001 llvm-svn: 344375
This commit is contained in:
parent
78886233b3
commit
c7a3e4a478
|
@ -78,6 +78,7 @@
|
|||
#include "llvm/Support/raw_ostream.h"
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <sysexits.h>
|
||||
#include <utility>
|
||||
#if LLVM_ON_UNIX
|
||||
#include <unistd.h> // getpid
|
||||
|
@ -1388,8 +1389,9 @@ int Driver::ExecuteCompilation(
|
|||
|
||||
// Otherwise, remove result files and print extra information about abnormal
|
||||
// failures.
|
||||
int Res = 0;
|
||||
for (const auto &CmdPair : FailingCommands) {
|
||||
int Res = CmdPair.first;
|
||||
int CommandRes = CmdPair.first;
|
||||
const Command *FailingCommand = CmdPair.second;
|
||||
|
||||
// Remove result files if we're not saving temps.
|
||||
|
@ -1398,10 +1400,17 @@ int Driver::ExecuteCompilation(
|
|||
C.CleanupFileMap(C.getResultFiles(), JA, true);
|
||||
|
||||
// Failure result files are valid unless we crashed.
|
||||
if (Res < 0)
|
||||
if (CommandRes < 0)
|
||||
C.CleanupFileMap(C.getFailureResultFiles(), JA, true);
|
||||
}
|
||||
|
||||
// llvm/lib/Support/Unix/Signals.inc will exit with a special return code
|
||||
// for SIGPIPE. Do not print diagnostics for this case.
|
||||
if (CommandRes == EX_IOERR) {
|
||||
Res = CommandRes;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Print extra information about abnormal failures, if possible.
|
||||
//
|
||||
// This is ad-hoc, but we don't want to be excessively noisy. If the result
|
||||
|
@ -1411,17 +1420,17 @@ int Driver::ExecuteCompilation(
|
|||
// diagnostics, so always print the diagnostic there.
|
||||
const Tool &FailingTool = FailingCommand->getCreator();
|
||||
|
||||
if (!FailingCommand->getCreator().hasGoodDiagnostics() || Res != 1) {
|
||||
if (!FailingCommand->getCreator().hasGoodDiagnostics() || CommandRes != 1) {
|
||||
// FIXME: See FIXME above regarding result code interpretation.
|
||||
if (Res < 0)
|
||||
if (CommandRes < 0)
|
||||
Diag(clang::diag::err_drv_command_signalled)
|
||||
<< FailingTool.getShortName();
|
||||
else
|
||||
Diag(clang::diag::err_drv_command_failed) << FailingTool.getShortName()
|
||||
<< Res;
|
||||
Diag(clang::diag::err_drv_command_failed)
|
||||
<< FailingTool.getShortName() << CommandRes;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
return Res;
|
||||
}
|
||||
|
||||
void Driver::PrintHelp(bool ShowHidden) const {
|
||||
|
|
Loading…
Reference in New Issue