Index: lib/Support/raw_ostream.cpp =================================================================== --- lib/Support/raw_ostream.cpp +++ lib/Support/raw_ostream.cpp @@ -57,6 +57,11 @@ #endif #endif +#ifdef LLVM_ON_WIN32 +#define NOMINMAX +#include +#endif + using namespace llvm; raw_ostream::~raw_ostream() { @@ -562,13 +567,34 @@ report_fatal_error("IO failure on output stream.", /*GenCrashDiag=*/false); } +#ifdef LLVM_ON_WIN32 +static bool IsWindows7OrEarlier() { + unsigned Version = ::GetVersion(); + unsigned MajorVersion = (Version & 0xFF); + unsigned MinorVersion = ((Version >> 8) & 0xFF); + return MajorVersion < 6 || MinorVersion < 2; +} +#endif void raw_fd_ostream::write_impl(const char *Ptr, size_t Size) { assert(FD >= 0 && "File already closed."); pos += Size; +#ifndef LLVM_ON_WIN32 + bool ShouldWriteInChunks = false; +#else + // Writing a large size of output to Windows console returns ENOMEM. It seems + // that, prior to Windows 8, WriteFile() is redirecting to WriteConsole(), and + // the latter has a size limit (66000 bytes or less, depending on heap usage). + bool ShouldWriteInChunks = !!::_isatty(FD) && IsWindows7OrEarlier(); +#endif + do { - ssize_t ret = ::write(FD, Ptr, Size); + size_t ChunkSize = Size; + if (ChunkSize > 32767 && ShouldWriteInChunks) + ChunkSize = 32767; + + ssize_t ret = ::write(FD, Ptr, ChunkSize); if (ret < 0) { // If it's a recoverable error, swallow it and retry the write.