• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
~raw_ostream()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 
preferred_buffer_size() const78 size_t raw_ostream::preferred_buffer_size() const {
79   // BUFSIZ is intended to be a reasonable default.
80   return BUFSIZ;
81 }
82 
SetBuffered()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 
SetBufferAndMode(char * BufferStart,size_t Size,BufferKind Mode)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 
operator <<(unsigned long N)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 
operator <<(long N)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 
operator <<(unsigned long long N)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 
operator <<(long long N)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 
write_hex(unsigned long long N)131 raw_ostream &raw_ostream::write_hex(unsigned long long N) {
132   llvm::write_hex(*this, N, HexPrintStyle::Lower);
133   return *this;
134 }
135 
write_uuid(const uuid_t UUID)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 
write_escaped(StringRef Str,bool UseHexEscapes)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 (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 
operator <<(const void * P)186 raw_ostream &raw_ostream::operator<<(const void *P) {
187   llvm::write_hex(*this, (uintptr_t)P, HexPrintStyle::PrefixLower);
188   return *this;
189 }
190 
operator <<(double N)191 raw_ostream &raw_ostream::operator<<(double N) {
192   llvm::write_double(*this, N, FloatStyle::Exponent);
193   return *this;
194 }
195 
flush_nonempty()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 
write(unsigned char C)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 
write(const char * Ptr,size_t Size)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 
copy_to_buffer(const char * Ptr,size_t Size)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.
operator <<(const format_object_base & Fmt)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 
operator <<(const formatv_object_base & Obj)326 raw_ostream &raw_ostream::operator<<(const formatv_object_base &Obj) {
327   SmallString<128> S;
328   Obj.format(*this);
329   return *this;
330 }
331 
operator <<(const FormattedString & FS)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 
operator <<(const FormattedNumber & FN)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 
operator <<(const FormattedBytes & FB)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>
write_padding(raw_ostream & OS,unsigned NumChars)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.
indent(unsigned NumSpaces)477 raw_ostream &raw_ostream::indent(unsigned NumSpaces) {
478   return write_padding<' '>(*this, NumSpaces);
479 }
480 
481 /// write_zeros - Insert 'NumZeros' nulls.
write_zeros(unsigned NumZeros)482 raw_ostream &raw_ostream::write_zeros(unsigned NumZeros) {
483   return write_padding<'\0'>(*this, NumZeros);
484 }
485 
anchor()486 void raw_ostream::anchor() {}
487 
488 //===----------------------------------------------------------------------===//
489 //  Formatted Output
490 //===----------------------------------------------------------------------===//
491 
492 // Out of line virtual method.
home()493 void format_object_base::home() {
494 }
495 
496 //===----------------------------------------------------------------------===//
497 //  raw_fd_ostream
498 //===----------------------------------------------------------------------===//
499 
getFD(StringRef Filename,std::error_code & EC,sys::fs::CreationDisposition Disp,sys::fs::FileAccess Access,sys::fs::OpenFlags Flags)500 static int getFD(StringRef Filename, std::error_code &EC,
501                  sys::fs::CreationDisposition Disp, sys::fs::FileAccess Access,
502                  sys::fs::OpenFlags Flags) {
503   assert((Access & sys::fs::FA_Write) &&
504          "Cannot make a raw_ostream from a read-only descriptor!");
505 
506   // Handle "-" as stdout. Note that when we do this, we consider ourself
507   // the owner of stdout and may set the "binary" flag globally based on Flags.
508   if (Filename == "-") {
509     EC = std::error_code();
510     // If user requested binary then put stdout into binary mode if
511     // possible.
512     if (!(Flags & sys::fs::OF_Text))
513       sys::ChangeStdoutToBinary();
514     return STDOUT_FILENO;
515   }
516 
517   int FD;
518   if (Access & sys::fs::FA_Read)
519     EC = sys::fs::openFileForReadWrite(Filename, FD, Disp, Flags);
520   else
521     EC = sys::fs::openFileForWrite(Filename, FD, Disp, Flags);
522   if (EC)
523     return -1;
524 
525   return FD;
526 }
527 
raw_fd_ostream(StringRef Filename,std::error_code & EC)528 raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC)
529     : raw_fd_ostream(Filename, EC, sys::fs::CD_CreateAlways, sys::fs::FA_Write,
530                      sys::fs::OF_None) {}
531 
raw_fd_ostream(StringRef Filename,std::error_code & EC,sys::fs::CreationDisposition Disp)532 raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC,
533                                sys::fs::CreationDisposition Disp)
534     : raw_fd_ostream(Filename, EC, Disp, sys::fs::FA_Write, sys::fs::OF_None) {}
535 
raw_fd_ostream(StringRef Filename,std::error_code & EC,sys::fs::FileAccess Access)536 raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC,
537                                sys::fs::FileAccess Access)
538     : raw_fd_ostream(Filename, EC, sys::fs::CD_CreateAlways, Access,
539                      sys::fs::OF_None) {}
540 
raw_fd_ostream(StringRef Filename,std::error_code & EC,sys::fs::OpenFlags Flags)541 raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC,
542                                sys::fs::OpenFlags Flags)
543     : raw_fd_ostream(Filename, EC, sys::fs::CD_CreateAlways, sys::fs::FA_Write,
544                      Flags) {}
545 
raw_fd_ostream(StringRef Filename,std::error_code & EC,sys::fs::CreationDisposition Disp,sys::fs::FileAccess Access,sys::fs::OpenFlags Flags)546 raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC,
547                                sys::fs::CreationDisposition Disp,
548                                sys::fs::FileAccess Access,
549                                sys::fs::OpenFlags Flags)
550     : raw_fd_ostream(getFD(Filename, EC, Disp, Access, Flags), true) {}
551 
552 /// FD is the file descriptor that this writes to.  If ShouldClose is true, this
553 /// closes the file when the stream is destroyed.
raw_fd_ostream(int fd,bool shouldClose,bool unbuffered)554 raw_fd_ostream::raw_fd_ostream(int fd, bool shouldClose, bool unbuffered)
555     : raw_pwrite_stream(unbuffered), FD(fd), ShouldClose(shouldClose) {
556   if (FD < 0 ) {
557     ShouldClose = false;
558     return;
559   }
560 
561   // Do not attempt to close stdout or stderr. We used to try to maintain the
562   // property that tools that support writing file to stdout should not also
563   // write informational output to stdout, but in practice we were never able to
564   // maintain this invariant. Many features have been added to LLVM and clang
565   // (-fdump-record-layouts, optimization remarks, etc) that print to stdout, so
566   // users must simply be aware that mixed output and remarks is a possibility.
567   if (FD <= STDERR_FILENO)
568     ShouldClose = false;
569 
570   // Get the starting position.
571   off_t loc = ::lseek(FD, 0, SEEK_CUR);
572 #ifdef _WIN32
573   // MSVCRT's _lseek(SEEK_CUR) doesn't return -1 for pipes.
574   sys::fs::file_status Status;
575   std::error_code EC = status(FD, Status);
576   SupportsSeeking = !EC && Status.type() == sys::fs::file_type::regular_file;
577 #else
578   SupportsSeeking = loc != (off_t)-1;
579 #endif
580   if (!SupportsSeeking)
581     pos = 0;
582   else
583     pos = static_cast<uint64_t>(loc);
584 }
585 
~raw_fd_ostream()586 raw_fd_ostream::~raw_fd_ostream() {
587   if (FD >= 0) {
588     flush();
589     if (ShouldClose) {
590       if (auto EC = sys::Process::SafelyCloseFileDescriptor(FD))
591         error_detected(EC);
592     }
593   }
594 
595 #ifdef __MINGW32__
596   // On mingw, global dtors should not call exit().
597   // report_fatal_error() invokes exit(). We know report_fatal_error()
598   // might not write messages to stderr when any errors were detected
599   // on FD == 2.
600   if (FD == 2) return;
601 #endif
602 
603   // If there are any pending errors, report them now. Clients wishing
604   // to avoid report_fatal_error calls should check for errors with
605   // has_error() and clear the error flag with clear_error() before
606   // destructing raw_ostream objects which may have errors.
607   if (has_error())
608     report_fatal_error("IO failure on output stream: " + error().message(),
609                        /*GenCrashDiag=*/false);
610 }
611 
write_impl(const char * Ptr,size_t Size)612 void raw_fd_ostream::write_impl(const char *Ptr, size_t Size) {
613   assert(FD >= 0 && "File already closed.");
614   pos += Size;
615 
616   // The maximum write size is limited to SSIZE_MAX because a write
617   // greater than SSIZE_MAX is implementation-defined in POSIX.
618   // Since SSIZE_MAX is not portable, we use SIZE_MAX >> 1 instead.
619   size_t MaxWriteSize = SIZE_MAX >> 1;
620 
621 #if defined(__linux__)
622   // It is observed that Linux returns EINVAL for a very large write (>2G).
623   // Make it a reasonably small value.
624   MaxWriteSize = 1024 * 1024 * 1024;
625 #elif defined(_WIN32)
626   // Writing a large size of output to Windows console returns ENOMEM. It seems
627   // that, prior to Windows 8, WriteFile() is redirecting to WriteConsole(), and
628   // the latter has a size limit (66000 bytes or less, depending on heap usage).
629   if (::_isatty(FD) && !RunningWindows8OrGreater())
630     MaxWriteSize = 32767;
631 #endif
632 
633   do {
634     size_t ChunkSize = std::min(Size, MaxWriteSize);
635     ssize_t ret = ::write(FD, Ptr, ChunkSize);
636 
637     if (ret < 0) {
638       // If it's a recoverable error, swallow it and retry the write.
639       //
640       // Ideally we wouldn't ever see EAGAIN or EWOULDBLOCK here, since
641       // raw_ostream isn't designed to do non-blocking I/O. However, some
642       // programs, such as old versions of bjam, have mistakenly used
643       // O_NONBLOCK. For compatibility, emulate blocking semantics by
644       // spinning until the write succeeds. If you don't want spinning,
645       // don't use O_NONBLOCK file descriptors with raw_ostream.
646       if (errno == EINTR || errno == EAGAIN
647 #ifdef EWOULDBLOCK
648           || errno == EWOULDBLOCK
649 #endif
650           )
651         continue;
652 
653       // Otherwise it's a non-recoverable error. Note it and quit.
654       error_detected(std::error_code(errno, std::generic_category()));
655       break;
656     }
657 
658     // The write may have written some or all of the data. Update the
659     // size and buffer pointer to reflect the remainder that needs
660     // to be written. If there are no bytes left, we're done.
661     Ptr += ret;
662     Size -= ret;
663   } while (Size > 0);
664 }
665 
close()666 void raw_fd_ostream::close() {
667   assert(ShouldClose);
668   ShouldClose = false;
669   flush();
670   if (auto EC = sys::Process::SafelyCloseFileDescriptor(FD))
671     error_detected(EC);
672   FD = -1;
673 }
674 
seek(uint64_t off)675 uint64_t raw_fd_ostream::seek(uint64_t off) {
676   assert(SupportsSeeking && "Stream does not support seeking!");
677   flush();
678 #ifdef _WIN32
679   pos = ::_lseeki64(FD, off, SEEK_SET);
680 #elif defined(HAVE_LSEEK64)
681   pos = ::lseek64(FD, off, SEEK_SET);
682 #else
683   pos = ::lseek(FD, off, SEEK_SET);
684 #endif
685   if (pos == (uint64_t)-1)
686     error_detected(std::error_code(errno, std::generic_category()));
687   return pos;
688 }
689 
pwrite_impl(const char * Ptr,size_t Size,uint64_t Offset)690 void raw_fd_ostream::pwrite_impl(const char *Ptr, size_t Size,
691                                  uint64_t Offset) {
692   uint64_t Pos = tell();
693   seek(Offset);
694   write(Ptr, Size);
695   seek(Pos);
696 }
697 
preferred_buffer_size() const698 size_t raw_fd_ostream::preferred_buffer_size() const {
699 #if !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(__minix)
700   // Windows and Minix have no st_blksize.
701   assert(FD >= 0 && "File not yet open!");
702   struct stat statbuf;
703   if (fstat(FD, &statbuf) != 0)
704     return 0;
705 
706   // If this is a terminal, don't use buffering. Line buffering
707   // would be a more traditional thing to do, but it's not worth
708   // the complexity.
709   if (S_ISCHR(statbuf.st_mode) && isatty(FD))
710     return 0;
711   // Return the preferred block size.
712   return statbuf.st_blksize;
713 #else
714   return raw_ostream::preferred_buffer_size();
715 #endif
716 }
717 
changeColor(enum Colors colors,bool bold,bool bg)718 raw_ostream &raw_fd_ostream::changeColor(enum Colors colors, bool bold,
719                                          bool bg) {
720   if (sys::Process::ColorNeedsFlush())
721     flush();
722   const char *colorcode =
723     (colors == SAVEDCOLOR) ? sys::Process::OutputBold(bg)
724     : sys::Process::OutputColor(colors, bold, bg);
725   if (colorcode) {
726     size_t len = strlen(colorcode);
727     write(colorcode, len);
728     // don't account colors towards output characters
729     pos -= len;
730   }
731   return *this;
732 }
733 
resetColor()734 raw_ostream &raw_fd_ostream::resetColor() {
735   if (sys::Process::ColorNeedsFlush())
736     flush();
737   const char *colorcode = sys::Process::ResetColor();
738   if (colorcode) {
739     size_t len = strlen(colorcode);
740     write(colorcode, len);
741     // don't account colors towards output characters
742     pos -= len;
743   }
744   return *this;
745 }
746 
reverseColor()747 raw_ostream &raw_fd_ostream::reverseColor() {
748   if (sys::Process::ColorNeedsFlush())
749     flush();
750   const char *colorcode = sys::Process::OutputReverse();
751   if (colorcode) {
752     size_t len = strlen(colorcode);
753     write(colorcode, len);
754     // don't account colors towards output characters
755     pos -= len;
756   }
757   return *this;
758 }
759 
is_displayed() const760 bool raw_fd_ostream::is_displayed() const {
761   return sys::Process::FileDescriptorIsDisplayed(FD);
762 }
763 
has_colors() const764 bool raw_fd_ostream::has_colors() const {
765   return sys::Process::FileDescriptorHasColors(FD);
766 }
767 
anchor()768 void raw_fd_ostream::anchor() {}
769 
770 //===----------------------------------------------------------------------===//
771 //  outs(), errs(), nulls()
772 //===----------------------------------------------------------------------===//
773 
774 /// outs() - This returns a reference to a raw_ostream for standard output.
775 /// Use it like: outs() << "foo" << "bar";
outs()776 raw_ostream &llvm::outs() {
777   // Set buffer settings to model stdout behavior.
778   std::error_code EC;
779   static raw_fd_ostream S("-", EC, sys::fs::F_None);
780   assert(!EC);
781   return S;
782 }
783 
784 /// errs() - This returns a reference to a raw_ostream for standard error.
785 /// Use it like: errs() << "foo" << "bar";
errs()786 raw_ostream &llvm::errs() {
787   // Set standard error to be unbuffered by default.
788   static raw_fd_ostream S(STDERR_FILENO, false, true);
789   return S;
790 }
791 
792 /// nulls() - This returns a reference to a raw_ostream which discards output.
nulls()793 raw_ostream &llvm::nulls() {
794   static raw_null_ostream S;
795   return S;
796 }
797 
798 //===----------------------------------------------------------------------===//
799 //  raw_string_ostream
800 //===----------------------------------------------------------------------===//
801 
~raw_string_ostream()802 raw_string_ostream::~raw_string_ostream() {
803   flush();
804 }
805 
write_impl(const char * Ptr,size_t Size)806 void raw_string_ostream::write_impl(const char *Ptr, size_t Size) {
807   OS.append(Ptr, Size);
808 }
809 
810 //===----------------------------------------------------------------------===//
811 //  raw_svector_ostream
812 //===----------------------------------------------------------------------===//
813 
current_pos() const814 uint64_t raw_svector_ostream::current_pos() const { return OS.size(); }
815 
write_impl(const char * Ptr,size_t Size)816 void raw_svector_ostream::write_impl(const char *Ptr, size_t Size) {
817   OS.append(Ptr, Ptr + Size);
818 }
819 
pwrite_impl(const char * Ptr,size_t Size,uint64_t Offset)820 void raw_svector_ostream::pwrite_impl(const char *Ptr, size_t Size,
821                                       uint64_t Offset) {
822   memcpy(OS.data() + Offset, Ptr, Size);
823 }
824 
825 //===----------------------------------------------------------------------===//
826 //  raw_null_ostream
827 //===----------------------------------------------------------------------===//
828 
~raw_null_ostream()829 raw_null_ostream::~raw_null_ostream() {
830 #ifndef NDEBUG
831   // ~raw_ostream asserts that the buffer is empty. This isn't necessary
832   // with raw_null_ostream, but it's better to have raw_null_ostream follow
833   // the rules than to change the rules just for raw_null_ostream.
834   flush();
835 #endif
836 }
837 
write_impl(const char * Ptr,size_t Size)838 void raw_null_ostream::write_impl(const char *Ptr, size_t Size) {
839 }
840 
current_pos() const841 uint64_t raw_null_ostream::current_pos() const {
842   return 0;
843 }
844 
pwrite_impl(const char * Ptr,size_t Size,uint64_t Offset)845 void raw_null_ostream::pwrite_impl(const char *Ptr, size_t Size,
846                                    uint64_t Offset) {}
847 
anchor()848 void raw_pwrite_stream::anchor() {}
849