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
64using namespace llvm;
65
66constexpr raw_ostream::Colors raw_ostream::BLACK;
67constexpr raw_ostream::Colors raw_ostream::RED;
68constexpr raw_ostream::Colors raw_ostream::GREEN;
69constexpr raw_ostream::Colors raw_ostream::YELLOW;
70constexpr raw_ostream::Colors raw_ostream::BLUE;
71constexpr raw_ostream::Colors raw_ostream::MAGENTA;
72constexpr raw_ostream::Colors raw_ostream::CYAN;
73constexpr raw_ostream::Colors raw_ostream::WHITE;
74constexpr raw_ostream::Colors raw_ostream::SAVEDCOLOR;
75constexpr raw_ostream::Colors raw_ostream::RESET;
76
77raw_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
87size_t raw_ostream::preferred_buffer_size() const {
88  // BUFSIZ is intended to be a reasonable default.
89  return BUFSIZ;
90}
91
92void 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
101void 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
120raw_ostream &raw_ostream::operator<<(unsigned long N) {
121  write_integer(*this, static_cast<uint64_t>(N), 0, IntegerStyle::Integer);
122  return *this;
123}
124
125raw_ostream &raw_ostream::operator<<(long N) {
126  write_integer(*this, static_cast<int64_t>(N), 0, IntegerStyle::Integer);
127  return *this;
128}
129
130raw_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
135raw_ostream &raw_ostream::operator<<(long long N) {
136  write_integer(*this, static_cast<int64_t>(N), 0, IntegerStyle::Integer);
137  return *this;
138}
139
140raw_ostream &raw_ostream::write_hex(unsigned long long N) {
141  llvm::write_hex(*this, N, HexPrintStyle::Lower);
142  return *this;
143}
144
145raw_ostream &raw_ostream::operator<<(Colors C) {
146  if (C == Colors::RESET)
147    resetColor();
148  else
149    changeColor(C);
150  return *this;
151}
152
153raw_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
163raw_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
203raw_ostream &raw_ostream::operator<<(const void *P) {
204  llvm::write_hex(*this, (uintptr_t)P, HexPrintStyle::PrefixLower);
205  return *this;
206}
207
208raw_ostream &raw_ostream::operator<<(double N) {
209  llvm::write_double(*this, N, FloatStyle::Exponent);
210  return *this;
211}
212
213void 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
220raw_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
240raw_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
283void 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
302void 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.
309raw_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
349raw_ostream &raw_ostream::operator<<(const formatv_object_base &Obj) {
350  Obj.format(*this);
351  return *this;
352}
353
354raw_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
380raw_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
403raw_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
475template <char C>
476static 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.
497raw_ostream &raw_ostream::indent(unsigned NumSpaces) {
498  return write_padding<' '>(*this, NumSpaces);
499}
500
501/// write_zeros - Insert 'NumZeros' nulls.
502raw_ostream &raw_ostream::write_zeros(unsigned NumZeros) {
503  return write_padding<'\0'>(*this, NumZeros);
504}
505
506bool 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
522raw_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
535raw_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
544raw_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
553void raw_ostream::anchor() {}
554
555//===----------------------------------------------------------------------===//
556//  Formatted Output
557//===----------------------------------------------------------------------===//
558
559// Out of line virtual method.
560void format_object_base::home() {
561}
562
563//===----------------------------------------------------------------------===//
564//  raw_fd_ostream
565//===----------------------------------------------------------------------===//
566
567static 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
593raw_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
597raw_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
601raw_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
606raw_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
611raw_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.
619raw_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
660raw_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.
701static 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
736void 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
792void 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
801uint64_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
816void 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
824size_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
853bool raw_fd_ostream::is_displayed() const {
854  return sys::Process::FileDescriptorIsDisplayed(FD);
855}
856
857bool raw_fd_ostream::has_colors() const {
858  if (!HasColors)
859    HasColors = sys::Process::FileDescriptorHasColors(FD);
860  return *HasColors;
861}
862
863Expected<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
870Expected<sys::fs::FileLocker>
871raw_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
878void raw_fd_ostream::anchor() {}
879
880//===----------------------------------------------------------------------===//
881//  outs(), errs(), nulls()
882//===----------------------------------------------------------------------===//
883
884raw_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
892raw_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.
899raw_ostream &llvm::nulls() {
900  static raw_null_ostream S;
901  return S;
902}
903
904//===----------------------------------------------------------------------===//
905// File Streams
906//===----------------------------------------------------------------------===//
907
908raw_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
921ssize_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
931bool 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
939raw_string_ostream::~raw_string_ostream() {
940  flush();
941}
942
943void 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
951uint64_t raw_svector_ostream::current_pos() const { return OS.size(); }
952
953void raw_svector_ostream::write_impl(const char *Ptr, size_t Size) {
954  OS.append(Ptr, Ptr + Size);
955}
956
957void 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
966raw_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
975void raw_null_ostream::write_impl(const char *Ptr, size_t Size) {
976}
977
978uint64_t raw_null_ostream::current_pos() const {
979  return 0;
980}
981
982void raw_null_ostream::pwrite_impl(const char *Ptr, size_t Size,
983                                   uint64_t Offset) {}
984
985void raw_pwrite_stream::anchor() {}
986
987void buffer_ostream::anchor() {}
988
989void buffer_unique_ostream::anchor() {}
990
991Error 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