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