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/StringExtras.h"
15 #include "llvm/Config/config.h"
16 #include "llvm/Support/AutoConvert.h"
17 #include "llvm/Support/Compiler.h"
18 #include "llvm/Support/Duration.h"
19 #include "llvm/Support/ErrorHandling.h"
20 #include "llvm/Support/FileSystem.h"
21 #include "llvm/Support/Format.h"
22 #include "llvm/Support/FormatVariadic.h"
23 #include "llvm/Support/MathExtras.h"
24 #include "llvm/Support/NativeFormatting.h"
25 #include "llvm/Support/Process.h"
26 #include "llvm/Support/Program.h"
32 // <fcntl.h> may provide O_BINARY.
35 #if defined(HAVE_UNISTD_H)
39 #if defined(__CYGWIN__)
46 # define STDIN_FILENO 0
49 # define STDOUT_FILENO 1
52 # define STDERR_FILENO 2
57 #include "llvm/Support/ConvertUTF.h"
58 #include "llvm/Support/Signals.h"
59 #include "llvm/Support/Windows/WindowsSupport.h"
64 constexpr raw_ostream::Colors
raw_ostream::BLACK
;
65 constexpr raw_ostream::Colors
raw_ostream::RED
;
66 constexpr raw_ostream::Colors
raw_ostream::GREEN
;
67 constexpr raw_ostream::Colors
raw_ostream::YELLOW
;
68 constexpr raw_ostream::Colors
raw_ostream::BLUE
;
69 constexpr raw_ostream::Colors
raw_ostream::MAGENTA
;
70 constexpr raw_ostream::Colors
raw_ostream::CYAN
;
71 constexpr raw_ostream::Colors
raw_ostream::WHITE
;
72 constexpr raw_ostream::Colors
raw_ostream::SAVEDCOLOR
;
73 constexpr raw_ostream::Colors
raw_ostream::RESET
;
75 raw_ostream::~raw_ostream() {
76 // raw_ostream's subclasses should take care to flush the buffer
77 // in their destructors.
78 assert(OutBufCur
== OutBufStart
&&
79 "raw_ostream destructor called with non-empty buffer!");
81 if (BufferMode
== BufferKind::InternalBuffer
)
82 delete [] OutBufStart
;
85 size_t raw_ostream::preferred_buffer_size() const {
87 // On Windows BUFSIZ is only 512 which results in more calls to write. This
88 // overhead can cause significant performance degradation. Therefore use a
92 // BUFSIZ is intended to be a reasonable default.
97 void raw_ostream::SetBuffered() {
98 // Ask the subclass to determine an appropriate buffer size.
99 if (size_t Size
= preferred_buffer_size())
102 // It may return 0, meaning this stream should be unbuffered.
106 void raw_ostream::SetBufferAndMode(char *BufferStart
, size_t Size
,
108 assert(((Mode
== BufferKind::Unbuffered
&& !BufferStart
&& Size
== 0) ||
109 (Mode
!= BufferKind::Unbuffered
&& BufferStart
&& Size
!= 0)) &&
110 "stream must be unbuffered or have at least one byte");
111 // Make sure the current buffer is free of content (we can't flush here; the
112 // child buffer management logic will be in write_impl).
113 assert(GetNumBytesInBuffer() == 0 && "Current buffer is non-empty!");
115 if (BufferMode
== BufferKind::InternalBuffer
)
116 delete [] OutBufStart
;
117 OutBufStart
= BufferStart
;
118 OutBufEnd
= OutBufStart
+Size
;
119 OutBufCur
= OutBufStart
;
122 assert(OutBufStart
<= OutBufEnd
&& "Invalid size!");
125 raw_ostream
&raw_ostream::operator<<(unsigned long N
) {
126 write_integer(*this, static_cast<uint64_t>(N
), 0, IntegerStyle::Integer
);
130 raw_ostream
&raw_ostream::operator<<(long N
) {
131 write_integer(*this, static_cast<int64_t>(N
), 0, IntegerStyle::Integer
);
135 raw_ostream
&raw_ostream::operator<<(unsigned long long N
) {
136 write_integer(*this, static_cast<uint64_t>(N
), 0, IntegerStyle::Integer
);
140 raw_ostream
&raw_ostream::operator<<(long long N
) {
141 write_integer(*this, static_cast<int64_t>(N
), 0, IntegerStyle::Integer
);
145 raw_ostream
&raw_ostream::write_hex(unsigned long long N
) {
146 llvm::write_hex(*this, N
, HexPrintStyle::Lower
);
150 raw_ostream
&raw_ostream::operator<<(Colors C
) {
151 if (C
== Colors::RESET
)
158 raw_ostream
&raw_ostream::write_uuid(const uuid_t UUID
) {
159 for (int Idx
= 0; Idx
< 16; ++Idx
) {
160 *this << format("%02" PRIX32
, UUID
[Idx
]);
161 if (Idx
== 3 || Idx
== 5 || Idx
== 7 || Idx
== 9)
168 raw_ostream
&raw_ostream::write_escaped(StringRef Str
,
169 bool UseHexEscapes
) {
170 for (unsigned char c
: Str
) {
173 *this << '\\' << '\\';
176 *this << '\\' << 't';
179 *this << '\\' << 'n';
182 *this << '\\' << '"';
190 // Write out the escaped representation.
192 *this << '\\' << 'x';
193 *this << hexdigit((c
>> 4) & 0xF);
194 *this << hexdigit((c
>> 0) & 0xF);
196 // Always use a full 3-character octal escape.
198 *this << char('0' + ((c
>> 6) & 7));
199 *this << char('0' + ((c
>> 3) & 7));
200 *this << char('0' + ((c
>> 0) & 7));
208 raw_ostream
&raw_ostream::operator<<(const void *P
) {
209 llvm::write_hex(*this, (uintptr_t)P
, HexPrintStyle::PrefixLower
);
213 raw_ostream
&raw_ostream::operator<<(double N
) {
214 llvm::write_double(*this, N
, FloatStyle::Exponent
);
218 void raw_ostream::flush_nonempty() {
219 assert(OutBufCur
> OutBufStart
&& "Invalid call to flush_nonempty.");
220 size_t Length
= OutBufCur
- OutBufStart
;
221 OutBufCur
= OutBufStart
;
222 write_impl(OutBufStart
, Length
);
225 raw_ostream
&raw_ostream::write(unsigned char C
) {
226 // Group exceptional cases into a single branch.
227 if (LLVM_UNLIKELY(OutBufCur
>= OutBufEnd
)) {
228 if (LLVM_UNLIKELY(!OutBufStart
)) {
229 if (BufferMode
== BufferKind::Unbuffered
) {
230 write_impl(reinterpret_cast<char *>(&C
), 1);
233 // Set up a buffer and start over.
245 raw_ostream
&raw_ostream::write(const char *Ptr
, size_t Size
) {
246 // Group exceptional cases into a single branch.
247 if (LLVM_UNLIKELY(size_t(OutBufEnd
- OutBufCur
) < Size
)) {
248 if (LLVM_UNLIKELY(!OutBufStart
)) {
249 if (BufferMode
== BufferKind::Unbuffered
) {
250 write_impl(Ptr
, Size
);
253 // Set up a buffer and start over.
255 return write(Ptr
, Size
);
258 size_t NumBytes
= OutBufEnd
- OutBufCur
;
260 // If the buffer is empty at this point we have a string that is larger
261 // than the buffer. Directly write the chunk that is a multiple of the
262 // preferred buffer size and put the remainder in the buffer.
263 if (LLVM_UNLIKELY(OutBufCur
== OutBufStart
)) {
264 assert(NumBytes
!= 0 && "undefined behavior");
265 size_t BytesToWrite
= Size
- (Size
% NumBytes
);
266 write_impl(Ptr
, BytesToWrite
);
267 size_t BytesRemaining
= Size
- BytesToWrite
;
268 if (BytesRemaining
> size_t(OutBufEnd
- OutBufCur
)) {
269 // Too much left over to copy into our buffer.
270 return write(Ptr
+ BytesToWrite
, BytesRemaining
);
272 copy_to_buffer(Ptr
+ BytesToWrite
, BytesRemaining
);
276 // We don't have enough space in the buffer to fit the string in. Insert as
277 // much as possible, flush and start over with the remainder.
278 copy_to_buffer(Ptr
, NumBytes
);
280 return write(Ptr
+ NumBytes
, Size
- NumBytes
);
283 copy_to_buffer(Ptr
, Size
);
288 void raw_ostream::copy_to_buffer(const char *Ptr
, size_t Size
) {
289 assert(Size
<= size_t(OutBufEnd
- OutBufCur
) && "Buffer overrun!");
291 // Handle short strings specially, memcpy isn't very good at very short
294 case 4: OutBufCur
[3] = Ptr
[3]; [[fallthrough
]];
295 case 3: OutBufCur
[2] = Ptr
[2]; [[fallthrough
]];
296 case 2: OutBufCur
[1] = Ptr
[1]; [[fallthrough
]];
297 case 1: OutBufCur
[0] = Ptr
[0]; [[fallthrough
]];
300 memcpy(OutBufCur
, Ptr
, Size
);
308 raw_ostream
&raw_ostream::operator<<(const format_object_base
&Fmt
) {
309 // If we have more than a few bytes left in our output buffer, try
310 // formatting directly onto its end.
311 size_t NextBufferSize
= 127;
312 size_t BufferBytesLeft
= OutBufEnd
- OutBufCur
;
313 if (BufferBytesLeft
> 3) {
314 size_t BytesUsed
= Fmt
.print(OutBufCur
, BufferBytesLeft
);
316 // Common case is that we have plenty of space.
317 if (BytesUsed
<= BufferBytesLeft
) {
318 OutBufCur
+= BytesUsed
;
322 // Otherwise, we overflowed and the return value tells us the size to try
324 NextBufferSize
= BytesUsed
;
327 // If we got here, we didn't have enough space in the output buffer for the
328 // string. Try printing into a SmallVector that is resized to have enough
329 // space. Iterate until we win.
330 SmallVector
<char, 128> V
;
333 V
.resize(NextBufferSize
);
335 // Try formatting into the SmallVector.
336 size_t BytesUsed
= Fmt
.print(V
.data(), NextBufferSize
);
338 // If BytesUsed fit into the vector, we win.
339 if (BytesUsed
<= NextBufferSize
)
340 return write(V
.data(), BytesUsed
);
342 // Otherwise, try again with a new size.
343 assert(BytesUsed
> NextBufferSize
&& "Didn't grow buffer!?");
344 NextBufferSize
= BytesUsed
;
348 raw_ostream
&raw_ostream::operator<<(const formatv_object_base
&Obj
) {
353 raw_ostream
&raw_ostream::operator<<(const FormattedString
&FS
) {
354 unsigned LeftIndent
= 0;
355 unsigned RightIndent
= 0;
356 const ssize_t Difference
= FS
.Width
- FS
.Str
.size();
357 if (Difference
> 0) {
358 switch (FS
.Justify
) {
359 case FormattedString::JustifyNone
:
361 case FormattedString::JustifyLeft
:
362 RightIndent
= Difference
;
364 case FormattedString::JustifyRight
:
365 LeftIndent
= Difference
;
367 case FormattedString::JustifyCenter
:
368 LeftIndent
= Difference
/ 2;
369 RightIndent
= Difference
- LeftIndent
;
379 raw_ostream
&raw_ostream::operator<<(const FormattedNumber
&FN
) {
382 if (FN
.Upper
&& FN
.HexPrefix
)
383 Style
= HexPrintStyle::PrefixUpper
;
384 else if (FN
.Upper
&& !FN
.HexPrefix
)
385 Style
= HexPrintStyle::Upper
;
386 else if (!FN
.Upper
&& FN
.HexPrefix
)
387 Style
= HexPrintStyle::PrefixLower
;
389 Style
= HexPrintStyle::Lower
;
390 llvm::write_hex(*this, FN
.HexValue
, Style
, FN
.Width
);
392 llvm::SmallString
<16> Buffer
;
393 llvm::raw_svector_ostream
Stream(Buffer
);
394 llvm::write_integer(Stream
, FN
.DecValue
, 0, IntegerStyle::Integer
);
395 if (Buffer
.size() < FN
.Width
)
396 indent(FN
.Width
- Buffer
.size());
402 raw_ostream
&raw_ostream::operator<<(const FormattedBytes
&FB
) {
403 if (FB
.Bytes
.empty())
406 size_t LineIndex
= 0;
407 auto Bytes
= FB
.Bytes
;
408 const size_t Size
= Bytes
.size();
409 HexPrintStyle HPS
= FB
.Upper
? HexPrintStyle::Upper
: HexPrintStyle::Lower
;
410 uint64_t OffsetWidth
= 0;
411 if (FB
.FirstByteOffset
) {
412 // Figure out how many nibbles are needed to print the largest offset
413 // represented by this data set, so that we can align the offset field
414 // to the right width.
415 size_t Lines
= Size
/ FB
.NumPerLine
;
416 uint64_t MaxOffset
= *FB
.FirstByteOffset
+ Lines
* FB
.NumPerLine
;
419 Power
= llvm::Log2_64_Ceil(MaxOffset
);
420 OffsetWidth
= std::max
<uint64_t>(4, llvm::alignTo(Power
, 4) / 4);
423 // The width of a block of data including all spaces for group separators.
424 unsigned NumByteGroups
=
425 alignTo(FB
.NumPerLine
, FB
.ByteGroupSize
) / FB
.ByteGroupSize
;
426 unsigned BlockCharWidth
= FB
.NumPerLine
* 2 + NumByteGroups
- 1;
428 while (!Bytes
.empty()) {
429 indent(FB
.IndentLevel
);
431 if (FB
.FirstByteOffset
) {
432 uint64_t Offset
= *FB
.FirstByteOffset
;
433 llvm::write_hex(*this, Offset
+ LineIndex
, HPS
, OffsetWidth
);
437 auto Line
= Bytes
.take_front(FB
.NumPerLine
);
439 size_t CharsPrinted
= 0;
440 // Print the hex bytes for this line in groups
441 for (size_t I
= 0; I
< Line
.size(); ++I
, CharsPrinted
+= 2) {
442 if (I
&& (I
% FB
.ByteGroupSize
) == 0) {
446 llvm::write_hex(*this, Line
[I
], HPS
, 2);
450 // Print any spaces needed for any bytes that we didn't print on this
451 // line so that the ASCII bytes are correctly aligned.
452 assert(BlockCharWidth
>= CharsPrinted
);
453 indent(BlockCharWidth
- CharsPrinted
+ 2);
456 // Print the ASCII char values for each byte on this line
457 for (uint8_t Byte
: Line
) {
459 *this << static_cast<char>(Byte
);
466 Bytes
= Bytes
.drop_front(Line
.size());
467 LineIndex
+= Line
.size();
468 if (LineIndex
< Size
)
475 static raw_ostream
&write_padding(raw_ostream
&OS
, unsigned NumChars
) {
476 static const char Chars
[] = {C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
,
477 C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
,
478 C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
,
479 C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
,
480 C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
, C
};
482 // Usually the indentation is small, handle it with a fastpath.
483 if (NumChars
< std::size(Chars
))
484 return OS
.write(Chars
, NumChars
);
487 unsigned NumToWrite
= std::min(NumChars
, (unsigned)std::size(Chars
) - 1);
488 OS
.write(Chars
, NumToWrite
);
489 NumChars
-= NumToWrite
;
494 /// indent - Insert 'NumSpaces' spaces.
495 raw_ostream
&raw_ostream::indent(unsigned NumSpaces
) {
496 return write_padding
<' '>(*this, NumSpaces
);
499 /// write_zeros - Insert 'NumZeros' nulls.
500 raw_ostream
&raw_ostream::write_zeros(unsigned NumZeros
) {
501 return write_padding
<'\0'>(*this, NumZeros
);
504 bool raw_ostream::prepare_colors() {
505 // Colors were explicitly disabled.
509 // Colors require changing the terminal but this stream is not going to a
511 if (sys::Process::ColorNeedsFlush() && !is_displayed())
514 if (sys::Process::ColorNeedsFlush())
520 raw_ostream
&raw_ostream::changeColor(enum Colors colors
, bool bold
, bool bg
) {
521 if (!prepare_colors())
524 const char *colorcode
=
525 (colors
== SAVEDCOLOR
)
526 ? sys::Process::OutputBold(bg
)
527 : sys::Process::OutputColor(static_cast<char>(colors
), bold
, bg
);
529 write(colorcode
, strlen(colorcode
));
533 raw_ostream
&raw_ostream::resetColor() {
534 if (!prepare_colors())
537 if (const char *colorcode
= sys::Process::ResetColor())
538 write(colorcode
, strlen(colorcode
));
542 raw_ostream
&raw_ostream::reverseColor() {
543 if (!prepare_colors())
546 if (const char *colorcode
= sys::Process::OutputReverse())
547 write(colorcode
, strlen(colorcode
));
551 void raw_ostream::anchor() {}
553 //===----------------------------------------------------------------------===//
555 //===----------------------------------------------------------------------===//
557 // Out of line virtual method.
558 void format_object_base::home() {
561 //===----------------------------------------------------------------------===//
563 //===----------------------------------------------------------------------===//
565 static int getFD(StringRef Filename
, std::error_code
&EC
,
566 sys::fs::CreationDisposition Disp
, sys::fs::FileAccess Access
,
567 sys::fs::OpenFlags Flags
) {
568 assert((Access
& sys::fs::FA_Write
) &&
569 "Cannot make a raw_ostream from a read-only descriptor!");
571 // Handle "-" as stdout. Note that when we do this, we consider ourself
572 // the owner of stdout and may set the "binary" flag globally based on Flags.
573 if (Filename
== "-") {
574 EC
= std::error_code();
575 // Change stdout's text/binary mode based on the Flags.
576 sys::ChangeStdoutMode(Flags
);
577 return STDOUT_FILENO
;
581 if (Access
& sys::fs::FA_Read
)
582 EC
= sys::fs::openFileForReadWrite(Filename
, FD
, Disp
, Flags
);
584 EC
= sys::fs::openFileForWrite(Filename
, FD
, Disp
, Flags
);
591 raw_fd_ostream::raw_fd_ostream(StringRef Filename
, std::error_code
&EC
)
592 : raw_fd_ostream(Filename
, EC
, sys::fs::CD_CreateAlways
, sys::fs::FA_Write
,
595 raw_fd_ostream::raw_fd_ostream(StringRef Filename
, std::error_code
&EC
,
596 sys::fs::CreationDisposition Disp
)
597 : raw_fd_ostream(Filename
, EC
, Disp
, sys::fs::FA_Write
, sys::fs::OF_None
) {}
599 raw_fd_ostream::raw_fd_ostream(StringRef Filename
, std::error_code
&EC
,
600 sys::fs::FileAccess Access
)
601 : raw_fd_ostream(Filename
, EC
, sys::fs::CD_CreateAlways
, Access
,
604 raw_fd_ostream::raw_fd_ostream(StringRef Filename
, std::error_code
&EC
,
605 sys::fs::OpenFlags Flags
)
606 : raw_fd_ostream(Filename
, EC
, sys::fs::CD_CreateAlways
, sys::fs::FA_Write
,
609 raw_fd_ostream::raw_fd_ostream(StringRef Filename
, std::error_code
&EC
,
610 sys::fs::CreationDisposition Disp
,
611 sys::fs::FileAccess Access
,
612 sys::fs::OpenFlags Flags
)
613 : raw_fd_ostream(getFD(Filename
, EC
, Disp
, Access
, Flags
), true) {}
615 /// FD is the file descriptor that this writes to. If ShouldClose is true, this
616 /// closes the file when the stream is destroyed.
617 raw_fd_ostream::raw_fd_ostream(int fd
, bool shouldClose
, bool unbuffered
,
619 : raw_pwrite_stream(unbuffered
, K
), FD(fd
), ShouldClose(shouldClose
) {
627 // Do not attempt to close stdout or stderr. We used to try to maintain the
628 // property that tools that support writing file to stdout should not also
629 // write informational output to stdout, but in practice we were never able to
630 // maintain this invariant. Many features have been added to LLVM and clang
631 // (-fdump-record-layouts, optimization remarks, etc) that print to stdout, so
632 // users must simply be aware that mixed output and remarks is a possibility.
633 if (FD
<= STDERR_FILENO
)
637 // Check if this is a console device. This is not equivalent to isatty.
639 ::GetFileType((HANDLE
)::_get_osfhandle(fd
)) == FILE_TYPE_CHAR
;
642 // Get the starting position.
643 off_t loc
= ::lseek(FD
, 0, SEEK_CUR
);
644 sys::fs::file_status Status
;
645 std::error_code EC
= status(FD
, Status
);
646 IsRegularFile
= Status
.type() == sys::fs::file_type::regular_file
;
648 // MSVCRT's _lseek(SEEK_CUR) doesn't return -1 for pipes.
649 SupportsSeeking
= !EC
&& IsRegularFile
;
651 SupportsSeeking
= !EC
&& loc
!= (off_t
)-1;
653 if (!SupportsSeeking
)
656 pos
= static_cast<uint64_t>(loc
);
659 raw_fd_ostream::~raw_fd_ostream() {
663 if (auto EC
= sys::Process::SafelyCloseFileDescriptor(FD
))
669 // On mingw, global dtors should not call exit().
670 // report_fatal_error() invokes exit(). We know report_fatal_error()
671 // might not write messages to stderr when any errors were detected
676 // If there are any pending errors, report them now. Clients wishing
677 // to avoid report_fatal_error calls should check for errors with
678 // has_error() and clear the error flag with clear_error() before
679 // destructing raw_ostream objects which may have errors.
681 report_fatal_error(Twine("IO failure on output stream: ") +
683 /*gen_crash_diag=*/false);
687 // The most reliable way to print unicode in a Windows console is with
688 // WriteConsoleW. To use that, first transcode from UTF-8 to UTF-16. This
689 // assumes that LLVM programs always print valid UTF-8 to the console. The data
690 // might not be UTF-8 for two major reasons:
691 // 1. The program is printing binary (-filetype=obj -o -), in which case it
692 // would have been gibberish anyway.
693 // 2. The program is printing text in a semi-ascii compatible codepage like
694 // shift-jis or cp1252.
696 // Most LLVM programs don't produce non-ascii text unless they are quoting
697 // user source input. A well-behaved LLVM program should either validate that
698 // the input is UTF-8 or transcode from the local codepage to UTF-8 before
699 // quoting it. If they don't, this may mess up the encoding, but this is still
700 // probably the best compromise we can make.
701 static bool write_console_impl(int FD
, StringRef Data
) {
702 SmallVector
<wchar_t, 256> WideText
;
704 // Fall back to ::write if it wasn't valid UTF-8.
705 if (auto EC
= sys::windows::UTF8ToUTF16(Data
, WideText
))
708 // On Windows 7 and earlier, WriteConsoleW has a low maximum amount of data
709 // that can be written to the console at a time.
710 size_t MaxWriteSize
= WideText
.size();
711 if (!RunningWindows8OrGreater())
712 MaxWriteSize
= 32767;
714 size_t WCharsWritten
= 0;
716 size_t WCharsToWrite
=
717 std::min(MaxWriteSize
, WideText
.size() - WCharsWritten
);
718 DWORD ActuallyWritten
;
720 ::WriteConsoleW((HANDLE
)::_get_osfhandle(FD
), &WideText
[WCharsWritten
],
721 WCharsToWrite
, &ActuallyWritten
,
722 /*Reserved=*/nullptr);
724 // The most likely reason for WriteConsoleW to fail is that FD no longer
725 // points to a console. Fall back to ::write. If this isn't the first loop
726 // iteration, something is truly wrong.
730 WCharsWritten
+= ActuallyWritten
;
731 } while (WCharsWritten
!= WideText
.size());
736 void raw_fd_ostream::write_impl(const char *Ptr
, size_t Size
) {
740 assert(FD
>= 0 && "File already closed.");
744 // If this is a Windows console device, try re-encoding from UTF-8 to UTF-16
745 // and using WriteConsoleW. If that fails, fall back to plain write().
746 if (IsWindowsConsole
)
747 if (write_console_impl(FD
, StringRef(Ptr
, Size
)))
751 // The maximum write size is limited to INT32_MAX. A write
752 // greater than SSIZE_MAX is implementation-defined in POSIX,
753 // and Windows _write requires 32 bit input.
754 size_t MaxWriteSize
= INT32_MAX
;
756 #if defined(__linux__)
757 // It is observed that Linux returns EINVAL for a very large write (>2G).
758 // Make it a reasonably small value.
759 MaxWriteSize
= 1024 * 1024 * 1024;
763 size_t ChunkSize
= std::min(Size
, MaxWriteSize
);
764 ssize_t ret
= ::write(FD
, Ptr
, ChunkSize
);
767 // If it's a recoverable error, swallow it and retry the write.
769 // Ideally we wouldn't ever see EAGAIN or EWOULDBLOCK here, since
770 // raw_ostream isn't designed to do non-blocking I/O. However, some
771 // programs, such as old versions of bjam, have mistakenly used
772 // O_NONBLOCK. For compatibility, emulate blocking semantics by
773 // spinning until the write succeeds. If you don't want spinning,
774 // don't use O_NONBLOCK file descriptors with raw_ostream.
775 if (errno
== EINTR
|| errno
== EAGAIN
777 || errno
== EWOULDBLOCK
783 // Windows equivalents of SIGPIPE/EPIPE.
784 DWORD WinLastError
= GetLastError();
785 if (WinLastError
== ERROR_BROKEN_PIPE
||
786 (WinLastError
== ERROR_NO_DATA
&& errno
== EINVAL
)) {
787 llvm::sys::CallOneShotPipeSignalHandler();
791 // Otherwise it's a non-recoverable error. Note it and quit.
792 error_detected(errnoAsErrorCode());
796 // The write may have written some or all of the data. Update the
797 // size and buffer pointer to reflect the remainder that needs
798 // to be written. If there are no bytes left, we're done.
804 void raw_fd_ostream::close() {
808 if (auto EC
= sys::Process::SafelyCloseFileDescriptor(FD
))
813 uint64_t raw_fd_ostream::seek(uint64_t off
) {
814 assert(SupportsSeeking
&& "Stream does not support seeking!");
817 pos
= ::_lseeki64(FD
, off
, SEEK_SET
);
819 pos
= ::lseek(FD
, off
, SEEK_SET
);
821 if (pos
== (uint64_t)-1)
822 error_detected(errnoAsErrorCode());
826 void raw_fd_ostream::pwrite_impl(const char *Ptr
, size_t Size
,
828 uint64_t Pos
= tell();
834 size_t raw_fd_ostream::preferred_buffer_size() const {
836 // Disable buffering for console devices. Console output is re-encoded from
837 // UTF-8 to UTF-16 on Windows, and buffering it would require us to split the
838 // buffer on a valid UTF-8 codepoint boundary. Terminal buffering is disabled
839 // below on most other OSs, so do the same thing on Windows and avoid that
841 if (IsWindowsConsole
)
843 return raw_ostream::preferred_buffer_size();
844 #elif defined(__MVS__)
845 // The buffer size on z/OS is defined with macro BUFSIZ, which can be
846 // retrieved by invoking function raw_ostream::preferred_buffer_size().
847 return raw_ostream::preferred_buffer_size();
849 assert(FD
>= 0 && "File not yet open!");
851 if (fstat(FD
, &statbuf
) != 0)
854 // If this is a terminal, don't use buffering. Line buffering
855 // would be a more traditional thing to do, but it's not worth
857 if (S_ISCHR(statbuf
.st_mode
) && is_displayed())
859 // Return the preferred block size.
860 return statbuf
.st_blksize
;
864 bool raw_fd_ostream::is_displayed() const {
865 return sys::Process::FileDescriptorIsDisplayed(FD
);
868 bool raw_fd_ostream::has_colors() const {
870 HasColors
= sys::Process::FileDescriptorHasColors(FD
);
874 Expected
<sys::fs::FileLocker
> raw_fd_ostream::lock() {
875 std::error_code EC
= sys::fs::lockFile(FD
);
877 return sys::fs::FileLocker(FD
);
878 return errorCodeToError(EC
);
881 Expected
<sys::fs::FileLocker
>
882 raw_fd_ostream::tryLockFor(Duration
const& Timeout
) {
883 std::error_code EC
= sys::fs::tryLockFile(FD
, Timeout
.getDuration());
885 return sys::fs::FileLocker(FD
);
886 return errorCodeToError(EC
);
889 void raw_fd_ostream::anchor() {}
891 //===----------------------------------------------------------------------===//
892 // outs(), errs(), nulls()
893 //===----------------------------------------------------------------------===//
895 raw_fd_ostream
&llvm::outs() {
896 // Set buffer settings to model stdout behavior.
899 EC
= enablezOSAutoConversion(STDOUT_FILENO
);
902 static raw_fd_ostream
S("-", EC
, sys::fs::OF_None
);
907 raw_fd_ostream
&llvm::errs() {
908 // Set standard error to be unbuffered.
910 std::error_code EC
= enablezOSAutoConversion(STDERR_FILENO
);
913 static raw_fd_ostream
S(STDERR_FILENO
, false, true);
917 /// nulls() - This returns a reference to a raw_ostream which discards output.
918 raw_ostream
&llvm::nulls() {
919 static raw_null_ostream S
;
923 //===----------------------------------------------------------------------===//
925 //===----------------------------------------------------------------------===//
927 raw_fd_stream::raw_fd_stream(StringRef Filename
, std::error_code
&EC
)
928 : raw_fd_ostream(getFD(Filename
, EC
, sys::fs::CD_CreateAlways
,
929 sys::fs::FA_Write
| sys::fs::FA_Read
,
931 true, false, OStreamKind::OK_FDStream
) {
935 if (!isRegularFile())
936 EC
= std::make_error_code(std::errc::invalid_argument
);
939 raw_fd_stream::raw_fd_stream(int fd
, bool shouldClose
)
940 : raw_fd_ostream(fd
, shouldClose
, false, OStreamKind::OK_FDStream
) {}
942 ssize_t
raw_fd_stream::read(char *Ptr
, size_t Size
) {
943 assert(get_fd() >= 0 && "File already closed.");
944 ssize_t Ret
= ::read(get_fd(), (void *)Ptr
, Size
);
948 error_detected(errnoAsErrorCode());
952 bool raw_fd_stream::classof(const raw_ostream
*OS
) {
953 return OS
->get_kind() == OStreamKind::OK_FDStream
;
956 //===----------------------------------------------------------------------===//
957 // raw_string_ostream
958 //===----------------------------------------------------------------------===//
960 void raw_string_ostream::write_impl(const char *Ptr
, size_t Size
) {
961 OS
.append(Ptr
, Size
);
964 //===----------------------------------------------------------------------===//
965 // raw_svector_ostream
966 //===----------------------------------------------------------------------===//
968 uint64_t raw_svector_ostream::current_pos() const { return OS
.size(); }
970 void raw_svector_ostream::write_impl(const char *Ptr
, size_t Size
) {
971 OS
.append(Ptr
, Ptr
+ Size
);
974 void raw_svector_ostream::pwrite_impl(const char *Ptr
, size_t Size
,
976 memcpy(OS
.data() + Offset
, Ptr
, Size
);
979 bool raw_svector_ostream::classof(const raw_ostream
*OS
) {
980 return OS
->get_kind() == OStreamKind::OK_SVecStream
;
983 //===----------------------------------------------------------------------===//
985 //===----------------------------------------------------------------------===//
987 raw_null_ostream::~raw_null_ostream() {
989 // ~raw_ostream asserts that the buffer is empty. This isn't necessary
990 // with raw_null_ostream, but it's better to have raw_null_ostream follow
991 // the rules than to change the rules just for raw_null_ostream.
996 void raw_null_ostream::write_impl(const char *Ptr
, size_t Size
) {
999 uint64_t raw_null_ostream::current_pos() const {
1003 void raw_null_ostream::pwrite_impl(const char *Ptr
, size_t Size
,
1006 void raw_pwrite_stream::anchor() {}
1008 void buffer_ostream::anchor() {}
1010 void buffer_unique_ostream::anchor() {}
1012 Error
llvm::writeToOutput(StringRef OutputFileName
,
1013 std::function
<Error(raw_ostream
&)> Write
) {
1014 if (OutputFileName
== "-")
1015 return Write(outs());
1017 if (OutputFileName
== "/dev/null") {
1018 raw_null_ostream Out
;
1022 unsigned Mode
= sys::fs::all_read
| sys::fs::all_write
;
1023 Expected
<sys::fs::TempFile
> Temp
=
1024 sys::fs::TempFile::create(OutputFileName
+ ".temp-stream-%%%%%%", Mode
);
1026 return createFileError(OutputFileName
, Temp
.takeError());
1028 raw_fd_ostream
Out(Temp
->FD
, false);
1030 if (Error E
= Write(Out
)) {
1031 if (Error DiscardError
= Temp
->discard())
1032 return joinErrors(std::move(E
), std::move(DiscardError
));
1037 return Temp
->keep(OutputFileName
);