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