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