]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/Support/raw_ostream.cpp
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / Support / raw_ostream.cpp
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
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
79 size_t raw_ostream::preferred_buffer_size() const {
80   // BUFSIZ is intended to be a reasonable default.
81   return BUFSIZ;
82 }
83
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
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
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
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
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
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
132 raw_ostream &raw_ostream::write_hex(unsigned long long N) {
133   llvm::write_hex(*this, N, HexPrintStyle::Lower);
134   return *this;
135 }
136
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
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
187 raw_ostream &raw_ostream::operator<<(const void *P) {
188   llvm::write_hex(*this, (uintptr_t)P, HexPrintStyle::PrefixLower);
189   return *this;
190 }
191
192 raw_ostream &raw_ostream::operator<<(double N) {
193   llvm::write_double(*this, N, FloatStyle::Exponent);
194   return *this;
195 }
196
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
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
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
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.
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
327 raw_ostream &raw_ostream::operator<<(const formatv_object_base &Obj) {
328   SmallString<128> S;
329   Obj.format(*this);
330   return *this;
331 }
332
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
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
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>
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.
478 raw_ostream &raw_ostream::indent(unsigned NumSpaces) {
479   return write_padding<' '>(*this, NumSpaces);
480 }
481
482 /// write_zeros - Insert 'NumZeros' nulls.
483 raw_ostream &raw_ostream::write_zeros(unsigned NumZeros) {
484   return write_padding<'\0'>(*this, NumZeros);
485 }
486
487 void raw_ostream::anchor() {}
488
489 //===----------------------------------------------------------------------===//
490 //  Formatted Output
491 //===----------------------------------------------------------------------===//
492
493 // Out of line virtual method.
494 void format_object_base::home() {
495 }
496
497 //===----------------------------------------------------------------------===//
498 //  raw_fd_ostream
499 //===----------------------------------------------------------------------===//
500
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
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
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
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
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
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.
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
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.
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
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
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
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
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
757 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
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
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
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
828 bool raw_fd_ostream::is_displayed() const {
829   return sys::Process::FileDescriptorIsDisplayed(FD);
830 }
831
832 bool raw_fd_ostream::has_colors() const {
833   return sys::Process::FileDescriptorHasColors(FD);
834 }
835
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";
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";
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.
861 raw_ostream &llvm::nulls() {
862   static raw_null_ostream S;
863   return S;
864 }
865
866 //===----------------------------------------------------------------------===//
867 //  raw_string_ostream
868 //===----------------------------------------------------------------------===//
869
870 raw_string_ostream::~raw_string_ostream() {
871   flush();
872 }
873
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
882 uint64_t raw_svector_ostream::current_pos() const { return OS.size(); }
883
884 void raw_svector_ostream::write_impl(const char *Ptr, size_t Size) {
885   OS.append(Ptr, Ptr + Size);
886 }
887
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
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
906 void raw_null_ostream::write_impl(const char *Ptr, size_t Size) {
907 }
908
909 uint64_t raw_null_ostream::current_pos() const {
910   return 0;
911 }
912
913 void raw_null_ostream::pwrite_impl(const char *Ptr, size_t Size,
914                                    uint64_t Offset) {}
915
916 void raw_pwrite_stream::anchor() {}
917
918 void buffer_ostream::anchor() {}