1 //===--- raw_ostream.cpp - Implement the raw_ostream classes --------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This implements support for bulk buffered stream output.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "llvm/Support/raw_ostream.h"
15 #include "llvm/ADT/STLExtras.h"
16 #include "llvm/ADT/SmallVector.h"
17 #include "llvm/ADT/StringExtras.h"
18 #include "llvm/Config/config.h"
19 #include "llvm/Support/Compiler.h"
20 #include "llvm/Support/ErrorHandling.h"
21 #include "llvm/Support/FileSystem.h"
22 #include "llvm/Support/Format.h"
23 #include "llvm/Support/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"
28 #include <algorithm>
29 #include <cctype>
30 #include <cerrno>
31 #include <cstdio>
32 #include <iterator>
33 #include <sys/stat.h>
34 #include <system_error>
35 
36 // <fcntl.h> may provide O_BINARY.
37 #if defined(HAVE_FCNTL_H)
38 # include <fcntl.h>
39 #endif
40 
41 #if defined(HAVE_UNISTD_H)
42 # include <unistd.h>
43 #endif
44 
45 #if defined(__CYGWIN__)
46 #include <io.h>
47 #endif
48 
49 #if defined(_MSC_VER)
50 #include <io.h>
51 #ifndef STDIN_FILENO
52 # define STDIN_FILENO 0
53 #endif
54 #ifndef STDOUT_FILENO
55 # define STDOUT_FILENO 1
56 #endif
57 #ifndef STDERR_FILENO
58 # define STDERR_FILENO 2
59 #endif
60 #endif
61 
62 #ifdef _WIN32
63 #include "llvm/Support/ConvertUTF.h"
64 #include "Windows/WindowsSupport.h"
65 #endif
66 
67 using namespace llvm;
68 
~raw_ostream()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!");
74 
75   if (BufferMode == InternalBuffer)
76     delete [] OutBufStart;
77 }
78 
preferred_buffer_size() const79 size_t raw_ostream::preferred_buffer_size() const {
80   // BUFSIZ is intended to be a reasonable default.
81   return BUFSIZ;
82 }
83 
SetBuffered()84 void raw_ostream::SetBuffered() {
85   // Ask the subclass to determine an appropriate buffer size.
86   if (size_t Size = preferred_buffer_size())
87     SetBufferSize(Size);
88   else
89     // It may return 0, meaning this stream should be unbuffered.
90     SetUnbuffered();
91 }
92 
SetBufferAndMode(char * BufferStart,size_t Size,BufferKind Mode)93 void raw_ostream::SetBufferAndMode(char *BufferStart, size_t Size,
94                                    BufferKind Mode) {
95   assert(((Mode == Unbuffered && !BufferStart && Size == 0) ||
96           (Mode != Unbuffered && BufferStart && Size != 0)) &&
97          "stream must be unbuffered or have at least one byte");
98   // Make sure the current buffer is free of content (we can't flush here; the
99   // child buffer management logic will be in write_impl).
100   assert(GetNumBytesInBuffer() == 0 && "Current buffer is non-empty!");
101 
102   if (BufferMode == InternalBuffer)
103     delete [] OutBufStart;
104   OutBufStart = BufferStart;
105   OutBufEnd = OutBufStart+Size;
106   OutBufCur = OutBufStart;
107   BufferMode = Mode;
108 
109   assert(OutBufStart <= OutBufEnd && "Invalid size!");
110 }
111 
operator <<(unsigned long N)112 raw_ostream &raw_ostream::operator<<(unsigned long N) {
113   write_integer(*this, static_cast<uint64_t>(N), 0, IntegerStyle::Integer);
114   return *this;
115 }
116 
operator <<(long N)117 raw_ostream &raw_ostream::operator<<(long N) {
118   write_integer(*this, static_cast<int64_t>(N), 0, IntegerStyle::Integer);
119   return *this;
120 }
121 
operator <<(unsigned long long N)122 raw_ostream &raw_ostream::operator<<(unsigned long long N) {
123   write_integer(*this, static_cast<uint64_t>(N), 0, IntegerStyle::Integer);
124   return *this;
125 }
126 
operator <<(long long N)127 raw_ostream &raw_ostream::operator<<(long long N) {
128   write_integer(*this, static_cast<int64_t>(N), 0, IntegerStyle::Integer);
129   return *this;
130 }
131 
write_hex(unsigned long long N)132 raw_ostream &raw_ostream::write_hex(unsigned long long N) {
133   llvm::write_hex(*this, N, HexPrintStyle::Lower);
134   return *this;
135 }
136 
write_uuid(const uuid_t UUID)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)
141       *this << "-";
142   }
143   return *this;
144 }
145 
146 
write_escaped(StringRef Str,bool UseHexEscapes)147 raw_ostream &raw_ostream::write_escaped(StringRef Str,
148                                         bool UseHexEscapes) {
149   for (unsigned char c : Str) {
150     switch (c) {
151     case '\\':
152       *this << '\\' << '\\';
153       break;
154     case '\t':
155       *this << '\\' << 't';
156       break;
157     case '\n':
158       *this << '\\' << 'n';
159       break;
160     case '"':
161       *this << '\\' << '"';
162       break;
163     default:
164       if (isPrint(c)) {
165         *this << c;
166         break;
167       }
168 
169       // Write out the escaped representation.
170       if (UseHexEscapes) {
171         *this << '\\' << 'x';
172         *this << hexdigit((c >> 4 & 0xF));
173         *this << hexdigit((c >> 0) & 0xF);
174       } else {
175         // Always use a full 3-character octal escape.
176         *this << '\\';
177         *this << char('0' + ((c >> 6) & 7));
178         *this << char('0' + ((c >> 3) & 7));
179         *this << char('0' + ((c >> 0) & 7));
180       }
181     }
182   }
183 
184   return *this;
185 }
186 
operator <<(const void * P)187 raw_ostream &raw_ostream::operator<<(const void *P) {
188   llvm::write_hex(*this, (uintptr_t)P, HexPrintStyle::PrefixLower);
189   return *this;
190 }
191 
operator <<(double N)192 raw_ostream &raw_ostream::operator<<(double N) {
193   llvm::write_double(*this, N, FloatStyle::Exponent);
194   return *this;
195 }
196 
flush_nonempty()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);
202 }
203 
write(unsigned char C)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);
210         return *this;
211       }
212       // Set up a buffer and start over.
213       SetBuffered();
214       return write(C);
215     }
216 
217     flush_nonempty();
218   }
219 
220   *OutBufCur++ = C;
221   return *this;
222 }
223 
write(const char * Ptr,size_t Size)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);
230         return *this;
231       }
232       // Set up a buffer and start over.
233       SetBuffered();
234       return write(Ptr, Size);
235     }
236 
237     size_t NumBytes = OutBufEnd - OutBufCur;
238 
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);
250       }
251       copy_to_buffer(Ptr + BytesToWrite, BytesRemaining);
252       return *this;
253     }
254 
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);
258     flush_nonempty();
259     return write(Ptr + NumBytes, Size - NumBytes);
260   }
261 
262   copy_to_buffer(Ptr, Size);
263 
264   return *this;
265 }
266 
copy_to_buffer(const char * Ptr,size_t Size)267 void raw_ostream::copy_to_buffer(const char *Ptr, size_t Size) {
268   assert(Size <= size_t(OutBufEnd - OutBufCur) && "Buffer overrun!");
269 
270   // Handle short strings specially, memcpy isn't very good at very short
271   // strings.
272   switch (Size) {
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;
277   case 0: break;
278   default:
279     memcpy(OutBufCur, Ptr, Size);
280     break;
281   }
282 
283   OutBufCur += Size;
284 }
285 
286 // Formatted output.
operator <<(const format_object_base & Fmt)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);
294 
295     // Common case is that we have plenty of space.
296     if (BytesUsed <= BufferBytesLeft) {
297       OutBufCur += BytesUsed;
298       return *this;
299     }
300 
301     // Otherwise, we overflowed and the return value tells us the size to try
302     // again with.
303     NextBufferSize = BytesUsed;
304   }
305 
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;
310 
311   while (true) {
312     V.resize(NextBufferSize);
313 
314     // Try formatting into the SmallVector.
315     size_t BytesUsed = Fmt.print(V.data(), NextBufferSize);
316 
317     // If BytesUsed fit into the vector, we win.
318     if (BytesUsed <= NextBufferSize)
319       return write(V.data(), BytesUsed);
320 
321     // Otherwise, try again with a new size.
322     assert(BytesUsed > NextBufferSize && "Didn't grow buffer!?");
323     NextBufferSize = BytesUsed;
324   }
325 }
326 
operator <<(const formatv_object_base & Obj)327 raw_ostream &raw_ostream::operator<<(const formatv_object_base &Obj) {
328   SmallString<128> S;
329   Obj.format(*this);
330   return *this;
331 }
332 
operator <<(const FormattedString & FS)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);
336     return *this;
337   }
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);
343     break;
344   case FormattedString::JustifyRight:
345     this->indent(Difference);
346     this->operator<<(FS.Str);
347     break;
348   case FormattedString::JustifyCenter: {
349     int PadAmount = Difference / 2;
350     this->indent(PadAmount);
351     this->operator<<(FS.Str);
352     this->indent(Difference - PadAmount);
353     break;
354   }
355   default:
356     llvm_unreachable("Bad Justification");
357   }
358   return *this;
359 }
360 
operator <<(const FormattedNumber & FN)361 raw_ostream &raw_ostream::operator<<(const FormattedNumber &FN) {
362   if (FN.Hex) {
363     HexPrintStyle Style;
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;
370     else
371       Style = HexPrintStyle::Lower;
372     llvm::write_hex(*this, FN.HexValue, Style, FN.Width);
373   } else {
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());
379     (*this) << Buffer;
380   }
381   return *this;
382 }
383 
operator <<(const FormattedBytes & FB)384 raw_ostream &raw_ostream::operator<<(const FormattedBytes &FB) {
385   if (FB.Bytes.empty())
386     return *this;
387 
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;
399     unsigned Power = 0;
400     if (MaxOffset > 0)
401       Power = llvm::Log2_64_Ceil(MaxOffset);
402     OffsetWidth = std::max<uint64_t>(4, llvm::alignTo(Power, 4) / 4);
403   }
404 
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;
409 
410   while (!Bytes.empty()) {
411     indent(FB.IndentLevel);
412 
413     if (FB.FirstByteOffset.hasValue()) {
414       uint64_t Offset = FB.FirstByteOffset.getValue();
415       llvm::write_hex(*this, Offset + LineIndex, HPS, OffsetWidth);
416       *this << ": ";
417     }
418 
419     auto Line = Bytes.take_front(FB.NumPerLine);
420 
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) {
425         ++CharsPrinted;
426         *this << " ";
427       }
428       llvm::write_hex(*this, Line[I], HPS, 2);
429     }
430 
431     if (FB.ASCII) {
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);
436       *this << "|";
437 
438       // Print the ASCII char values for each byte on this line
439       for (uint8_t Byte : Line) {
440         if (isPrint(Byte))
441           *this << static_cast<char>(Byte);
442         else
443           *this << '.';
444       }
445       *this << '|';
446     }
447 
448     Bytes = Bytes.drop_front(Line.size());
449     LineIndex += Line.size();
450     if (LineIndex < Size)
451       *this << '\n';
452   }
453   return *this;
454 }
455 
456 template <char C>
write_padding(raw_ostream & OS,unsigned NumChars)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};
463 
464   // Usually the indentation is small, handle it with a fastpath.
465   if (NumChars < array_lengthof(Chars))
466     return OS.write(Chars, NumChars);
467 
468   while (NumChars) {
469     unsigned NumToWrite = std::min(NumChars,
470                                    (unsigned)array_lengthof(Chars)-1);
471     OS.write(Chars, NumToWrite);
472     NumChars -= NumToWrite;
473   }
474   return OS;
475 }
476 
477 /// indent - Insert 'NumSpaces' spaces.
indent(unsigned NumSpaces)478 raw_ostream &raw_ostream::indent(unsigned NumSpaces) {
479   return write_padding<' '>(*this, NumSpaces);
480 }
481 
482 /// write_zeros - Insert 'NumZeros' nulls.
write_zeros(unsigned NumZeros)483 raw_ostream &raw_ostream::write_zeros(unsigned NumZeros) {
484   return write_padding<'\0'>(*this, NumZeros);
485 }
486 
anchor()487 void raw_ostream::anchor() {}
488 
489 //===----------------------------------------------------------------------===//
490 //  Formatted Output
491 //===----------------------------------------------------------------------===//
492 
493 // Out of line virtual method.
home()494 void format_object_base::home() {
495 }
496 
497 //===----------------------------------------------------------------------===//
498 //  raw_fd_ostream
499 //===----------------------------------------------------------------------===//
500 
getFD(StringRef Filename,std::error_code & EC,sys::fs::CreationDisposition Disp,sys::fs::FileAccess Access,sys::fs::OpenFlags Flags)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!");
506 
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
512     // possible.
513     if (!(Flags & sys::fs::OF_Text))
514       sys::ChangeStdoutToBinary();
515     return STDOUT_FILENO;
516   }
517 
518   int FD;
519   if (Access & sys::fs::FA_Read)
520     EC = sys::fs::openFileForReadWrite(Filename, FD, Disp, Flags);
521   else
522     EC = sys::fs::openFileForWrite(Filename, FD, Disp, Flags);
523   if (EC)
524     return -1;
525 
526   return FD;
527 }
528 
raw_fd_ostream(StringRef Filename,std::error_code & EC)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,
531                      sys::fs::OF_None) {}
532 
raw_fd_ostream(StringRef Filename,std::error_code & EC,sys::fs::CreationDisposition Disp)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) {}
536 
raw_fd_ostream(StringRef Filename,std::error_code & EC,sys::fs::FileAccess Access)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,
540                      sys::fs::OF_None) {}
541 
raw_fd_ostream(StringRef Filename,std::error_code & EC,sys::fs::OpenFlags Flags)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,
545                      Flags) {}
546 
raw_fd_ostream(StringRef Filename,std::error_code & EC,sys::fs::CreationDisposition Disp,sys::fs::FileAccess Access,sys::fs::OpenFlags Flags)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) {}
552 
553 /// FD is the file descriptor that this writes to.  If ShouldClose is true, this
554 /// closes the file when the stream is destroyed.
raw_fd_ostream(int fd,bool shouldClose,bool unbuffered)555 raw_fd_ostream::raw_fd_ostream(int fd, bool shouldClose, bool unbuffered)
556     : raw_pwrite_stream(unbuffered), FD(fd), ShouldClose(shouldClose) {
557   if (FD < 0 ) {
558     ShouldClose = false;
559     return;
560   }
561 
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)
569     ShouldClose = false;
570 
571 #ifdef _WIN32
572   // Check if this is a console device. This is not equivalent to isatty.
573   IsWindowsConsole =
574       ::GetFileType((HANDLE)::_get_osfhandle(fd)) == FILE_TYPE_CHAR;
575 #endif
576 
577   // Get the starting position.
578   off_t loc = ::lseek(FD, 0, SEEK_CUR);
579 #ifdef _WIN32
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;
584 #else
585   SupportsSeeking = loc != (off_t)-1;
586 #endif
587   if (!SupportsSeeking)
588     pos = 0;
589   else
590     pos = static_cast<uint64_t>(loc);
591 }
592 
~raw_fd_ostream()593 raw_fd_ostream::~raw_fd_ostream() {
594   if (FD >= 0) {
595     flush();
596     if (ShouldClose) {
597       if (auto EC = sys::Process::SafelyCloseFileDescriptor(FD))
598         error_detected(EC);
599     }
600   }
601 
602 #ifdef __MINGW32__
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
606   // on FD == 2.
607   if (FD == 2) return;
608 #endif
609 
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.
614   if (has_error())
615     report_fatal_error("IO failure on output stream: " + error().message(),
616                        /*GenCrashDiag=*/false);
617 }
618 
619 #if defined(_WIN32)
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.
628 //
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.
write_console_impl(int FD,StringRef Data)634 static bool write_console_impl(int FD, StringRef Data) {
635   SmallVector<wchar_t, 256> WideText;
636 
637   // Fall back to ::write if it wasn't valid UTF-8.
638   if (auto EC = sys::windows::UTF8ToUTF16(Data, WideText))
639     return false;
640 
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;
646 
647   size_t WCharsWritten = 0;
648   do {
649     size_t WCharsToWrite =
650         std::min(MaxWriteSize, WideText.size() - WCharsWritten);
651     DWORD ActuallyWritten;
652     bool Success =
653         ::WriteConsoleW((HANDLE)::_get_osfhandle(FD), &WideText[WCharsWritten],
654                         WCharsToWrite, &ActuallyWritten,
655                         /*Reserved=*/nullptr);
656 
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.
660     if (!Success)
661       return false;
662 
663     WCharsWritten += ActuallyWritten;
664   } while (WCharsWritten != WideText.size());
665   return true;
666 }
667 #endif
668 
write_impl(const char * Ptr,size_t Size)669 void raw_fd_ostream::write_impl(const char *Ptr, size_t Size) {
670   assert(FD >= 0 && "File already closed.");
671   pos += Size;
672 
673 #if defined(_WIN32)
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)))
678       return;
679 #endif
680 
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;
685 
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;
690 #endif
691 
692   do {
693     size_t ChunkSize = std::min(Size, MaxWriteSize);
694     ssize_t ret = ::write(FD, Ptr, ChunkSize);
695 
696     if (ret < 0) {
697       // If it's a recoverable error, swallow it and retry the write.
698       //
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
706 #ifdef EWOULDBLOCK
707           || errno == EWOULDBLOCK
708 #endif
709           )
710         continue;
711 
712       // Otherwise it's a non-recoverable error. Note it and quit.
713       error_detected(std::error_code(errno, std::generic_category()));
714       break;
715     }
716 
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.
720     Ptr += ret;
721     Size -= ret;
722   } while (Size > 0);
723 }
724 
close()725 void raw_fd_ostream::close() {
726   assert(ShouldClose);
727   ShouldClose = false;
728   flush();
729   if (auto EC = sys::Process::SafelyCloseFileDescriptor(FD))
730     error_detected(EC);
731   FD = -1;
732 }
733 
seek(uint64_t off)734 uint64_t raw_fd_ostream::seek(uint64_t off) {
735   assert(SupportsSeeking && "Stream does not support seeking!");
736   flush();
737 #ifdef _WIN32
738   pos = ::_lseeki64(FD, off, SEEK_SET);
739 #elif defined(HAVE_LSEEK64)
740   pos = ::lseek64(FD, off, SEEK_SET);
741 #else
742   pos = ::lseek(FD, off, SEEK_SET);
743 #endif
744   if (pos == (uint64_t)-1)
745     error_detected(std::error_code(errno, std::generic_category()));
746   return pos;
747 }
748 
pwrite_impl(const char * Ptr,size_t Size,uint64_t Offset)749 void raw_fd_ostream::pwrite_impl(const char *Ptr, size_t Size,
750                                  uint64_t Offset) {
751   uint64_t Pos = tell();
752   seek(Offset);
753   write(Ptr, Size);
754   seek(Pos);
755 }
756 
preferred_buffer_size() const757 size_t raw_fd_ostream::preferred_buffer_size() const {
758 #if defined(_WIN32)
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
763   // complexity.
764   if (IsWindowsConsole)
765     return 0;
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!");
770   struct stat statbuf;
771   if (fstat(FD, &statbuf) != 0)
772     return 0;
773 
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
776   // the complexity.
777   if (S_ISCHR(statbuf.st_mode) && isatty(FD))
778     return 0;
779   // Return the preferred block size.
780   return statbuf.st_blksize;
781 #else
782   return raw_ostream::preferred_buffer_size();
783 #endif
784 }
785 
changeColor(enum Colors colors,bool bold,bool bg)786 raw_ostream &raw_fd_ostream::changeColor(enum Colors colors, bool bold,
787                                          bool bg) {
788   if (sys::Process::ColorNeedsFlush())
789     flush();
790   const char *colorcode =
791     (colors == SAVEDCOLOR) ? sys::Process::OutputBold(bg)
792     : sys::Process::OutputColor(colors, bold, bg);
793   if (colorcode) {
794     size_t len = strlen(colorcode);
795     write(colorcode, len);
796     // don't account colors towards output characters
797     pos -= len;
798   }
799   return *this;
800 }
801 
resetColor()802 raw_ostream &raw_fd_ostream::resetColor() {
803   if (sys::Process::ColorNeedsFlush())
804     flush();
805   const char *colorcode = sys::Process::ResetColor();
806   if (colorcode) {
807     size_t len = strlen(colorcode);
808     write(colorcode, len);
809     // don't account colors towards output characters
810     pos -= len;
811   }
812   return *this;
813 }
814 
reverseColor()815 raw_ostream &raw_fd_ostream::reverseColor() {
816   if (sys::Process::ColorNeedsFlush())
817     flush();
818   const char *colorcode = sys::Process::OutputReverse();
819   if (colorcode) {
820     size_t len = strlen(colorcode);
821     write(colorcode, len);
822     // don't account colors towards output characters
823     pos -= len;
824   }
825   return *this;
826 }
827 
is_displayed() const828 bool raw_fd_ostream::is_displayed() const {
829   return sys::Process::FileDescriptorIsDisplayed(FD);
830 }
831 
has_colors() const832 bool raw_fd_ostream::has_colors() const {
833   return sys::Process::FileDescriptorHasColors(FD);
834 }
835 
anchor()836 void raw_fd_ostream::anchor() {}
837 
838 //===----------------------------------------------------------------------===//
839 //  outs(), errs(), nulls()
840 //===----------------------------------------------------------------------===//
841 
842 /// outs() - This returns a reference to a raw_ostream for standard output.
843 /// Use it like: outs() << "foo" << "bar";
outs()844 raw_ostream &llvm::outs() {
845   // Set buffer settings to model stdout behavior.
846   std::error_code EC;
847   static raw_fd_ostream S("-", EC, sys::fs::F_None);
848   assert(!EC);
849   return S;
850 }
851 
852 /// errs() - This returns a reference to a raw_ostream for standard error.
853 /// Use it like: errs() << "foo" << "bar";
errs()854 raw_ostream &llvm::errs() {
855   // Set standard error to be unbuffered by default.
856   static raw_fd_ostream S(STDERR_FILENO, false, true);
857   return S;
858 }
859 
860 /// nulls() - This returns a reference to a raw_ostream which discards output.
nulls()861 raw_ostream &llvm::nulls() {
862   static raw_null_ostream S;
863   return S;
864 }
865 
866 //===----------------------------------------------------------------------===//
867 //  raw_string_ostream
868 //===----------------------------------------------------------------------===//
869 
~raw_string_ostream()870 raw_string_ostream::~raw_string_ostream() {
871   flush();
872 }
873 
write_impl(const char * Ptr,size_t Size)874 void raw_string_ostream::write_impl(const char *Ptr, size_t Size) {
875   OS.append(Ptr, Size);
876 }
877 
878 //===----------------------------------------------------------------------===//
879 //  raw_svector_ostream
880 //===----------------------------------------------------------------------===//
881 
current_pos() const882 uint64_t raw_svector_ostream::current_pos() const { return OS.size(); }
883 
write_impl(const char * Ptr,size_t Size)884 void raw_svector_ostream::write_impl(const char *Ptr, size_t Size) {
885   OS.append(Ptr, Ptr + Size);
886 }
887 
pwrite_impl(const char * Ptr,size_t Size,uint64_t Offset)888 void raw_svector_ostream::pwrite_impl(const char *Ptr, size_t Size,
889                                       uint64_t Offset) {
890   memcpy(OS.data() + Offset, Ptr, Size);
891 }
892 
893 //===----------------------------------------------------------------------===//
894 //  raw_null_ostream
895 //===----------------------------------------------------------------------===//
896 
~raw_null_ostream()897 raw_null_ostream::~raw_null_ostream() {
898 #ifndef NDEBUG
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.
902   flush();
903 #endif
904 }
905 
write_impl(const char * Ptr,size_t Size)906 void raw_null_ostream::write_impl(const char *Ptr, size_t Size) {
907 }
908 
current_pos() const909 uint64_t raw_null_ostream::current_pos() const {
910   return 0;
911 }
912 
pwrite_impl(const char * Ptr,size_t Size,uint64_t Offset)913 void raw_null_ostream::pwrite_impl(const char *Ptr, size_t Size,
914                                    uint64_t Offset) {}
915 
anchor()916 void raw_pwrite_stream::anchor() {}
917 
anchor()918 void buffer_ostream::anchor() {}
919