LCOV - code coverage report
Current view: top level - lib/Support - raw_ostream.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 344 379 90.8 %
Date: 2018-10-20 13:21:21 Functions: 55 64 85.9 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.13