1 //===--- raw_ostream.cpp - Implement the raw_ostream classes --------------===//
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
7 //===----------------------------------------------------------------------===//
9 // This implements support for bulk buffered stream output.
11 //===----------------------------------------------------------------------===//
13 #include "llvm/Support/raw_ostream.h"
14 #include "llvm/ADT/STLExtras.h"
15 #include "llvm/ADT/SmallVector.h"
16 #include "llvm/ADT/StringExtras.h"
17 #include "llvm/Config/config.h"
18 #include "llvm/Support/Compiler.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"
33 #include <system_error>
35 // <fcntl.h> may provide O_BINARY.
36 #if defined(HAVE_FCNTL_H)
40 #if defined(HAVE_UNISTD_H)
44 #if defined(__CYGWIN__)
51 # define STDIN_FILENO 0
54 # define STDOUT_FILENO 1
57 # define STDERR_FILENO 2
62 #include "llvm/Support/ConvertUTF.h"
63 #include "Windows/WindowsSupport.h"
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!");
74 if (BufferMode
== InternalBuffer
)
75 delete [] OutBufStart
;
78 size_t raw_ostream::preferred_buffer_size() const {
79 // BUFSIZ is intended to be a reasonable default.
83 void raw_ostream::SetBuffered() {
84 // Ask the subclass to determine an appropriate buffer size.
85 if (size_t Size
= preferred_buffer_size())
88 // It may return 0, meaning this stream should be unbuffered.
92 void raw_ostream::SetBufferAndMode(char *BufferStart
, size_t Size
,
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!");
101 if (BufferMode
== InternalBuffer
)
102 delete [] OutBufStart
;
103 OutBufStart
= BufferStart
;
104 OutBufEnd
= OutBufStart
+Size
;
105 OutBufCur
= OutBufStart
;
108 assert(OutBufStart
<= OutBufEnd
&& "Invalid size!");
111 raw_ostream
&raw_ostream::operator<<(unsigned long N
) {
112 write_integer(*this, static_cast<uint64_t>(N
), 0, IntegerStyle::Integer
);
116 raw_ostream
&raw_ostream::operator<<(long N
) {
117 write_integer(*this, static_cast<int64_t>(N
), 0, IntegerStyle::Integer
);
121 raw_ostream
&raw_ostream::operator<<(unsigned long long N
) {
122 write_integer(*this, static_cast<uint64_t>(N
), 0, IntegerStyle::Integer
);
126 raw_ostream
&raw_ostream::operator<<(long long N
) {
127 write_integer(*this, static_cast<int64_t>(N
), 0, IntegerStyle::Integer
);
131 raw_ostream
&raw_ostream::write_hex(unsigned long long N
) {
132 llvm::write_hex(*this, N
, HexPrintStyle::Lower
);
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)
146 raw_ostream
&raw_ostream::write_escaped(StringRef Str
,
147 bool UseHexEscapes
) {
148 for (unsigned char c
: Str
) {
151 *this << '\\' << '\\';
154 *this << '\\' << 't';
157 *this << '\\' << 'n';
160 *this << '\\' << '"';
168 // Write out the escaped representation.
170 *this << '\\' << 'x';
171 *this << hexdigit((c
>> 4 & 0xF));
172 *this << hexdigit((c
>> 0) & 0xF);
174 // Always use a full 3-character octal escape.
176 *this << char('0' + ((c
>> 6) & 7));
177 *this << char('0' + ((c
>> 3) & 7));
178 *this << char('0' + ((c
>> 0) & 7));
186 raw_ostream
&raw_ostream::operator<<(const void *P
) {
187 llvm::write_hex(*this, (uintptr_t)P
, HexPrintStyle::PrefixLower
);
191 raw_ostream
&raw_ostream::operator<<(double N
) {
192 llvm::write_double(*this, N
, FloatStyle::Exponent
);
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
);
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);
211 // Set up a buffer and start over.
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
);
231 // Set up a buffer and start over.
233 return write(Ptr
, Size
);
236 size_t NumBytes
= OutBufEnd
- OutBufCur
;
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
);
250 copy_to_buffer(Ptr
+ BytesToWrite
, BytesRemaining
);
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
);
258 return write(Ptr
+ NumBytes
, Size
- NumBytes
);
261 copy_to_buffer(Ptr
, Size
);
266 void raw_ostream::copy_to_buffer(const char *Ptr
, size_t Size
) {
267 assert(Size
<= size_t(OutBufEnd
- OutBufCur
) && "Buffer overrun!");
269 // Handle short strings specially, memcpy isn't very good at very short
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
;
278 memcpy(OutBufCur
, Ptr
, Size
);
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
);
294 // Common case is that we have plenty of space.
295 if (BytesUsed
<= BufferBytesLeft
) {
296 OutBufCur
+= BytesUsed
;
300 // Otherwise, we overflowed and the return value tells us the size to try
302 NextBufferSize
= BytesUsed
;
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
;
311 V
.resize(NextBufferSize
);
313 // Try formatting into the SmallVector.
314 size_t BytesUsed
= Fmt
.print(V
.data(), NextBufferSize
);
316 // If BytesUsed fit into the vector, we win.
317 if (BytesUsed
<= NextBufferSize
)
318 return write(V
.data(), BytesUsed
);
320 // Otherwise, try again with a new size.
321 assert(BytesUsed
> NextBufferSize
&& "Didn't grow buffer!?");
322 NextBufferSize
= BytesUsed
;
326 raw_ostream
&raw_ostream::operator<<(const formatv_object_base
&Obj
) {
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
);
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
);
343 case FormattedString::JustifyRight
:
344 this->indent(Difference
);
345 this->operator<<(FS
.Str
);
347 case FormattedString::JustifyCenter
: {
348 int PadAmount
= Difference
/ 2;
349 this->indent(PadAmount
);
350 this->operator<<(FS
.Str
);
351 this->indent(Difference
- PadAmount
);
355 llvm_unreachable("Bad Justification");
360 raw_ostream
&raw_ostream::operator<<(const FormattedNumber
&FN
) {
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
;
370 Style
= HexPrintStyle::Lower
;
371 llvm::write_hex(*this, FN
.HexValue
, Style
, FN
.Width
);
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());
383 raw_ostream
&raw_ostream::operator<<(const FormattedBytes
&FB
) {
384 if (FB
.Bytes
.empty())
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
;
400 Power
= llvm::Log2_64_Ceil(MaxOffset
);
401 OffsetWidth
= std::max
<uint64_t>(4, llvm::alignTo(Power
, 4) / 4);
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;
409 while (!Bytes
.empty()) {
410 indent(FB
.IndentLevel
);
412 if (FB
.FirstByteOffset
.hasValue()) {
413 uint64_t Offset
= FB
.FirstByteOffset
.getValue();
414 llvm::write_hex(*this, Offset
+ LineIndex
, HPS
, OffsetWidth
);
418 auto Line
= Bytes
.take_front(FB
.NumPerLine
);
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) {
427 llvm::write_hex(*this, Line
[I
], HPS
, 2);
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);
437 // Print the ASCII char values for each byte on this line
438 for (uint8_t Byte
: Line
) {
440 *this << static_cast<char>(Byte
);
447 Bytes
= Bytes
.drop_front(Line
.size());
448 LineIndex
+= Line
.size();
449 if (LineIndex
< Size
)
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
};
463 // Usually the indentation is small, handle it with a fastpath.
464 if (NumChars
< array_lengthof(Chars
))
465 return OS
.write(Chars
, NumChars
);
468 unsigned NumToWrite
= std::min(NumChars
,
469 (unsigned)array_lengthof(Chars
)-1);
470 OS
.write(Chars
, NumToWrite
);
471 NumChars
-= NumToWrite
;
476 /// indent - Insert 'NumSpaces' spaces.
477 raw_ostream
&raw_ostream::indent(unsigned NumSpaces
) {
478 return write_padding
<' '>(*this, NumSpaces
);
481 /// write_zeros - Insert 'NumZeros' nulls.
482 raw_ostream
&raw_ostream::write_zeros(unsigned NumZeros
) {
483 return write_padding
<'\0'>(*this, NumZeros
);
486 void raw_ostream::anchor() {}
488 //===----------------------------------------------------------------------===//
490 //===----------------------------------------------------------------------===//
492 // Out of line virtual method.
493 void format_object_base::home() {
496 //===----------------------------------------------------------------------===//
498 //===----------------------------------------------------------------------===//
500 static int getFD(StringRef Filename
, std::error_code
&EC
,
501 sys::fs::CreationDisposition Disp
, sys::fs::FileAccess Access
,
502 sys::fs::OpenFlags Flags
) {
503 assert((Access
& sys::fs::FA_Write
) &&
504 "Cannot make a raw_ostream from a read-only descriptor!");
506 // Handle "-" as stdout. Note that when we do this, we consider ourself
507 // the owner of stdout and may set the "binary" flag globally based on Flags.
508 if (Filename
== "-") {
509 EC
= std::error_code();
510 // If user requested binary then put stdout into binary mode if
512 if (!(Flags
& sys::fs::OF_Text
))
513 sys::ChangeStdoutToBinary();
514 return STDOUT_FILENO
;
518 if (Access
& sys::fs::FA_Read
)
519 EC
= sys::fs::openFileForReadWrite(Filename
, FD
, Disp
, Flags
);
521 EC
= sys::fs::openFileForWrite(Filename
, FD
, Disp
, Flags
);
528 raw_fd_ostream::raw_fd_ostream(StringRef Filename
, std::error_code
&EC
)
529 : raw_fd_ostream(Filename
, EC
, sys::fs::CD_CreateAlways
, sys::fs::FA_Write
,
532 raw_fd_ostream::raw_fd_ostream(StringRef Filename
, std::error_code
&EC
,
533 sys::fs::CreationDisposition Disp
)
534 : raw_fd_ostream(Filename
, EC
, Disp
, sys::fs::FA_Write
, sys::fs::OF_None
) {}
536 raw_fd_ostream::raw_fd_ostream(StringRef Filename
, std::error_code
&EC
,
537 sys::fs::FileAccess Access
)
538 : raw_fd_ostream(Filename
, EC
, sys::fs::CD_CreateAlways
, Access
,
541 raw_fd_ostream::raw_fd_ostream(StringRef Filename
, std::error_code
&EC
,
542 sys::fs::OpenFlags Flags
)
543 : raw_fd_ostream(Filename
, EC
, sys::fs::CD_CreateAlways
, sys::fs::FA_Write
,
546 raw_fd_ostream::raw_fd_ostream(StringRef Filename
, std::error_code
&EC
,
547 sys::fs::CreationDisposition Disp
,
548 sys::fs::FileAccess Access
,
549 sys::fs::OpenFlags Flags
)
550 : raw_fd_ostream(getFD(Filename
, EC
, Disp
, Access
, Flags
), true) {}
552 /// FD is the file descriptor that this writes to. If ShouldClose is true, this
553 /// closes the file when the stream is destroyed.
554 raw_fd_ostream::raw_fd_ostream(int fd
, bool shouldClose
, bool unbuffered
)
555 : raw_pwrite_stream(unbuffered
), FD(fd
), ShouldClose(shouldClose
) {
561 // Do not attempt to close stdout or stderr. We used to try to maintain the
562 // property that tools that support writing file to stdout should not also
563 // write informational output to stdout, but in practice we were never able to
564 // maintain this invariant. Many features have been added to LLVM and clang
565 // (-fdump-record-layouts, optimization remarks, etc) that print to stdout, so
566 // users must simply be aware that mixed output and remarks is a possibility.
567 if (FD
<= STDERR_FILENO
)
571 // Check if this is a console device. This is not equivalent to isatty.
573 ::GetFileType((HANDLE
)::_get_osfhandle(fd
)) == FILE_TYPE_CHAR
;
576 // Get the starting position.
577 off_t loc
= ::lseek(FD
, 0, SEEK_CUR
);
579 // MSVCRT's _lseek(SEEK_CUR) doesn't return -1 for pipes.
580 sys::fs::file_status Status
;
581 std::error_code EC
= status(FD
, Status
);
582 SupportsSeeking
= !EC
&& Status
.type() == sys::fs::file_type::regular_file
;
584 SupportsSeeking
= loc
!= (off_t
)-1;
586 if (!SupportsSeeking
)
589 pos
= static_cast<uint64_t>(loc
);
592 raw_fd_ostream::~raw_fd_ostream() {
596 if (auto EC
= sys::Process::SafelyCloseFileDescriptor(FD
))
602 // On mingw, global dtors should not call exit().
603 // report_fatal_error() invokes exit(). We know report_fatal_error()
604 // might not write messages to stderr when any errors were detected
609 // If there are any pending errors, report them now. Clients wishing
610 // to avoid report_fatal_error calls should check for errors with
611 // has_error() and clear the error flag with clear_error() before
612 // destructing raw_ostream objects which may have errors.
614 report_fatal_error("IO failure on output stream: " + error().message(),
615 /*GenCrashDiag=*/false);
619 // The most reliable way to print unicode in a Windows console is with
620 // WriteConsoleW. To use that, first transcode from UTF-8 to UTF-16. This
621 // assumes that LLVM programs always print valid UTF-8 to the console. The data
622 // might not be UTF-8 for two major reasons:
623 // 1. The program is printing binary (-filetype=obj -o -), in which case it
624 // would have been gibberish anyway.
625 // 2. The program is printing text in a semi-ascii compatible codepage like
626 // shift-jis or cp1252.
628 // Most LLVM programs don't produce non-ascii text unless they are quoting
629 // user source input. A well-behaved LLVM program should either validate that
630 // the input is UTF-8 or transcode from the local codepage to UTF-8 before
631 // quoting it. If they don't, this may mess up the encoding, but this is still
632 // probably the best compromise we can make.
633 static bool write_console_impl(int FD
, StringRef Data
) {
634 SmallVector
<wchar_t, 256> WideText
;
636 // Fall back to ::write if it wasn't valid UTF-8.
637 if (auto EC
= sys::windows::UTF8ToUTF16(Data
, WideText
))
640 // On Windows 7 and earlier, WriteConsoleW has a low maximum amount of data
641 // that can be written to the console at a time.
642 size_t MaxWriteSize
= WideText
.size();
643 if (!RunningWindows8OrGreater())
644 MaxWriteSize
= 32767;
646 size_t WCharsWritten
= 0;
648 size_t WCharsToWrite
=
649 std::min(MaxWriteSize
, WideText
.size() - WCharsWritten
);
650 DWORD ActuallyWritten
;
652 ::WriteConsoleW((HANDLE
)::_get_osfhandle(FD
), &WideText
[WCharsWritten
],
653 WCharsToWrite
, &ActuallyWritten
,
654 /*Reserved=*/nullptr);
656 // The most likely reason for WriteConsoleW to fail is that FD no longer
657 // points to a console. Fall back to ::write. If this isn't the first loop
658 // iteration, something is truly wrong.
662 WCharsWritten
+= ActuallyWritten
;
663 } while (WCharsWritten
!= WideText
.size());
668 void raw_fd_ostream::write_impl(const char *Ptr
, size_t Size
) {
669 assert(FD
>= 0 && "File already closed.");
673 // If this is a Windows console device, try re-encoding from UTF-8 to UTF-16
674 // and using WriteConsoleW. If that fails, fall back to plain write().
675 if (IsWindowsConsole
)
676 if (write_console_impl(FD
, StringRef(Ptr
, Size
)))
680 // The maximum write size is limited to INT32_MAX. A write
681 // greater than SSIZE_MAX is implementation-defined in POSIX,
682 // and Windows _write requires 32 bit input.
683 size_t MaxWriteSize
= INT32_MAX
;
685 #if defined(__linux__)
686 // It is observed that Linux returns EINVAL for a very large write (>2G).
687 // Make it a reasonably small value.
688 MaxWriteSize
= 1024 * 1024 * 1024;
692 size_t ChunkSize
= std::min(Size
, MaxWriteSize
);
693 ssize_t ret
= ::write(FD
, Ptr
, ChunkSize
);
696 // If it's a recoverable error, swallow it and retry the write.
698 // Ideally we wouldn't ever see EAGAIN or EWOULDBLOCK here, since
699 // raw_ostream isn't designed to do non-blocking I/O. However, some
700 // programs, such as old versions of bjam, have mistakenly used
701 // O_NONBLOCK. For compatibility, emulate blocking semantics by
702 // spinning until the write succeeds. If you don't want spinning,
703 // don't use O_NONBLOCK file descriptors with raw_ostream.
704 if (errno
== EINTR
|| errno
== EAGAIN
706 || errno
== EWOULDBLOCK
711 // Otherwise it's a non-recoverable error. Note it and quit.
712 error_detected(std::error_code(errno
, std::generic_category()));
716 // The write may have written some or all of the data. Update the
717 // size and buffer pointer to reflect the remainder that needs
718 // to be written. If there are no bytes left, we're done.
724 void raw_fd_ostream::close() {
728 if (auto EC
= sys::Process::SafelyCloseFileDescriptor(FD
))
733 uint64_t raw_fd_ostream::seek(uint64_t off
) {
734 assert(SupportsSeeking
&& "Stream does not support seeking!");
737 pos
= ::_lseeki64(FD
, off
, SEEK_SET
);
738 #elif defined(HAVE_LSEEK64)
739 pos
= ::lseek64(FD
, off
, SEEK_SET
);
741 pos
= ::lseek(FD
, off
, SEEK_SET
);
743 if (pos
== (uint64_t)-1)
744 error_detected(std::error_code(errno
, std::generic_category()));
748 void raw_fd_ostream::pwrite_impl(const char *Ptr
, size_t Size
,
750 uint64_t Pos
= tell();
756 size_t raw_fd_ostream::preferred_buffer_size() const {
758 // Disable buffering for console devices. Console output is re-encoded from
759 // UTF-8 to UTF-16 on Windows, and buffering it would require us to split the
760 // buffer on a valid UTF-8 codepoint boundary. Terminal buffering is disabled
761 // below on most other OSs, so do the same thing on Windows and avoid that
763 if (IsWindowsConsole
)
765 return raw_ostream::preferred_buffer_size();
766 #elif !defined(__minix)
767 // Minix has no st_blksize.
768 assert(FD
>= 0 && "File not yet open!");
770 if (fstat(FD
, &statbuf
) != 0)
773 // If this is a terminal, don't use buffering. Line buffering
774 // would be a more traditional thing to do, but it's not worth
776 if (S_ISCHR(statbuf
.st_mode
) && isatty(FD
))
778 // Return the preferred block size.
779 return statbuf
.st_blksize
;
781 return raw_ostream::preferred_buffer_size();
785 raw_ostream
&raw_fd_ostream::changeColor(enum Colors colors
, bool bold
,
787 if (sys::Process::ColorNeedsFlush())
789 const char *colorcode
=
790 (colors
== SAVEDCOLOR
) ? sys::Process::OutputBold(bg
)
791 : sys::Process::OutputColor(colors
, bold
, bg
);
793 size_t len
= strlen(colorcode
);
794 write(colorcode
, len
);
795 // don't account colors towards output characters
801 raw_ostream
&raw_fd_ostream::resetColor() {
802 if (sys::Process::ColorNeedsFlush())
804 const char *colorcode
= sys::Process::ResetColor();
806 size_t len
= strlen(colorcode
);
807 write(colorcode
, len
);
808 // don't account colors towards output characters
814 raw_ostream
&raw_fd_ostream::reverseColor() {
815 if (sys::Process::ColorNeedsFlush())
817 const char *colorcode
= sys::Process::OutputReverse();
819 size_t len
= strlen(colorcode
);
820 write(colorcode
, len
);
821 // don't account colors towards output characters
827 bool raw_fd_ostream::is_displayed() const {
828 return sys::Process::FileDescriptorIsDisplayed(FD
);
831 bool raw_fd_ostream::has_colors() const {
832 return sys::Process::FileDescriptorHasColors(FD
);
835 void raw_fd_ostream::anchor() {}
837 //===----------------------------------------------------------------------===//
838 // outs(), errs(), nulls()
839 //===----------------------------------------------------------------------===//
841 /// outs() - This returns a reference to a raw_ostream for standard output.
842 /// Use it like: outs() << "foo" << "bar";
843 raw_ostream
&llvm::outs() {
844 // Set buffer settings to model stdout behavior.
846 static raw_fd_ostream
S("-", EC
, sys::fs::F_None
);
851 /// errs() - This returns a reference to a raw_ostream for standard error.
852 /// Use it like: errs() << "foo" << "bar";
853 raw_ostream
&llvm::errs() {
854 // Set standard error to be unbuffered by default.
855 static raw_fd_ostream
S(STDERR_FILENO
, false, true);
859 /// nulls() - This returns a reference to a raw_ostream which discards output.
860 raw_ostream
&llvm::nulls() {
861 static raw_null_ostream S
;
865 //===----------------------------------------------------------------------===//
866 // raw_string_ostream
867 //===----------------------------------------------------------------------===//
869 raw_string_ostream::~raw_string_ostream() {
873 void raw_string_ostream::write_impl(const char *Ptr
, size_t Size
) {
874 OS
.append(Ptr
, Size
);
877 //===----------------------------------------------------------------------===//
878 // raw_svector_ostream
879 //===----------------------------------------------------------------------===//
881 uint64_t raw_svector_ostream::current_pos() const { return OS
.size(); }
883 void raw_svector_ostream::write_impl(const char *Ptr
, size_t Size
) {
884 OS
.append(Ptr
, Ptr
+ Size
);
887 void raw_svector_ostream::pwrite_impl(const char *Ptr
, size_t Size
,
889 memcpy(OS
.data() + Offset
, Ptr
, Size
);
892 //===----------------------------------------------------------------------===//
894 //===----------------------------------------------------------------------===//
896 raw_null_ostream::~raw_null_ostream() {
898 // ~raw_ostream asserts that the buffer is empty. This isn't necessary
899 // with raw_null_ostream, but it's better to have raw_null_ostream follow
900 // the rules than to change the rules just for raw_null_ostream.
905 void raw_null_ostream::write_impl(const char *Ptr
, size_t Size
) {
908 uint64_t raw_null_ostream::current_pos() const {
912 void raw_null_ostream::pwrite_impl(const char *Ptr
, size_t Size
,
915 void raw_pwrite_stream::anchor() {}
917 void buffer_ostream::anchor() {}