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