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