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