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