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