1 //===--- raw_ostream.cpp - Implement the raw_ostream classes --------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This implements support for bulk buffered stream output.
12 //===----------------------------------------------------------------------===//
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"
34 #include <system_error>
36 // <fcntl.h> may provide O_BINARY.
37 #if defined(HAVE_FCNTL_H)
41 #if defined(HAVE_UNISTD_H)
45 #if defined(__CYGWIN__)
52 # define STDIN_FILENO 0
55 # define STDOUT_FILENO 1
58 # define STDERR_FILENO 2
63 #include "llvm/Support/ConvertUTF.h"
64 #include "Windows/WindowsSupport.h"
69 raw_ostream::~raw_ostream() {
70 // raw_ostream's subclasses should take care to flush the buffer
71 // in their destructors.
72 assert(OutBufCur == OutBufStart &&
73 "raw_ostream destructor called with non-empty buffer!");
75 if (BufferMode == InternalBuffer)
76 delete [] OutBufStart;
79 size_t raw_ostream::preferred_buffer_size() const {
80 // BUFSIZ is intended to be a reasonable default.
84 void raw_ostream::SetBuffered() {
85 // Ask the subclass to determine an appropriate buffer size.
86 if (size_t Size = preferred_buffer_size())
89 // It may return 0, meaning this stream should be unbuffered.
93 void raw_ostream::SetBufferAndMode(char *BufferStart, size_t Size,
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!");
102 if (BufferMode == InternalBuffer)
103 delete [] OutBufStart;
104 OutBufStart = BufferStart;
105 OutBufEnd = OutBufStart+Size;
106 OutBufCur = OutBufStart;
109 assert(OutBufStart <= OutBufEnd && "Invalid size!");
112 raw_ostream &raw_ostream::operator<<(unsigned long N) {
113 write_integer(*this, static_cast<uint64_t>(N), 0, IntegerStyle::Integer);
117 raw_ostream &raw_ostream::operator<<(long N) {
118 write_integer(*this, static_cast<int64_t>(N), 0, IntegerStyle::Integer);
122 raw_ostream &raw_ostream::operator<<(unsigned long long N) {
123 write_integer(*this, static_cast<uint64_t>(N), 0, IntegerStyle::Integer);
127 raw_ostream &raw_ostream::operator<<(long long N) {
128 write_integer(*this, static_cast<int64_t>(N), 0, IntegerStyle::Integer);
132 raw_ostream &raw_ostream::write_hex(unsigned long long N) {
133 llvm::write_hex(*this, N, HexPrintStyle::Lower);
137 raw_ostream &raw_ostream::write_uuid(const uuid_t UUID) {
138 for (int Idx = 0; Idx < 16; ++Idx) {
139 *this << format("%02" PRIX32, UUID[Idx]);
140 if (Idx == 3 || Idx == 5 || Idx == 7 || Idx == 9)
147 raw_ostream &raw_ostream::write_escaped(StringRef Str,
148 bool UseHexEscapes) {
149 for (unsigned char c : Str) {
152 *this << '\\' << '\\';
155 *this << '\\' << 't';
158 *this << '\\' << 'n';
161 *this << '\\' << '"';
169 // Write out the escaped representation.
171 *this << '\\' << 'x';
172 *this << hexdigit((c >> 4 & 0xF));
173 *this << hexdigit((c >> 0) & 0xF);
175 // Always use a full 3-character octal escape.
177 *this << char('0' + ((c >> 6) & 7));
178 *this << char('0' + ((c >> 3) & 7));
179 *this << char('0' + ((c >> 0) & 7));
187 raw_ostream &raw_ostream::operator<<(const void *P) {
188 llvm::write_hex(*this, (uintptr_t)P, HexPrintStyle::PrefixLower);
192 raw_ostream &raw_ostream::operator<<(double N) {
193 llvm::write_double(*this, N, FloatStyle::Exponent);
197 void raw_ostream::flush_nonempty() {
198 assert(OutBufCur > OutBufStart && "Invalid call to flush_nonempty.");
199 size_t Length = OutBufCur - OutBufStart;
200 OutBufCur = OutBufStart;
201 write_impl(OutBufStart, Length);
204 raw_ostream &raw_ostream::write(unsigned char C) {
205 // Group exceptional cases into a single branch.
206 if (LLVM_UNLIKELY(OutBufCur >= OutBufEnd)) {
207 if (LLVM_UNLIKELY(!OutBufStart)) {
208 if (BufferMode == Unbuffered) {
209 write_impl(reinterpret_cast<char*>(&C), 1);
212 // Set up a buffer and start over.
224 raw_ostream &raw_ostream::write(const char *Ptr, size_t Size) {
225 // Group exceptional cases into a single branch.
226 if (LLVM_UNLIKELY(size_t(OutBufEnd - OutBufCur) < Size)) {
227 if (LLVM_UNLIKELY(!OutBufStart)) {
228 if (BufferMode == Unbuffered) {
229 write_impl(Ptr, Size);
232 // Set up a buffer and start over.
234 return write(Ptr, Size);
237 size_t NumBytes = OutBufEnd - OutBufCur;
239 // If the buffer is empty at this point we have a string that is larger
240 // than the buffer. Directly write the chunk that is a multiple of the
241 // preferred buffer size and put the remainder in the buffer.
242 if (LLVM_UNLIKELY(OutBufCur == OutBufStart)) {
243 assert(NumBytes != 0 && "undefined behavior");
244 size_t BytesToWrite = Size - (Size % NumBytes);
245 write_impl(Ptr, BytesToWrite);
246 size_t BytesRemaining = Size - BytesToWrite;
247 if (BytesRemaining > size_t(OutBufEnd - OutBufCur)) {
248 // Too much left over to copy into our buffer.
249 return write(Ptr + BytesToWrite, BytesRemaining);
251 copy_to_buffer(Ptr + BytesToWrite, BytesRemaining);
255 // We don't have enough space in the buffer to fit the string in. Insert as
256 // much as possible, flush and start over with the remainder.
257 copy_to_buffer(Ptr, NumBytes);
259 return write(Ptr + NumBytes, Size - NumBytes);
262 copy_to_buffer(Ptr, Size);
267 void raw_ostream::copy_to_buffer(const char *Ptr, size_t Size) {
268 assert(Size <= size_t(OutBufEnd - OutBufCur) && "Buffer overrun!");
270 // Handle short strings specially, memcpy isn't very good at very short
273 case 4: OutBufCur[3] = Ptr[3]; LLVM_FALLTHROUGH;
274 case 3: OutBufCur[2] = Ptr[2]; LLVM_FALLTHROUGH;
275 case 2: OutBufCur[1] = Ptr[1]; LLVM_FALLTHROUGH;
276 case 1: OutBufCur[0] = Ptr[0]; LLVM_FALLTHROUGH;
279 memcpy(OutBufCur, Ptr, Size);
287 raw_ostream &raw_ostream::operator<<(const format_object_base &Fmt) {
288 // If we have more than a few bytes left in our output buffer, try
289 // formatting directly onto its end.
290 size_t NextBufferSize = 127;
291 size_t BufferBytesLeft = OutBufEnd - OutBufCur;
292 if (BufferBytesLeft > 3) {
293 size_t BytesUsed = Fmt.print(OutBufCur, BufferBytesLeft);
295 // Common case is that we have plenty of space.
296 if (BytesUsed <= BufferBytesLeft) {
297 OutBufCur += BytesUsed;
301 // Otherwise, we overflowed and the return value tells us the size to try
303 NextBufferSize = BytesUsed;
306 // If we got here, we didn't have enough space in the output buffer for the
307 // string. Try printing into a SmallVector that is resized to have enough
308 // space. Iterate until we win.
309 SmallVector<char, 128> V;
312 V.resize(NextBufferSize);
314 // Try formatting into the SmallVector.
315 size_t BytesUsed = Fmt.print(V.data(), NextBufferSize);
317 // If BytesUsed fit into the vector, we win.
318 if (BytesUsed <= NextBufferSize)
319 return write(V.data(), BytesUsed);
321 // Otherwise, try again with a new size.
322 assert(BytesUsed > NextBufferSize && "Didn't grow buffer!?");
323 NextBufferSize = BytesUsed;
327 raw_ostream &raw_ostream::operator<<(const formatv_object_base &Obj) {
333 raw_ostream &raw_ostream::operator<<(const FormattedString &FS) {
334 if (FS.Str.size() >= FS.Width || FS.Justify == FormattedString::JustifyNone) {
335 this->operator<<(FS.Str);
338 const size_t Difference = FS.Width - FS.Str.size();
339 switch (FS.Justify) {
340 case FormattedString::JustifyLeft:
341 this->operator<<(FS.Str);
342 this->indent(Difference);
344 case FormattedString::JustifyRight:
345 this->indent(Difference);
346 this->operator<<(FS.Str);
348 case FormattedString::JustifyCenter: {
349 int PadAmount = Difference / 2;
350 this->indent(PadAmount);
351 this->operator<<(FS.Str);
352 this->indent(Difference - PadAmount);
356 llvm_unreachable("Bad Justification");
361 raw_ostream &raw_ostream::operator<<(const FormattedNumber &FN) {
364 if (FN.Upper && FN.HexPrefix)
365 Style = HexPrintStyle::PrefixUpper;
366 else if (FN.Upper && !FN.HexPrefix)
367 Style = HexPrintStyle::Upper;
368 else if (!FN.Upper && FN.HexPrefix)
369 Style = HexPrintStyle::PrefixLower;
371 Style = HexPrintStyle::Lower;
372 llvm::write_hex(*this, FN.HexValue, Style, FN.Width);
374 llvm::SmallString<16> Buffer;
375 llvm::raw_svector_ostream Stream(Buffer);
376 llvm::write_integer(Stream, FN.DecValue, 0, IntegerStyle::Integer);
377 if (Buffer.size() < FN.Width)
378 indent(FN.Width - Buffer.size());
384 raw_ostream &raw_ostream::operator<<(const FormattedBytes &FB) {
385 if (FB.Bytes.empty())
388 size_t LineIndex = 0;
389 auto Bytes = FB.Bytes;
390 const size_t Size = Bytes.size();
391 HexPrintStyle HPS = FB.Upper ? HexPrintStyle::Upper : HexPrintStyle::Lower;
392 uint64_t OffsetWidth = 0;
393 if (FB.FirstByteOffset.hasValue()) {
394 // Figure out how many nibbles are needed to print the largest offset
395 // represented by this data set, so that we can align the offset field
396 // to the right width.
397 size_t Lines = Size / FB.NumPerLine;
398 uint64_t MaxOffset = *FB.FirstByteOffset + Lines * FB.NumPerLine;
401 Power = llvm::Log2_64_Ceil(MaxOffset);
402 OffsetWidth = std::max<uint64_t>(4, llvm::alignTo(Power, 4) / 4);
405 // The width of a block of data including all spaces for group separators.
406 unsigned NumByteGroups =
407 alignTo(FB.NumPerLine, FB.ByteGroupSize) / FB.ByteGroupSize;
408 unsigned BlockCharWidth = FB.NumPerLine * 2 + NumByteGroups - 1;
410 while (!Bytes.empty()) {
411 indent(FB.IndentLevel);
413 if (FB.FirstByteOffset.hasValue()) {
414 uint64_t Offset = FB.FirstByteOffset.getValue();
415 llvm::write_hex(*this, Offset + LineIndex, HPS, OffsetWidth);
419 auto Line = Bytes.take_front(FB.NumPerLine);
421 size_t CharsPrinted = 0;
422 // Print the hex bytes for this line in groups
423 for (size_t I = 0; I < Line.size(); ++I, CharsPrinted += 2) {
424 if (I && (I % FB.ByteGroupSize) == 0) {
428 llvm::write_hex(*this, Line[I], HPS, 2);
432 // Print any spaces needed for any bytes that we didn't print on this
433 // line so that the ASCII bytes are correctly aligned.
434 assert(BlockCharWidth >= CharsPrinted);
435 indent(BlockCharWidth - CharsPrinted + 2);
438 // Print the ASCII char values for each byte on this line
439 for (uint8_t Byte : Line) {
441 *this << static_cast<char>(Byte);
448 Bytes = Bytes.drop_front(Line.size());
449 LineIndex += Line.size();
450 if (LineIndex < Size)
457 static raw_ostream &write_padding(raw_ostream &OS, unsigned NumChars) {
458 static const char Chars[] = {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 C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C};
464 // Usually the indentation is small, handle it with a fastpath.
465 if (NumChars < array_lengthof(Chars))
466 return OS.write(Chars, NumChars);
469 unsigned NumToWrite = std::min(NumChars,
470 (unsigned)array_lengthof(Chars)-1);
471 OS.write(Chars, NumToWrite);
472 NumChars -= NumToWrite;
477 /// indent - Insert 'NumSpaces' spaces.
478 raw_ostream &raw_ostream::indent(unsigned NumSpaces) {
479 return write_padding<' '>(*this, NumSpaces);
482 /// write_zeros - Insert 'NumZeros' nulls.
483 raw_ostream &raw_ostream::write_zeros(unsigned NumZeros) {
484 return write_padding<'\0'>(*this, NumZeros);
487 void raw_ostream::anchor() {}
489 //===----------------------------------------------------------------------===//
491 //===----------------------------------------------------------------------===//
493 // Out of line virtual method.
494 void format_object_base::home() {
497 //===----------------------------------------------------------------------===//
499 //===----------------------------------------------------------------------===//
501 static int getFD(StringRef Filename, std::error_code &EC,
502 sys::fs::CreationDisposition Disp, sys::fs::FileAccess Access,
503 sys::fs::OpenFlags Flags) {
504 assert((Access & sys::fs::FA_Write) &&
505 "Cannot make a raw_ostream from a read-only descriptor!");
507 // Handle "-" as stdout. Note that when we do this, we consider ourself
508 // the owner of stdout and may set the "binary" flag globally based on Flags.
509 if (Filename == "-") {
510 EC = std::error_code();
511 // If user requested binary then put stdout into binary mode if
513 if (!(Flags & sys::fs::OF_Text))
514 sys::ChangeStdoutToBinary();
515 return STDOUT_FILENO;
519 if (Access & sys::fs::FA_Read)
520 EC = sys::fs::openFileForReadWrite(Filename, FD, Disp, Flags);
522 EC = sys::fs::openFileForWrite(Filename, FD, Disp, Flags);
529 raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC)
530 : raw_fd_ostream(Filename, EC, sys::fs::CD_CreateAlways, sys::fs::FA_Write,
533 raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC,
534 sys::fs::CreationDisposition Disp)
535 : raw_fd_ostream(Filename, EC, Disp, sys::fs::FA_Write, sys::fs::OF_None) {}
537 raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC,
538 sys::fs::FileAccess Access)
539 : raw_fd_ostream(Filename, EC, sys::fs::CD_CreateAlways, Access,
542 raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC,
543 sys::fs::OpenFlags Flags)
544 : raw_fd_ostream(Filename, EC, sys::fs::CD_CreateAlways, sys::fs::FA_Write,
547 raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC,
548 sys::fs::CreationDisposition Disp,
549 sys::fs::FileAccess Access,
550 sys::fs::OpenFlags Flags)
551 : raw_fd_ostream(getFD(Filename, EC, Disp, Access, Flags), true) {}
553 /// FD is the file descriptor that this writes to. If ShouldClose is true, this
554 /// closes the file when the stream is destroyed.
555 raw_fd_ostream::raw_fd_ostream(int fd, bool shouldClose, bool unbuffered)
556 : raw_pwrite_stream(unbuffered), FD(fd), ShouldClose(shouldClose) {
562 // Do not attempt to close stdout or stderr. We used to try to maintain the
563 // property that tools that support writing file to stdout should not also
564 // write informational output to stdout, but in practice we were never able to
565 // maintain this invariant. Many features have been added to LLVM and clang
566 // (-fdump-record-layouts, optimization remarks, etc) that print to stdout, so
567 // users must simply be aware that mixed output and remarks is a possibility.
568 if (FD <= STDERR_FILENO)
572 // Check if this is a console device. This is not equivalent to isatty.
574 ::GetFileType((HANDLE)::_get_osfhandle(fd)) == FILE_TYPE_CHAR;
577 // Get the starting position.
578 off_t loc = ::lseek(FD, 0, SEEK_CUR);
580 // MSVCRT's _lseek(SEEK_CUR) doesn't return -1 for pipes.
581 sys::fs::file_status Status;
582 std::error_code EC = status(FD, Status);
583 SupportsSeeking = !EC && Status.type() == sys::fs::file_type::regular_file;
585 SupportsSeeking = loc != (off_t)-1;
587 if (!SupportsSeeking)
590 pos = static_cast<uint64_t>(loc);
593 raw_fd_ostream::~raw_fd_ostream() {
597 if (auto EC = sys::Process::SafelyCloseFileDescriptor(FD))
603 // On mingw, global dtors should not call exit().
604 // report_fatal_error() invokes exit(). We know report_fatal_error()
605 // might not write messages to stderr when any errors were detected
610 // If there are any pending errors, report them now. Clients wishing
611 // to avoid report_fatal_error calls should check for errors with
612 // has_error() and clear the error flag with clear_error() before
613 // destructing raw_ostream objects which may have errors.
615 report_fatal_error("IO failure on output stream: " + error().message(),
616 /*GenCrashDiag=*/false);
620 // The most reliable way to print unicode in a Windows console is with
621 // WriteConsoleW. To use that, first transcode from UTF-8 to UTF-16. This
622 // assumes that LLVM programs always print valid UTF-8 to the console. The data
623 // might not be UTF-8 for two major reasons:
624 // 1. The program is printing binary (-filetype=obj -o -), in which case it
625 // would have been gibberish anyway.
626 // 2. The program is printing text in a semi-ascii compatible codepage like
627 // shift-jis or cp1252.
629 // Most LLVM programs don't produce non-ascii text unless they are quoting
630 // user source input. A well-behaved LLVM program should either validate that
631 // the input is UTF-8 or transcode from the local codepage to UTF-8 before
632 // quoting it. If they don't, this may mess up the encoding, but this is still
633 // probably the best compromise we can make.
634 static bool write_console_impl(int FD, StringRef Data) {
635 SmallVector<wchar_t, 256> WideText;
637 // Fall back to ::write if it wasn't valid UTF-8.
638 if (auto EC = sys::windows::UTF8ToUTF16(Data, WideText))
641 // On Windows 7 and earlier, WriteConsoleW has a low maximum amount of data
642 // that can be written to the console at a time.
643 size_t MaxWriteSize = WideText.size();
644 if (!RunningWindows8OrGreater())
645 MaxWriteSize = 32767;
647 size_t WCharsWritten = 0;
649 size_t WCharsToWrite =
650 std::min(MaxWriteSize, WideText.size() - WCharsWritten);
651 DWORD ActuallyWritten;
653 ::WriteConsoleW((HANDLE)::_get_osfhandle(FD), &WideText[WCharsWritten],
654 WCharsToWrite, &ActuallyWritten,
655 /*Reserved=*/nullptr);
657 // The most likely reason for WriteConsoleW to fail is that FD no longer
658 // points to a console. Fall back to ::write. If this isn't the first loop
659 // iteration, something is truly wrong.
663 WCharsWritten += ActuallyWritten;
664 } while (WCharsWritten != WideText.size());
669 void raw_fd_ostream::write_impl(const char *Ptr, size_t Size) {
670 assert(FD >= 0 && "File already closed.");
674 // If this is a Windows console device, try re-encoding from UTF-8 to UTF-16
675 // and using WriteConsoleW. If that fails, fall back to plain write().
676 if (IsWindowsConsole)
677 if (write_console_impl(FD, StringRef(Ptr, Size)))
681 // The maximum write size is limited to INT32_MAX. A write
682 // greater than SSIZE_MAX is implementation-defined in POSIX,
683 // and Windows _write requires 32 bit input.
684 size_t MaxWriteSize = INT32_MAX;
686 #if defined(__linux__)
687 // It is observed that Linux returns EINVAL for a very large write (>2G).
688 // Make it a reasonably small value.
689 MaxWriteSize = 1024 * 1024 * 1024;
693 size_t ChunkSize = std::min(Size, MaxWriteSize);
694 ssize_t ret = ::write(FD, Ptr, ChunkSize);
697 // If it's a recoverable error, swallow it and retry the write.
699 // Ideally we wouldn't ever see EAGAIN or EWOULDBLOCK here, since
700 // raw_ostream isn't designed to do non-blocking I/O. However, some
701 // programs, such as old versions of bjam, have mistakenly used
702 // O_NONBLOCK. For compatibility, emulate blocking semantics by
703 // spinning until the write succeeds. If you don't want spinning,
704 // don't use O_NONBLOCK file descriptors with raw_ostream.
705 if (errno == EINTR || errno == EAGAIN
707 || errno == EWOULDBLOCK
712 // Otherwise it's a non-recoverable error. Note it and quit.
713 error_detected(std::error_code(errno, std::generic_category()));
717 // The write may have written some or all of the data. Update the
718 // size and buffer pointer to reflect the remainder that needs
719 // to be written. If there are no bytes left, we're done.
725 void raw_fd_ostream::close() {
729 if (auto EC = sys::Process::SafelyCloseFileDescriptor(FD))
734 uint64_t raw_fd_ostream::seek(uint64_t off) {
735 assert(SupportsSeeking && "Stream does not support seeking!");
738 pos = ::_lseeki64(FD, off, SEEK_SET);
739 #elif defined(HAVE_LSEEK64)
740 pos = ::lseek64(FD, off, SEEK_SET);
742 pos = ::lseek(FD, off, SEEK_SET);
744 if (pos == (uint64_t)-1)
745 error_detected(std::error_code(errno, std::generic_category()));
749 void raw_fd_ostream::pwrite_impl(const char *Ptr, size_t Size,
751 uint64_t Pos = tell();
757 size_t raw_fd_ostream::preferred_buffer_size() const {
759 // Disable buffering for console devices. Console output is re-encoded from
760 // UTF-8 to UTF-16 on Windows, and buffering it would require us to split the
761 // buffer on a valid UTF-8 codepoint boundary. Terminal buffering is disabled
762 // below on most other OSs, so do the same thing on Windows and avoid that
764 if (IsWindowsConsole)
766 return raw_ostream::preferred_buffer_size();
767 #elif !defined(__minix)
768 // Minix has no st_blksize.
769 assert(FD >= 0 && "File not yet open!");
771 if (fstat(FD, &statbuf) != 0)
774 // If this is a terminal, don't use buffering. Line buffering
775 // would be a more traditional thing to do, but it's not worth
777 if (S_ISCHR(statbuf.st_mode) && isatty(FD))
779 // Return the preferred block size.
780 return statbuf.st_blksize;
782 return raw_ostream::preferred_buffer_size();
786 raw_ostream &raw_fd_ostream::changeColor(enum Colors colors, bool bold,
788 if (sys::Process::ColorNeedsFlush())
790 const char *colorcode =
791 (colors == SAVEDCOLOR) ? sys::Process::OutputBold(bg)
792 : sys::Process::OutputColor(colors, bold, bg);
794 size_t len = strlen(colorcode);
795 write(colorcode, len);
796 // don't account colors towards output characters
802 raw_ostream &raw_fd_ostream::resetColor() {
803 if (sys::Process::ColorNeedsFlush())
805 const char *colorcode = sys::Process::ResetColor();
807 size_t len = strlen(colorcode);
808 write(colorcode, len);
809 // don't account colors towards output characters
815 raw_ostream &raw_fd_ostream::reverseColor() {
816 if (sys::Process::ColorNeedsFlush())
818 const char *colorcode = sys::Process::OutputReverse();
820 size_t len = strlen(colorcode);
821 write(colorcode, len);
822 // don't account colors towards output characters
828 bool raw_fd_ostream::is_displayed() const {
829 return sys::Process::FileDescriptorIsDisplayed(FD);
832 bool raw_fd_ostream::has_colors() const {
833 return sys::Process::FileDescriptorHasColors(FD);
836 void raw_fd_ostream::anchor() {}
838 //===----------------------------------------------------------------------===//
839 // outs(), errs(), nulls()
840 //===----------------------------------------------------------------------===//
842 /// outs() - This returns a reference to a raw_ostream for standard output.
843 /// Use it like: outs() << "foo" << "bar";
844 raw_ostream &llvm::outs() {
845 // Set buffer settings to model stdout behavior.
847 static raw_fd_ostream S("-", EC, sys::fs::F_None);
852 /// errs() - This returns a reference to a raw_ostream for standard error.
853 /// Use it like: errs() << "foo" << "bar";
854 raw_ostream &llvm::errs() {
855 // Set standard error to be unbuffered by default.
856 static raw_fd_ostream S(STDERR_FILENO, false, true);
860 /// nulls() - This returns a reference to a raw_ostream which discards output.
861 raw_ostream &llvm::nulls() {
862 static raw_null_ostream S;
866 //===----------------------------------------------------------------------===//
867 // raw_string_ostream
868 //===----------------------------------------------------------------------===//
870 raw_string_ostream::~raw_string_ostream() {
874 void raw_string_ostream::write_impl(const char *Ptr, size_t Size) {
875 OS.append(Ptr, Size);
878 //===----------------------------------------------------------------------===//
879 // raw_svector_ostream
880 //===----------------------------------------------------------------------===//
882 uint64_t raw_svector_ostream::current_pos() const { return OS.size(); }
884 void raw_svector_ostream::write_impl(const char *Ptr, size_t Size) {
885 OS.append(Ptr, Ptr + Size);
888 void raw_svector_ostream::pwrite_impl(const char *Ptr, size_t Size,
890 memcpy(OS.data() + Offset, Ptr, Size);
893 //===----------------------------------------------------------------------===//
895 //===----------------------------------------------------------------------===//
897 raw_null_ostream::~raw_null_ostream() {
899 // ~raw_ostream asserts that the buffer is empty. This isn't necessary
900 // with raw_null_ostream, but it's better to have raw_null_ostream follow
901 // the rules than to change the rules just for raw_null_ostream.
906 void raw_null_ostream::write_impl(const char *Ptr, size_t Size) {
909 uint64_t raw_null_ostream::current_pos() const {
913 void raw_null_ostream::pwrite_impl(const char *Ptr, size_t Size,
916 void raw_pwrite_stream::anchor() {}
918 void buffer_ostream::anchor() {}