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
~raw_ostream()69 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 if (BufferMode == InternalBuffer)
76 delete [] OutBufStart;
77 }
78
preferred_buffer_size() const79 size_t raw_ostream::preferred_buffer_size() const {
80 // BUFSIZ is intended to be a reasonable default.
81 return BUFSIZ;
82 }
83
SetBuffered()84 void raw_ostream::SetBuffered() {
85 // Ask the subclass to determine an appropriate buffer size.
86 if (size_t Size = preferred_buffer_size())
87 SetBufferSize(Size);
88 else
89 // It may return 0, meaning this stream should be unbuffered.
90 SetUnbuffered();
91 }
92
SetBufferAndMode(char * BufferStart,size_t Size,BufferKind Mode)93 void raw_ostream::SetBufferAndMode(char *BufferStart, size_t Size,
94 BufferKind Mode) {
95 assert(((Mode == Unbuffered && !BufferStart && Size == 0) ||
96 (Mode != Unbuffered && BufferStart && Size != 0)) &&
97 "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 // child buffer management logic will be in write_impl).
100 assert(GetNumBytesInBuffer() == 0 && "Current buffer is non-empty!");
101
102 if (BufferMode == InternalBuffer)
103 delete [] OutBufStart;
104 OutBufStart = BufferStart;
105 OutBufEnd = OutBufStart+Size;
106 OutBufCur = OutBufStart;
107 BufferMode = Mode;
108
109 assert(OutBufStart <= OutBufEnd && "Invalid size!");
110 }
111
operator <<(unsigned long N)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
operator <<(long N)117 raw_ostream &raw_ostream::operator<<(long N) {
118 write_integer(*this, static_cast<int64_t>(N), 0, IntegerStyle::Integer);
119 return *this;
120 }
121
operator <<(unsigned long long N)122 raw_ostream &raw_ostream::operator<<(unsigned long long N) {
123 write_integer(*this, static_cast<uint64_t>(N), 0, IntegerStyle::Integer);
124 return *this;
125 }
126
operator <<(long long N)127 raw_ostream &raw_ostream::operator<<(long long N) {
128 write_integer(*this, static_cast<int64_t>(N), 0, IntegerStyle::Integer);
129 return *this;
130 }
131
write_hex(unsigned long long N)132 raw_ostream &raw_ostream::write_hex(unsigned long long N) {
133 llvm::write_hex(*this, N, HexPrintStyle::Lower);
134 return *this;
135 }
136
write_uuid(const uuid_t UUID)137 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 if (Idx == 3 || Idx == 5 || Idx == 7 || Idx == 9)
141 *this << "-";
142 }
143 return *this;
144 }
145
146
write_escaped(StringRef Str,bool UseHexEscapes)147 raw_ostream &raw_ostream::write_escaped(StringRef Str,
148 bool UseHexEscapes) {
149 for (unsigned char c : Str) {
150 switch (c) {
151 case '\\':
152 *this << '\\' << '\\';
153 break;
154 case '\t':
155 *this << '\\' << 't';
156 break;
157 case '\n':
158 *this << '\\' << 'n';
159 break;
160 case '"':
161 *this << '\\' << '"';
162 break;
163 default:
164 if (isPrint(c)) {
165 *this << c;
166 break;
167 }
168
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 }
182 }
183
184 return *this;
185 }
186
operator <<(const void * P)187 raw_ostream &raw_ostream::operator<<(const void *P) {
188 llvm::write_hex(*this, (uintptr_t)P, HexPrintStyle::PrefixLower);
189 return *this;
190 }
191
operator <<(double N)192 raw_ostream &raw_ostream::operator<<(double N) {
193 llvm::write_double(*this, N, FloatStyle::Exponent);
194 return *this;
195 }
196
flush_nonempty()197 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 }
203
write(unsigned char C)204 raw_ostream &raw_ostream::write(unsigned char C) {
205 // Group exceptional cases into a single branch.
206 if (LLVM_UNLIKELY(OutBufCur >= OutBufEnd)) {
207 if (LLVM_UNLIKELY(!OutBufStart)) {
208 if (BufferMode == Unbuffered) {
209 write_impl(reinterpret_cast<char*>(&C), 1);
210 return *this;
211 }
212 // Set up a buffer and start over.
213 SetBuffered();
214 return write(C);
215 }
216
217 flush_nonempty();
218 }
219
220 *OutBufCur++ = C;
221 return *this;
222 }
223
write(const char * Ptr,size_t Size)224 raw_ostream &raw_ostream::write(const char *Ptr, size_t Size) {
225 // Group exceptional cases into a single branch.
226 if (LLVM_UNLIKELY(size_t(OutBufEnd - OutBufCur) < Size)) {
227 if (LLVM_UNLIKELY(!OutBufStart)) {
228 if (BufferMode == Unbuffered) {
229 write_impl(Ptr, Size);
230 return *this;
231 }
232 // Set up a buffer and start over.
233 SetBuffered();
234 return write(Ptr, Size);
235 }
236
237 size_t NumBytes = OutBufEnd - OutBufCur;
238
239 // 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 if (LLVM_UNLIKELY(OutBufCur == OutBufStart)) {
243 assert(NumBytes != 0 && "undefined behavior");
244 size_t BytesToWrite = Size - (Size % NumBytes);
245 write_impl(Ptr, BytesToWrite);
246 size_t BytesRemaining = Size - BytesToWrite;
247 if (BytesRemaining > size_t(OutBufEnd - OutBufCur)) {
248 // Too much left over to copy into our buffer.
249 return write(Ptr + BytesToWrite, BytesRemaining);
250 }
251 copy_to_buffer(Ptr + BytesToWrite, BytesRemaining);
252 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 }
261
262 copy_to_buffer(Ptr, Size);
263
264 return *this;
265 }
266
copy_to_buffer(const char * Ptr,size_t Size)267 void raw_ostream::copy_to_buffer(const char *Ptr, size_t Size) {
268 assert(Size <= size_t(OutBufEnd - OutBufCur) && "Buffer overrun!");
269
270 // 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 case 2: OutBufCur[1] = Ptr[1]; LLVM_FALLTHROUGH;
276 case 1: OutBufCur[0] = Ptr[0]; LLVM_FALLTHROUGH;
277 case 0: break;
278 default:
279 memcpy(OutBufCur, Ptr, Size);
280 break;
281 }
282
283 OutBufCur += Size;
284 }
285
286 // Formatted output.
operator <<(const format_object_base & Fmt)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 size_t NextBufferSize = 127;
291 size_t BufferBytesLeft = OutBufEnd - OutBufCur;
292 if (BufferBytesLeft > 3) {
293 size_t BytesUsed = Fmt.print(OutBufCur, BufferBytesLeft);
294
295 // Common case is that we have plenty of space.
296 if (BytesUsed <= BufferBytesLeft) {
297 OutBufCur += BytesUsed;
298 return *this;
299 }
300
301 // Otherwise, we overflowed and the return value tells us the size to try
302 // again with.
303 NextBufferSize = BytesUsed;
304 }
305
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 SmallVector<char, 128> V;
310
311 while (true) {
312 V.resize(NextBufferSize);
313
314 // Try formatting into the SmallVector.
315 size_t BytesUsed = Fmt.print(V.data(), NextBufferSize);
316
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
operator <<(const formatv_object_base & Obj)327 raw_ostream &raw_ostream::operator<<(const formatv_object_base &Obj) {
328 SmallString<128> S;
329 Obj.format(*this);
330 return *this;
331 }
332
operator <<(const FormattedString & FS)333 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 return *this;
337 }
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 this->indent(Difference);
346 this->operator<<(FS.Str);
347 break;
348 case FormattedString::JustifyCenter: {
349 int PadAmount = Difference / 2;
350 this->indent(PadAmount);
351 this->operator<<(FS.Str);
352 this->indent(Difference - PadAmount);
353 break;
354 }
355 default:
356 llvm_unreachable("Bad Justification");
357 }
358 return *this;
359 }
360
operator <<(const FormattedNumber & FN)361 raw_ostream &raw_ostream::operator<<(const FormattedNumber &FN) {
362 if (FN.Hex) {
363 HexPrintStyle Style;
364 if (FN.Upper && FN.HexPrefix)
365 Style = HexPrintStyle::PrefixUpper;
366 else if (FN.Upper && !FN.HexPrefix)
367 Style = HexPrintStyle::Upper;
368 else if (!FN.Upper && FN.HexPrefix)
369 Style = HexPrintStyle::PrefixLower;
370 else
371 Style = HexPrintStyle::Lower;
372 llvm::write_hex(*this, FN.HexValue, Style, FN.Width);
373 } else {
374 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 (*this) << Buffer;
380 }
381 return *this;
382 }
383
operator <<(const FormattedBytes & FB)384 raw_ostream &raw_ostream::operator<<(const FormattedBytes &FB) {
385 if (FB.Bytes.empty())
386 return *this;
387
388 size_t LineIndex = 0;
389 auto Bytes = FB.Bytes;
390 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 // Figure out how many nibbles are needed to print the largest offset
395 // represented by this data set, so that we can align the offset field
396 // to the right width.
397 size_t Lines = Size / FB.NumPerLine;
398 uint64_t MaxOffset = *FB.FirstByteOffset + Lines * FB.NumPerLine;
399 unsigned Power = 0;
400 if (MaxOffset > 0)
401 Power = llvm::Log2_64_Ceil(MaxOffset);
402 OffsetWidth = std::max<uint64_t>(4, llvm::alignTo(Power, 4) / 4);
403 }
404
405 // The width of a block of data including all spaces for group separators.
406 unsigned NumByteGroups =
407 alignTo(FB.NumPerLine, FB.ByteGroupSize) / FB.ByteGroupSize;
408 unsigned BlockCharWidth = FB.NumPerLine * 2 + NumByteGroups - 1;
409
410 while (!Bytes.empty()) {
411 indent(FB.IndentLevel);
412
413 if (FB.FirstByteOffset.hasValue()) {
414 uint64_t Offset = FB.FirstByteOffset.getValue();
415 llvm::write_hex(*this, Offset + LineIndex, HPS, OffsetWidth);
416 *this << ": ";
417 }
418
419 auto Line = Bytes.take_front(FB.NumPerLine);
420
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 ++CharsPrinted;
426 *this << " ";
427 }
428 llvm::write_hex(*this, Line[I], HPS, 2);
429 }
430
431 if (FB.ASCII) {
432 // Print any spaces needed for any bytes that we didn't print on this
433 // line so that the ASCII bytes are correctly aligned.
434 assert(BlockCharWidth >= CharsPrinted);
435 indent(BlockCharWidth - CharsPrinted + 2);
436 *this << "|";
437
438 // Print the ASCII char values for each byte on this line
439 for (uint8_t Byte : Line) {
440 if (isPrint(Byte))
441 *this << static_cast<char>(Byte);
442 else
443 *this << '.';
444 }
445 *this << '|';
446 }
447
448 Bytes = Bytes.drop_front(Line.size());
449 LineIndex += Line.size();
450 if (LineIndex < Size)
451 *this << '\n';
452 }
453 return *this;
454 }
455
456 template <char C>
write_padding(raw_ostream & OS,unsigned NumChars)457 static raw_ostream &write_padding(raw_ostream &OS, unsigned NumChars) {
458 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
468 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 }
476
477 /// indent - Insert 'NumSpaces' spaces.
indent(unsigned NumSpaces)478 raw_ostream &raw_ostream::indent(unsigned NumSpaces) {
479 return write_padding<' '>(*this, NumSpaces);
480 }
481
482 /// write_zeros - Insert 'NumZeros' nulls.
write_zeros(unsigned NumZeros)483 raw_ostream &raw_ostream::write_zeros(unsigned NumZeros) {
484 return write_padding<'\0'>(*this, NumZeros);
485 }
486
anchor()487 void raw_ostream::anchor() {}
488
489 //===----------------------------------------------------------------------===//
490 // Formatted Output
491 //===----------------------------------------------------------------------===//
492
493 // Out of line virtual method.
home()494 void format_object_base::home() {
495 }
496
497 //===----------------------------------------------------------------------===//
498 // raw_fd_ostream
499 //===----------------------------------------------------------------------===//
500
getFD(StringRef Filename,std::error_code & EC,sys::fs::CreationDisposition Disp,sys::fs::FileAccess Access,sys::fs::OpenFlags Flags)501 static int getFD(StringRef Filename, std::error_code &EC,
502 sys::fs::CreationDisposition Disp, sys::fs::FileAccess Access,
503 sys::fs::OpenFlags Flags) {
504 assert((Access & sys::fs::FA_Write) &&
505 "Cannot make a raw_ostream from a read-only descriptor!");
506
507 // Handle "-" as stdout. Note that when we do this, we consider ourself
508 // the owner of stdout and may set the "binary" flag globally based on Flags.
509 if (Filename == "-") {
510 EC = std::error_code();
511 // If user requested binary then put stdout into binary mode if
512 // possible.
513 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 else
522 EC = sys::fs::openFileForWrite(Filename, FD, Disp, Flags);
523 if (EC)
524 return -1;
525
526 return FD;
527 }
528
raw_fd_ostream(StringRef Filename,std::error_code & EC)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
raw_fd_ostream(StringRef Filename,std::error_code & EC,sys::fs::CreationDisposition Disp)533 raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC,
534 sys::fs::CreationDisposition Disp)
535 : raw_fd_ostream(Filename, EC, Disp, sys::fs::FA_Write, sys::fs::OF_None) {}
536
raw_fd_ostream(StringRef Filename,std::error_code & EC,sys::fs::FileAccess Access)537 raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC,
538 sys::fs::FileAccess Access)
539 : raw_fd_ostream(Filename, EC, sys::fs::CD_CreateAlways, Access,
540 sys::fs::OF_None) {}
541
raw_fd_ostream(StringRef Filename,std::error_code & EC,sys::fs::OpenFlags Flags)542 raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC,
543 sys::fs::OpenFlags Flags)
544 : raw_fd_ostream(Filename, EC, sys::fs::CD_CreateAlways, sys::fs::FA_Write,
545 Flags) {}
546
raw_fd_ostream(StringRef Filename,std::error_code & EC,sys::fs::CreationDisposition Disp,sys::fs::FileAccess Access,sys::fs::OpenFlags Flags)547 raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC,
548 sys::fs::CreationDisposition Disp,
549 sys::fs::FileAccess Access,
550 sys::fs::OpenFlags Flags)
551 : 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.
raw_fd_ostream(int fd,bool shouldClose,bool unbuffered)555 raw_fd_ostream::raw_fd_ostream(int fd, bool shouldClose, bool unbuffered)
556 : raw_pwrite_stream(unbuffered), FD(fd), ShouldClose(shouldClose) {
557 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 // (-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 ShouldClose = false;
570
571 #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 #endif
576
577 // Get the starting position.
578 off_t loc = ::lseek(FD, 0, SEEK_CUR);
579 #ifdef _WIN32
580 // MSVCRT's _lseek(SEEK_CUR) doesn't return -1 for pipes.
581 sys::fs::file_status Status;
582 std::error_code EC = status(FD, Status);
583 SupportsSeeking = !EC && Status.type() == sys::fs::file_type::regular_file;
584 #else
585 SupportsSeeking = loc != (off_t)-1;
586 #endif
587 if (!SupportsSeeking)
588 pos = 0;
589 else
590 pos = static_cast<uint64_t>(loc);
591 }
592
~raw_fd_ostream()593 raw_fd_ostream::~raw_fd_ostream() {
594 if (FD >= 0) {
595 flush();
596 if (ShouldClose) {
597 if (auto EC = sys::Process::SafelyCloseFileDescriptor(FD))
598 error_detected(EC);
599 }
600 }
601
602 #ifdef __MINGW32__
603 // 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 // on FD == 2.
607 if (FD == 2) return;
608 #endif
609
610 // If there are any pending errors, report them now. Clients wishing
611 // to avoid report_fatal_error calls should check for errors with
612 // has_error() and clear the error flag with clear_error() before
613 // destructing raw_ostream objects which may have errors.
614 if (has_error())
615 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 // 1. The program is printing binary (-filetype=obj -o -), in which case it
625 // 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.
write_console_impl(int FD,StringRef Data)634 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 // 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 size_t MaxWriteSize = WideText.size();
644 if (!RunningWindows8OrGreater())
645 MaxWriteSize = 32767;
646
647 size_t WCharsWritten = 0;
648 do {
649 size_t WCharsToWrite =
650 std::min(MaxWriteSize, WideText.size() - WCharsWritten);
651 DWORD ActuallyWritten;
652 bool Success =
653 ::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
write_impl(const char * Ptr,size_t Size)669 void raw_fd_ostream::write_impl(const char *Ptr, size_t Size) {
670 assert(FD >= 0 && "File already closed.");
671 pos += Size;
672
673 #if defined(_WIN32)
674 // 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 //
699 // Ideally we wouldn't ever see EAGAIN or EWOULDBLOCK here, since
700 // raw_ostream isn't designed to do non-blocking I/O. However, some
701 // programs, such as old versions of bjam, have mistakenly used
702 // O_NONBLOCK. For compatibility, emulate blocking semantics by
703 // 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 Ptr += ret;
721 Size -= ret;
722 } while (Size > 0);
723 }
724
close()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
seek(uint64_t off)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
pwrite_impl(const char * Ptr,size_t Size,uint64_t Offset)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
preferred_buffer_size() const757 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 // would be a more traditional thing to do, but it's not worth
776 // the complexity.
777 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
changeColor(enum Colors colors,bool bold,bool bg)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 write(colorcode, len);
796 // don't account colors towards output characters
797 pos -= len;
798 }
799 return *this;
800 }
801
resetColor()802 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 }
812 return *this;
813 }
814
reverseColor()815 raw_ostream &raw_fd_ostream::reverseColor() {
816 if (sys::Process::ColorNeedsFlush())
817 flush();
818 const char *colorcode = sys::Process::OutputReverse();
819 if (colorcode) {
820 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 }
827
is_displayed() const828 bool raw_fd_ostream::is_displayed() const {
829 return sys::Process::FileDescriptorIsDisplayed(FD);
830 }
831
has_colors() const832 bool raw_fd_ostream::has_colors() const {
833 return sys::Process::FileDescriptorHasColors(FD);
834 }
835
anchor()836 void raw_fd_ostream::anchor() {}
837
838 //===----------------------------------------------------------------------===//
839 // outs(), errs(), nulls()
840 //===----------------------------------------------------------------------===//
841
842 /// outs() - This returns a reference to a raw_ostream for standard output.
843 /// Use it like: outs() << "foo" << "bar";
outs()844 raw_ostream &llvm::outs() {
845 // Set buffer settings to model stdout behavior.
846 std::error_code EC;
847 static raw_fd_ostream S("-", EC, sys::fs::F_None);
848 assert(!EC);
849 return S;
850 }
851
852 /// errs() - This returns a reference to a raw_ostream for standard error.
853 /// Use it like: errs() << "foo" << "bar";
errs()854 raw_ostream &llvm::errs() {
855 // Set standard error to be unbuffered by default.
856 static raw_fd_ostream S(STDERR_FILENO, false, true);
857 return S;
858 }
859
860 /// nulls() - This returns a reference to a raw_ostream which discards output.
nulls()861 raw_ostream &llvm::nulls() {
862 static raw_null_ostream S;
863 return S;
864 }
865
866 //===----------------------------------------------------------------------===//
867 // raw_string_ostream
868 //===----------------------------------------------------------------------===//
869
~raw_string_ostream()870 raw_string_ostream::~raw_string_ostream() {
871 flush();
872 }
873
write_impl(const char * Ptr,size_t Size)874 void raw_string_ostream::write_impl(const char *Ptr, size_t Size) {
875 OS.append(Ptr, Size);
876 }
877
878 //===----------------------------------------------------------------------===//
879 // raw_svector_ostream
880 //===----------------------------------------------------------------------===//
881
current_pos() const882 uint64_t raw_svector_ostream::current_pos() const { return OS.size(); }
883
write_impl(const char * Ptr,size_t Size)884 void raw_svector_ostream::write_impl(const char *Ptr, size_t Size) {
885 OS.append(Ptr, Ptr + Size);
886 }
887
pwrite_impl(const char * Ptr,size_t Size,uint64_t Offset)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
893 //===----------------------------------------------------------------------===//
894 // raw_null_ostream
895 //===----------------------------------------------------------------------===//
896
~raw_null_ostream()897 raw_null_ostream::~raw_null_ostream() {
898 #ifndef NDEBUG
899 // ~raw_ostream asserts that the buffer is empty. This isn't necessary
900 // with raw_null_ostream, but it's better to have raw_null_ostream follow
901 // the rules than to change the rules just for raw_null_ostream.
902 flush();
903 #endif
904 }
905
write_impl(const char * Ptr,size_t Size)906 void raw_null_ostream::write_impl(const char *Ptr, size_t Size) {
907 }
908
current_pos() const909 uint64_t raw_null_ostream::current_pos() const {
910 return 0;
911 }
912
pwrite_impl(const char * Ptr,size_t Size,uint64_t Offset)913 void raw_null_ostream::pwrite_impl(const char *Ptr, size_t Size,
914 uint64_t Offset) {}
915
anchor()916 void raw_pwrite_stream::anchor() {}
917
anchor()918 void buffer_ostream::anchor() {}
919