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