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