forked from OSchip/llvm-project
[ASan/Win] Fall back to stdout if we can't print the reports to stderr
llvm-svn: 200804
This commit is contained in:
parent
fb66ef05f7
commit
aeefb6abce
|
@ -271,13 +271,48 @@ uptr internal_read(fd_t fd, void *buf, uptr count) {
|
||||||
uptr internal_write(fd_t fd, const void *buf, uptr count) {
|
uptr internal_write(fd_t fd, const void *buf, uptr count) {
|
||||||
if (fd != kStderrFd)
|
if (fd != kStderrFd)
|
||||||
UNIMPLEMENTED();
|
UNIMPLEMENTED();
|
||||||
HANDLE err = GetStdHandle(STD_ERROR_HANDLE);
|
|
||||||
if (err == 0)
|
static HANDLE output_stream = 0;
|
||||||
return 0; // FIXME: this might not work on some apps.
|
// Abort immediately if we know printing is not possible.
|
||||||
DWORD ret;
|
if (output_stream == INVALID_HANDLE_VALUE)
|
||||||
if (!WriteFile(err, buf, count, &ret, 0))
|
|
||||||
return 0;
|
return 0;
|
||||||
return ret;
|
|
||||||
|
// If called for the first time, try to use stderr to output stuff,
|
||||||
|
// falling back to stdout if anything goes wrong.
|
||||||
|
bool fallback_to_stdout = false;
|
||||||
|
if (output_stream == 0) {
|
||||||
|
output_stream = GetStdHandle(STD_ERROR_HANDLE);
|
||||||
|
// We don't distinguish "no such handle" from error.
|
||||||
|
if (output_stream == 0)
|
||||||
|
output_stream = INVALID_HANDLE_VALUE;
|
||||||
|
|
||||||
|
if (output_stream == INVALID_HANDLE_VALUE) {
|
||||||
|
// Retry with stdout?
|
||||||
|
output_stream = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||||
|
if (output_stream == 0)
|
||||||
|
output_stream = INVALID_HANDLE_VALUE;
|
||||||
|
if (output_stream == INVALID_HANDLE_VALUE)
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
// Successfully got an stderr handle. However, if WriteFile() fails,
|
||||||
|
// we can still try to fallback to stdout.
|
||||||
|
fallback_to_stdout = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD ret;
|
||||||
|
if (WriteFile(output_stream, buf, count, &ret, 0))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
// Re-try with stdout if using a valid stderr handle fails.
|
||||||
|
if (fallback_to_stdout) {
|
||||||
|
output_stream = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||||
|
if (output_stream == 0)
|
||||||
|
output_stream = INVALID_HANDLE_VALUE;
|
||||||
|
if (output_stream != INVALID_HANDLE_VALUE)
|
||||||
|
return internal_write(fd, buf, count);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uptr internal_stat(const char *path, void *buf) {
|
uptr internal_stat(const char *path, void *buf) {
|
||||||
|
|
Loading…
Reference in New Issue