1 //===--- raw_ostream.cpp - Implement the raw_ostream classes --------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This implements support for bulk buffered stream output. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "llvm/Support/raw_ostream.h" 14 #include "llvm/ADT/STLExtras.h" 15 #include "llvm/ADT/SmallVector.h" 16 #include "llvm/ADT/StringExtras.h" 17 #include "llvm/Config/config.h" 18 #include "llvm/Support/Compiler.h" 19 #include "llvm/Support/ErrorHandling.h" 20 #include "llvm/Support/FileSystem.h" 21 #include "llvm/Support/Format.h" 22 #include "llvm/Support/FormatVariadic.h" 23 #include "llvm/Support/MathExtras.h" 24 #include "llvm/Support/NativeFormatting.h" 25 #include "llvm/Support/Process.h" 26 #include "llvm/Support/Program.h" 27 #include <algorithm> 28 #include <cctype> 29 #include <cerrno> 30 #include <cstdio> 31 #include <iterator> 32 #include <sys/stat.h> 33 #include <system_error> 34 35 // <fcntl.h> may provide O_BINARY. 36 #if defined(HAVE_FCNTL_H) 37 # include <fcntl.h> 38 #endif 39 40 #if defined(HAVE_UNISTD_H) 41 # include <unistd.h> 42 #endif 43 44 #if defined(__CYGWIN__) 45 #include <io.h> 46 #endif 47 48 #if defined(_MSC_VER) 49 #include <io.h> 50 #ifndef STDIN_FILENO 51 # define STDIN_FILENO 0 52 #endif 53 #ifndef STDOUT_FILENO 54 # define STDOUT_FILENO 1 55 #endif 56 #ifndef STDERR_FILENO 57 # define STDERR_FILENO 2 58 #endif 59 #endif 60 61 #ifdef _WIN32 62 #include "llvm/Support/ConvertUTF.h" 63 #include "llvm/Support/Windows/WindowsSupport.h" 64 #endif 65 66 using namespace llvm; 67 68 constexpr raw_ostream::Colors raw_ostream::BLACK; 69 constexpr raw_ostream::Colors raw_ostream::RED; 70 constexpr raw_ostream::Colors raw_ostream::GREEN; 71 constexpr raw_ostream::Colors raw_ostream::YELLOW; 72 constexpr raw_ostream::Colors raw_ostream::BLUE; 73 constexpr raw_ostream::Colors raw_ostream::MAGENTA; 74 constexpr raw_ostream::Colors raw_ostream::CYAN; 75 constexpr raw_ostream::Colors raw_ostream::WHITE; 76 constexpr raw_ostream::Colors raw_ostream::SAVEDCOLOR; 77 constexpr raw_ostream::Colors raw_ostream::RESET; 78 79 raw_ostream::~raw_ostream() { 80 // raw_ostream's subclasses should take care to flush the buffer 81 // in their destructors. 82 assert(OutBufCur == OutBufStart && 83 "raw_ostream destructor called with non-empty buffer!"); 84 85 if (BufferMode == BufferKind::InternalBuffer) 86 delete [] OutBufStart; 87 } 88 89 size_t raw_ostream::preferred_buffer_size() const { 90 // BUFSIZ is intended to be a reasonable default. 91 return BUFSIZ; 92 } 93 94 void raw_ostream::SetBuffered() { 95 // Ask the subclass to determine an appropriate buffer size. 96 if (size_t Size = preferred_buffer_size()) 97 SetBufferSize(Size); 98 else 99 // It may return 0, meaning this stream should be unbuffered. 100 SetUnbuffered(); 101 } 102 103 void raw_ostream::SetBufferAndMode(char *BufferStart, size_t Size, 104 BufferKind Mode) { 105 assert(((Mode == BufferKind::Unbuffered && !BufferStart && Size == 0) || 106 (Mode != BufferKind::Unbuffered && BufferStart && Size != 0)) && 107 "stream must be unbuffered or have at least one byte"); 108 // Make sure the current buffer is free of content (we can't flush here; the 109 // child buffer management logic will be in write_impl). 110 assert(GetNumBytesInBuffer() == 0 && "Current buffer is non-empty!"); 111 112 if (BufferMode == BufferKind::InternalBuffer) 113 delete [] OutBufStart; 114 OutBufStart = BufferStart; 115 OutBufEnd = OutBufStart+Size; 116 OutBufCur = OutBufStart; 117 BufferMode = Mode; 118 119 assert(OutBufStart <= OutBufEnd && "Invalid size!"); 120 } 121 122 raw_ostream &raw_ostream::operator<<(unsigned long N) { 123 write_integer(*this, static_cast<uint64_t>(N), 0, IntegerStyle::Integer); 124 return *this; 125 } 126 127 raw_ostream &raw_ostream::operator<<(long N) { 128 write_integer(*this, static_cast<int64_t>(N), 0, IntegerStyle::Integer); 129 return *this; 130 } 131 132 raw_ostream &raw_ostream::operator<<(unsigned long long N) { 133 write_integer(*this, static_cast<uint64_t>(N), 0, IntegerStyle::Integer); 134 return *this; 135 } 136 137 raw_ostream &raw_ostream::operator<<(long long N) { 138 write_integer(*this, static_cast<int64_t>(N), 0, IntegerStyle::Integer); 139 return *this; 140 } 141 142 raw_ostream &raw_ostream::write_hex(unsigned long long N) { 143 llvm::write_hex(*this, N, HexPrintStyle::Lower); 144 return *this; 145 } 146 147 raw_ostream &raw_ostream::operator<<(Colors C) { 148 if (C == Colors::RESET) 149 resetColor(); 150 else 151 changeColor(C); 152 return *this; 153 } 154 155 raw_ostream &raw_ostream::write_uuid(const uuid_t UUID) { 156 for (int Idx = 0; Idx < 16; ++Idx) { 157 *this << format("%02" PRIX32, UUID[Idx]); 158 if (Idx == 3 || Idx == 5 || Idx == 7 || Idx == 9) 159 *this << "-"; 160 } 161 return *this; 162 } 163 164 165 raw_ostream &raw_ostream::write_escaped(StringRef Str, 166 bool UseHexEscapes) { 167 for (unsigned char c : Str) { 168 switch (c) { 169 case '\\': 170 *this << '\\' << '\\'; 171 break; 172 case '\t': 173 *this << '\\' << 't'; 174 break; 175 case '\n': 176 *this << '\\' << 'n'; 177 break; 178 case '"': 179 *this << '\\' << '"'; 180 break; 181 default: 182 if (isPrint(c)) { 183 *this << c; 184 break; 185 } 186 187 // Write out the escaped representation. 188 if (UseHexEscapes) { 189 *this << '\\' << 'x'; 190 *this << hexdigit((c >> 4 & 0xF)); 191 *this << hexdigit((c >> 0) & 0xF); 192 } else { 193 // Always use a full 3-character octal escape. 194 *this << '\\'; 195 *this << char('0' + ((c >> 6) & 7)); 196 *this << char('0' + ((c >> 3) & 7)); 197 *this << char('0' + ((c >> 0) & 7)); 198 } 199 } 200 } 201 202 return *this; 203 } 204 205 raw_ostream &raw_ostream::operator<<(const void *P) { 206 llvm::write_hex(*this, (uintptr_t)P, HexPrintStyle::PrefixLower); 207 return *this; 208 } 209 210 raw_ostream &raw_ostream::operator<<(double N) { 211 llvm::write_double(*this, N, FloatStyle::Exponent); 212 return *this; 213 } 214 215 void raw_ostream::flush_nonempty() { 216 assert(OutBufCur > OutBufStart && "Invalid call to flush_nonempty."); 217 size_t Length = OutBufCur - OutBufStart; 218 OutBufCur = OutBufStart; 219 write_impl(OutBufStart, Length); 220 } 221 222 raw_ostream &raw_ostream::write(unsigned char C) { 223 // Group exceptional cases into a single branch. 224 if (LLVM_UNLIKELY(OutBufCur >= OutBufEnd)) { 225 if (LLVM_UNLIKELY(!OutBufStart)) { 226 if (BufferMode == BufferKind::Unbuffered) { 227 write_impl(reinterpret_cast<char*>(&C), 1); 228 return *this; 229 } 230 // Set up a buffer and start over. 231 SetBuffered(); 232 return write(C); 233 } 234 235 flush_nonempty(); 236 } 237 238 *OutBufCur++ = C; 239 return *this; 240 } 241 242 raw_ostream &raw_ostream::write(const char *Ptr, size_t Size) { 243 // Group exceptional cases into a single branch. 244 if (LLVM_UNLIKELY(size_t(OutBufEnd - OutBufCur) < Size)) { 245 if (LLVM_UNLIKELY(!OutBufStart)) { 246 if (BufferMode == BufferKind::Unbuffered) { 247 write_impl(Ptr, Size); 248 return *this; 249 } 250 // Set up a buffer and start over. 251 SetBuffered(); 252 return write(Ptr, Size); 253 } 254 255 size_t NumBytes = OutBufEnd - OutBufCur; 256 257 // If the buffer is empty at this point we have a string that is larger 258 // than the buffer. Directly write the chunk that is a multiple of the 259 // preferred buffer size and put the remainder in the buffer. 260 if (LLVM_UNLIKELY(OutBufCur == OutBufStart)) { 261 assert(NumBytes != 0 && "undefined behavior"); 262 size_t BytesToWrite = Size - (Size % NumBytes); 263 write_impl(Ptr, BytesToWrite); 264 size_t BytesRemaining = Size - BytesToWrite; 265 if (BytesRemaining > size_t(OutBufEnd - OutBufCur)) { 266 // Too much left over to copy into our buffer. 267 return write(Ptr + BytesToWrite, BytesRemaining); 268 } 269 copy_to_buffer(Ptr + BytesToWrite, BytesRemaining); 270 return *this; 271 } 272 273 // We don't have enough space in the buffer to fit the string in. Insert as 274 // much as possible, flush and start over with the remainder. 275 copy_to_buffer(Ptr, NumBytes); 276 flush_nonempty(); 277 return write(Ptr + NumBytes, Size - NumBytes); 278 } 279 280 copy_to_buffer(Ptr, Size); 281 282 return *this; 283 } 284 285 void raw_ostream::copy_to_buffer(const char *Ptr, size_t Size) { 286 assert(Size <= size_t(OutBufEnd - OutBufCur) && "Buffer overrun!"); 287 288 // Handle short strings specially, memcpy isn't very good at very short 289 // strings. 290 switch (Size) { 291 case 4: OutBufCur[3] = Ptr[3]; LLVM_FALLTHROUGH; 292 case 3: OutBufCur[2] = Ptr[2]; LLVM_FALLTHROUGH; 293 case 2: OutBufCur[1] = Ptr[1]; LLVM_FALLTHROUGH; 294 case 1: OutBufCur[0] = Ptr[0]; LLVM_FALLTHROUGH; 295 case 0: break; 296 default: 297 memcpy(OutBufCur, Ptr, Size); 298 break; 299 } 300 301 OutBufCur += Size; 302 } 303 304 // Formatted output. 305 raw_ostream &raw_ostream::operator<<(const format_object_base &Fmt) { 306 // If we have more than a few bytes left in our output buffer, try 307 // formatting directly onto its end. 308 size_t NextBufferSize = 127; 309 size_t BufferBytesLeft = OutBufEnd - OutBufCur; 310 if (BufferBytesLeft > 3) { 311 size_t BytesUsed = Fmt.print(OutBufCur, BufferBytesLeft); 312 313 // Common case is that we have plenty of space. 314 if (BytesUsed <= BufferBytesLeft) { 315 OutBufCur += BytesUsed; 316 return *this; 317 } 318 319 // Otherwise, we overflowed and the return value tells us the size to try 320 // again with. 321 NextBufferSize = BytesUsed; 322 } 323 324 // If we got here, we didn't have enough space in the output buffer for the 325 // string. Try printing into a SmallVector that is resized to have enough 326 // space. Iterate until we win. 327 SmallVector<char, 128> V; 328 329 while (true) { 330 V.resize(NextBufferSize); 331 332 // Try formatting into the SmallVector. 333 size_t BytesUsed = Fmt.print(V.data(), NextBufferSize); 334 335 // If BytesUsed fit into the vector, we win. 336 if (BytesUsed <= NextBufferSize) 337 return write(V.data(), BytesUsed); 338 339 // Otherwise, try again with a new size. 340 assert(BytesUsed > NextBufferSize && "Didn't grow buffer!?"); 341 NextBufferSize = BytesUsed; 342 } 343 } 344 345 raw_ostream &raw_ostream::operator<<(const formatv_object_base &Obj) { 346 Obj.format(*this); 347 return *this; 348 } 349 350 raw_ostream &raw_ostream::operator<<(const FormattedString &FS) { 351 unsigned LeftIndent = 0; 352 unsigned RightIndent = 0; 353 const ssize_t Difference = FS.Width - FS.Str.size(); 354 if (Difference > 0) { 355 switch (FS.Justify) { 356 case FormattedString::JustifyNone: 357 break; 358 case FormattedString::JustifyLeft: 359 RightIndent = Difference; 360 break; 361 case FormattedString::JustifyRight: 362 LeftIndent = Difference; 363 break; 364 case FormattedString::JustifyCenter: 365 LeftIndent = Difference / 2; 366 RightIndent = Difference - LeftIndent; 367 break; 368 } 369 } 370 indent(LeftIndent); 371 (*this) << FS.Str; 372 indent(RightIndent); 373 return *this; 374 } 375 376 raw_ostream &raw_ostream::operator<<(const FormattedNumber &FN) { 377 if (FN.Hex) { 378 HexPrintStyle Style; 379 if (FN.Upper && FN.HexPrefix) 380 Style = HexPrintStyle::PrefixUpper; 381 else if (FN.Upper && !FN.HexPrefix) 382 Style = HexPrintStyle::Upper; 383 else if (!FN.Upper && FN.HexPrefix) 384 Style = HexPrintStyle::PrefixLower; 385 else 386 Style = HexPrintStyle::Lower; 387 llvm::write_hex(*this, FN.HexValue, Style, FN.Width); 388 } else { 389 llvm::SmallString<16> Buffer; 390 llvm::raw_svector_ostream Stream(Buffer); 391 llvm::write_integer(Stream, FN.DecValue, 0, IntegerStyle::Integer); 392 if (Buffer.size() < FN.Width) 393 indent(FN.Width - Buffer.size()); 394 (*this) << Buffer; 395 } 396 return *this; 397 } 398 399 raw_ostream &raw_ostream::operator<<(const FormattedBytes &FB) { 400 if (FB.Bytes.empty()) 401 return *this; 402 403 size_t LineIndex = 0; 404 auto Bytes = FB.Bytes; 405 const size_t Size = Bytes.size(); 406 HexPrintStyle HPS = FB.Upper ? HexPrintStyle::Upper : HexPrintStyle::Lower; 407 uint64_t OffsetWidth = 0; 408 if (FB.FirstByteOffset.hasValue()) { 409 // Figure out how many nibbles are needed to print the largest offset 410 // represented by this data set, so that we can align the offset field 411 // to the right width. 412 size_t Lines = Size / FB.NumPerLine; 413 uint64_t MaxOffset = *FB.FirstByteOffset + Lines * FB.NumPerLine; 414 unsigned Power = 0; 415 if (MaxOffset > 0) 416 Power = llvm::Log2_64_Ceil(MaxOffset); 417 OffsetWidth = std::max<uint64_t>(4, llvm::alignTo(Power, 4) / 4); 418 } 419 420 // The width of a block of data including all spaces for group separators. 421 unsigned NumByteGroups = 422 alignTo(FB.NumPerLine, FB.ByteGroupSize) / FB.ByteGroupSize; 423 unsigned BlockCharWidth = FB.NumPerLine * 2 + NumByteGroups - 1; 424 425 while (!Bytes.empty()) { 426 indent(FB.IndentLevel); 427 428 if (FB.FirstByteOffset.hasValue()) { 429 uint64_t Offset = FB.FirstByteOffset.getValue(); 430 llvm::write_hex(*this, Offset + LineIndex, HPS, OffsetWidth); 431 *this << ": "; 432 } 433 434 auto Line = Bytes.take_front(FB.NumPerLine); 435 436 size_t CharsPrinted = 0; 437 // Print the hex bytes for this line in groups 438 for (size_t I = 0; I < Line.size(); ++I, CharsPrinted += 2) { 439 if (I && (I % FB.ByteGroupSize) == 0) { 440 ++CharsPrinted; 441 *this << " "; 442 } 443 llvm::write_hex(*this, Line[I], HPS, 2); 444 } 445 446 if (FB.ASCII) { 447 // Print any spaces needed for any bytes that we didn't print on this 448 // line so that the ASCII bytes are correctly aligned. 449 assert(BlockCharWidth >= CharsPrinted); 450 indent(BlockCharWidth - CharsPrinted + 2); 451 *this << "|"; 452 453 // Print the ASCII char values for each byte on this line 454 for (uint8_t Byte : Line) { 455 if (isPrint(Byte)) 456 *this << static_cast<char>(Byte); 457 else 458 *this << '.'; 459 } 460 *this << '|'; 461 } 462 463 Bytes = Bytes.drop_front(Line.size()); 464 LineIndex += Line.size(); 465 if (LineIndex < Size) 466 *this << '\n'; 467 } 468 return *this; 469 } 470 471 template <char C> 472 static raw_ostream &write_padding(raw_ostream &OS, unsigned NumChars) { 473 static const char Chars[] = {C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, 474 C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, 475 C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, 476 C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, 477 C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C}; 478 479 // Usually the indentation is small, handle it with a fastpath. 480 if (NumChars < array_lengthof(Chars)) 481 return OS.write(Chars, NumChars); 482 483 while (NumChars) { 484 unsigned NumToWrite = std::min(NumChars, 485 (unsigned)array_lengthof(Chars)-1); 486 OS.write(Chars, NumToWrite); 487 NumChars -= NumToWrite; 488 } 489 return OS; 490 } 491 492 /// indent - Insert 'NumSpaces' spaces. 493 raw_ostream &raw_ostream::indent(unsigned NumSpaces) { 494 return write_padding<' '>(*this, NumSpaces); 495 } 496 497 /// write_zeros - Insert 'NumZeros' nulls. 498 raw_ostream &raw_ostream::write_zeros(unsigned NumZeros) { 499 return write_padding<'\0'>(*this, NumZeros); 500 } 501 502 void raw_ostream::anchor() {} 503 504 //===----------------------------------------------------------------------===// 505 // Formatted Output 506 //===----------------------------------------------------------------------===// 507 508 // Out of line virtual method. 509 void format_object_base::home() { 510 } 511 512 //===----------------------------------------------------------------------===// 513 // raw_fd_ostream 514 //===----------------------------------------------------------------------===// 515 516 static int getFD(StringRef Filename, std::error_code &EC, 517 sys::fs::CreationDisposition Disp, sys::fs::FileAccess Access, 518 sys::fs::OpenFlags Flags) { 519 assert((Access & sys::fs::FA_Write) && 520 "Cannot make a raw_ostream from a read-only descriptor!"); 521 522 // Handle "-" as stdout. Note that when we do this, we consider ourself 523 // the owner of stdout and may set the "binary" flag globally based on Flags. 524 if (Filename == "-") { 525 EC = std::error_code(); 526 // If user requested binary then put stdout into binary mode if 527 // possible. 528 if (!(Flags & sys::fs::OF_Text)) 529 sys::ChangeStdoutToBinary(); 530 return STDOUT_FILENO; 531 } 532 533 int FD; 534 if (Access & sys::fs::FA_Read) 535 EC = sys::fs::openFileForReadWrite(Filename, FD, Disp, Flags); 536 else 537 EC = sys::fs::openFileForWrite(Filename, FD, Disp, Flags); 538 if (EC) 539 return -1; 540 541 return FD; 542 } 543 544 raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC) 545 : raw_fd_ostream(Filename, EC, sys::fs::CD_CreateAlways, sys::fs::FA_Write, 546 sys::fs::OF_None) {} 547 548 raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC, 549 sys::fs::CreationDisposition Disp) 550 : raw_fd_ostream(Filename, EC, Disp, sys::fs::FA_Write, sys::fs::OF_None) {} 551 552 raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC, 553 sys::fs::FileAccess Access) 554 : raw_fd_ostream(Filename, EC, sys::fs::CD_CreateAlways, Access, 555 sys::fs::OF_None) {} 556 557 raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC, 558 sys::fs::OpenFlags Flags) 559 : raw_fd_ostream(Filename, EC, sys::fs::CD_CreateAlways, sys::fs::FA_Write, 560 Flags) {} 561 562 raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC, 563 sys::fs::CreationDisposition Disp, 564 sys::fs::FileAccess Access, 565 sys::fs::OpenFlags Flags) 566 : raw_fd_ostream(getFD(Filename, EC, Disp, Access, Flags), true) {} 567 568 /// FD is the file descriptor that this writes to. If ShouldClose is true, this 569 /// closes the file when the stream is destroyed. 570 raw_fd_ostream::raw_fd_ostream(int fd, bool shouldClose, bool unbuffered) 571 : raw_pwrite_stream(unbuffered), FD(fd), ShouldClose(shouldClose) { 572 if (FD < 0 ) { 573 ShouldClose = false; 574 return; 575 } 576 577 // Do not attempt to close stdout or stderr. We used to try to maintain the 578 // property that tools that support writing file to stdout should not also 579 // write informational output to stdout, but in practice we were never able to 580 // maintain this invariant. Many features have been added to LLVM and clang 581 // (-fdump-record-layouts, optimization remarks, etc) that print to stdout, so 582 // users must simply be aware that mixed output and remarks is a possibility. 583 if (FD <= STDERR_FILENO) 584 ShouldClose = false; 585 586 #ifdef _WIN32 587 // Check if this is a console device. This is not equivalent to isatty. 588 IsWindowsConsole = 589 ::GetFileType((HANDLE)::_get_osfhandle(fd)) == FILE_TYPE_CHAR; 590 #endif 591 592 // Get the starting position. 593 off_t loc = ::lseek(FD, 0, SEEK_CUR); 594 #ifdef _WIN32 595 // MSVCRT's _lseek(SEEK_CUR) doesn't return -1 for pipes. 596 sys::fs::file_status Status; 597 std::error_code EC = status(FD, Status); 598 SupportsSeeking = !EC && Status.type() == sys::fs::file_type::regular_file; 599 #else 600 SupportsSeeking = loc != (off_t)-1; 601 #endif 602 if (!SupportsSeeking) 603 pos = 0; 604 else 605 pos = static_cast<uint64_t>(loc); 606 } 607 608 raw_fd_ostream::~raw_fd_ostream() { 609 if (FD >= 0) { 610 flush(); 611 if (ShouldClose) { 612 if (auto EC = sys::Process::SafelyCloseFileDescriptor(FD)) 613 error_detected(EC); 614 } 615 } 616 617 #ifdef __MINGW32__ 618 // On mingw, global dtors should not call exit(). 619 // report_fatal_error() invokes exit(). We know report_fatal_error() 620 // might not write messages to stderr when any errors were detected 621 // on FD == 2. 622 if (FD == 2) return; 623 #endif 624 625 // If there are any pending errors, report them now. Clients wishing 626 // to avoid report_fatal_error calls should check for errors with 627 // has_error() and clear the error flag with clear_error() before 628 // destructing raw_ostream objects which may have errors. 629 if (has_error()) 630 report_fatal_error("IO failure on output stream: " + error().message(), 631 /*gen_crash_diag=*/false); 632 } 633 634 #if defined(_WIN32) 635 // The most reliable way to print unicode in a Windows console is with 636 // WriteConsoleW. To use that, first transcode from UTF-8 to UTF-16. This 637 // assumes that LLVM programs always print valid UTF-8 to the console. The data 638 // might not be UTF-8 for two major reasons: 639 // 1. The program is printing binary (-filetype=obj -o -), in which case it 640 // would have been gibberish anyway. 641 // 2. The program is printing text in a semi-ascii compatible codepage like 642 // shift-jis or cp1252. 643 // 644 // Most LLVM programs don't produce non-ascii text unless they are quoting 645 // user source input. A well-behaved LLVM program should either validate that 646 // the input is UTF-8 or transcode from the local codepage to UTF-8 before 647 // quoting it. If they don't, this may mess up the encoding, but this is still 648 // probably the best compromise we can make. 649 static bool write_console_impl(int FD, StringRef Data) { 650 SmallVector<wchar_t, 256> WideText; 651 652 // Fall back to ::write if it wasn't valid UTF-8. 653 if (auto EC = sys::windows::UTF8ToUTF16(Data, WideText)) 654 return false; 655 656 // On Windows 7 and earlier, WriteConsoleW has a low maximum amount of data 657 // that can be written to the console at a time. 658 size_t MaxWriteSize = WideText.size(); 659 if (!RunningWindows8OrGreater()) 660 MaxWriteSize = 32767; 661 662 size_t WCharsWritten = 0; 663 do { 664 size_t WCharsToWrite = 665 std::min(MaxWriteSize, WideText.size() - WCharsWritten); 666 DWORD ActuallyWritten; 667 bool Success = 668 ::WriteConsoleW((HANDLE)::_get_osfhandle(FD), &WideText[WCharsWritten], 669 WCharsToWrite, &ActuallyWritten, 670 /*Reserved=*/nullptr); 671 672 // The most likely reason for WriteConsoleW to fail is that FD no longer 673 // points to a console. Fall back to ::write. If this isn't the first loop 674 // iteration, something is truly wrong. 675 if (!Success) 676 return false; 677 678 WCharsWritten += ActuallyWritten; 679 } while (WCharsWritten != WideText.size()); 680 return true; 681 } 682 #endif 683 684 void raw_fd_ostream::write_impl(const char *Ptr, size_t Size) { 685 assert(FD >= 0 && "File already closed."); 686 pos += Size; 687 688 #if defined(_WIN32) 689 // If this is a Windows console device, try re-encoding from UTF-8 to UTF-16 690 // and using WriteConsoleW. If that fails, fall back to plain write(). 691 if (IsWindowsConsole) 692 if (write_console_impl(FD, StringRef(Ptr, Size))) 693 return; 694 #endif 695 696 // The maximum write size is limited to INT32_MAX. A write 697 // greater than SSIZE_MAX is implementation-defined in POSIX, 698 // and Windows _write requires 32 bit input. 699 size_t MaxWriteSize = INT32_MAX; 700 701 #if defined(__linux__) 702 // It is observed that Linux returns EINVAL for a very large write (>2G). 703 // Make it a reasonably small value. 704 MaxWriteSize = 1024 * 1024 * 1024; 705 #endif 706 707 do { 708 size_t ChunkSize = std::min(Size, MaxWriteSize); 709 ssize_t ret = ::write(FD, Ptr, ChunkSize); 710 711 if (ret < 0) { 712 // If it's a recoverable error, swallow it and retry the write. 713 // 714 // Ideally we wouldn't ever see EAGAIN or EWOULDBLOCK here, since 715 // raw_ostream isn't designed to do non-blocking I/O. However, some 716 // programs, such as old versions of bjam, have mistakenly used 717 // O_NONBLOCK. For compatibility, emulate blocking semantics by 718 // spinning until the write succeeds. If you don't want spinning, 719 // don't use O_NONBLOCK file descriptors with raw_ostream. 720 if (errno == EINTR || errno == EAGAIN 721 #ifdef EWOULDBLOCK 722 || errno == EWOULDBLOCK 723 #endif 724 ) 725 continue; 726 727 // Otherwise it's a non-recoverable error. Note it and quit. 728 error_detected(std::error_code(errno, std::generic_category())); 729 break; 730 } 731 732 // The write may have written some or all of the data. Update the 733 // size and buffer pointer to reflect the remainder that needs 734 // to be written. If there are no bytes left, we're done. 735 Ptr += ret; 736 Size -= ret; 737 } while (Size > 0); 738 } 739 740 void raw_fd_ostream::close() { 741 assert(ShouldClose); 742 ShouldClose = false; 743 flush(); 744 if (auto EC = sys::Process::SafelyCloseFileDescriptor(FD)) 745 error_detected(EC); 746 FD = -1; 747 } 748 749 uint64_t raw_fd_ostream::seek(uint64_t off) { 750 assert(SupportsSeeking && "Stream does not support seeking!"); 751 flush(); 752 #ifdef _WIN32 753 pos = ::_lseeki64(FD, off, SEEK_SET); 754 #elif defined(HAVE_LSEEK64) 755 pos = ::lseek64(FD, off, SEEK_SET); 756 #else 757 pos = ::lseek(FD, off, SEEK_SET); 758 #endif 759 if (pos == (uint64_t)-1) 760 error_detected(std::error_code(errno, std::generic_category())); 761 return pos; 762 } 763 764 void raw_fd_ostream::pwrite_impl(const char *Ptr, size_t Size, 765 uint64_t Offset) { 766 uint64_t Pos = tell(); 767 seek(Offset); 768 write(Ptr, Size); 769 seek(Pos); 770 } 771 772 size_t raw_fd_ostream::preferred_buffer_size() const { 773 #if defined(_WIN32) 774 // Disable buffering for console devices. Console output is re-encoded from 775 // UTF-8 to UTF-16 on Windows, and buffering it would require us to split the 776 // buffer on a valid UTF-8 codepoint boundary. Terminal buffering is disabled 777 // below on most other OSs, so do the same thing on Windows and avoid that 778 // complexity. 779 if (IsWindowsConsole) 780 return 0; 781 return raw_ostream::preferred_buffer_size(); 782 #elif !defined(__minix) 783 // Minix has no st_blksize. 784 assert(FD >= 0 && "File not yet open!"); 785 struct stat statbuf; 786 if (fstat(FD, &statbuf) != 0) 787 return 0; 788 789 // If this is a terminal, don't use buffering. Line buffering 790 // would be a more traditional thing to do, but it's not worth 791 // the complexity. 792 if (S_ISCHR(statbuf.st_mode) && is_displayed()) 793 return 0; 794 // Return the preferred block size. 795 return statbuf.st_blksize; 796 #else 797 return raw_ostream::preferred_buffer_size(); 798 #endif 799 } 800 801 raw_ostream &raw_fd_ostream::changeColor(enum Colors colors, bool bold, 802 bool bg) { 803 if (!ColorEnabled) 804 return *this; 805 806 if (sys::Process::ColorNeedsFlush()) 807 flush(); 808 const char *colorcode = 809 (colors == SAVEDCOLOR) 810 ? sys::Process::OutputBold(bg) 811 : sys::Process::OutputColor(static_cast<char>(colors), bold, bg); 812 if (colorcode) { 813 size_t len = strlen(colorcode); 814 write(colorcode, len); 815 // don't account colors towards output characters 816 pos -= len; 817 } 818 return *this; 819 } 820 821 raw_ostream &raw_fd_ostream::resetColor() { 822 if (!ColorEnabled) 823 return *this; 824 825 if (sys::Process::ColorNeedsFlush()) 826 flush(); 827 const char *colorcode = sys::Process::ResetColor(); 828 if (colorcode) { 829 size_t len = strlen(colorcode); 830 write(colorcode, len); 831 // don't account colors towards output characters 832 pos -= len; 833 } 834 return *this; 835 } 836 837 raw_ostream &raw_fd_ostream::reverseColor() { 838 if (!ColorEnabled) 839 return *this; 840 841 if (sys::Process::ColorNeedsFlush()) 842 flush(); 843 const char *colorcode = sys::Process::OutputReverse(); 844 if (colorcode) { 845 size_t len = strlen(colorcode); 846 write(colorcode, len); 847 // don't account colors towards output characters 848 pos -= len; 849 } 850 return *this; 851 } 852 853 bool raw_fd_ostream::is_displayed() const { 854 return sys::Process::FileDescriptorIsDisplayed(FD); 855 } 856 857 bool raw_fd_ostream::has_colors() const { 858 return sys::Process::FileDescriptorHasColors(FD); 859 } 860 861 void raw_fd_ostream::anchor() {} 862 863 //===----------------------------------------------------------------------===// 864 // outs(), errs(), nulls() 865 //===----------------------------------------------------------------------===// 866 867 /// outs() - This returns a reference to a raw_ostream for standard output. 868 /// Use it like: outs() << "foo" << "bar"; 869 raw_ostream &llvm::outs() { 870 // Set buffer settings to model stdout behavior. 871 std::error_code EC; 872 static raw_fd_ostream S("-", EC, sys::fs::OF_None); 873 assert(!EC); 874 return S; 875 } 876 877 /// errs() - This returns a reference to a raw_ostream for standard error. 878 /// Use it like: errs() << "foo" << "bar"; 879 raw_ostream &llvm::errs() { 880 // Set standard error to be unbuffered by default. 881 static raw_fd_ostream S(STDERR_FILENO, false, true); 882 return S; 883 } 884 885 /// nulls() - This returns a reference to a raw_ostream which discards output. 886 raw_ostream &llvm::nulls() { 887 static raw_null_ostream S; 888 return S; 889 } 890 891 //===----------------------------------------------------------------------===// 892 // raw_string_ostream 893 //===----------------------------------------------------------------------===// 894 895 raw_string_ostream::~raw_string_ostream() { 896 flush(); 897 } 898 899 void raw_string_ostream::write_impl(const char *Ptr, size_t Size) { 900 OS.append(Ptr, Size); 901 } 902 903 //===----------------------------------------------------------------------===// 904 // raw_svector_ostream 905 //===----------------------------------------------------------------------===// 906 907 uint64_t raw_svector_ostream::current_pos() const { return OS.size(); } 908 909 void raw_svector_ostream::write_impl(const char *Ptr, size_t Size) { 910 OS.append(Ptr, Ptr + Size); 911 } 912 913 void raw_svector_ostream::pwrite_impl(const char *Ptr, size_t Size, 914 uint64_t Offset) { 915 memcpy(OS.data() + Offset, Ptr, Size); 916 } 917 918 //===----------------------------------------------------------------------===// 919 // raw_null_ostream 920 //===----------------------------------------------------------------------===// 921 922 raw_null_ostream::~raw_null_ostream() { 923 #ifndef NDEBUG 924 // ~raw_ostream asserts that the buffer is empty. This isn't necessary 925 // with raw_null_ostream, but it's better to have raw_null_ostream follow 926 // the rules than to change the rules just for raw_null_ostream. 927 flush(); 928 #endif 929 } 930 931 void raw_null_ostream::write_impl(const char *Ptr, size_t Size) { 932 } 933 934 uint64_t raw_null_ostream::current_pos() const { 935 return 0; 936 } 937 938 void raw_null_ostream::pwrite_impl(const char *Ptr, size_t Size, 939 uint64_t Offset) {} 940 941 void raw_pwrite_stream::anchor() {} 942 943 void buffer_ostream::anchor() {} 944