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