blob: 81df38f341c620124df491afa87d29eda97c09c6 [file] [log] [blame]
Chris Lattner84b94f72008-08-17 01:35:29 +00001//===--- 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"
Chandler Carruthed0881b2012-12-03 16:50:05 +000015#include "llvm/ADT/STLExtras.h"
Chris Lattner22b52c92008-08-23 19:23:10 +000016#include "llvm/ADT/SmallVector.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000017#include "llvm/ADT/StringExtras.h"
Chris Lattnerd564f292008-08-22 15:45:00 +000018#include "llvm/Config/config.h"
Daniel Dunbar437b8a52009-03-17 21:15:18 +000019#include "llvm/Support/Compiler.h"
Daniel Dunbardcb50b92009-07-15 08:11:46 +000020#include "llvm/Support/ErrorHandling.h"
Rafael Espindola6d354812013-07-16 19:44:17 +000021#include "llvm/Support/FileSystem.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000022#include "llvm/Support/Format.h"
Zachary Turner11db2642016-11-11 23:57:40 +000023#include "llvm/Support/FormatVariadic.h"
Nick Kledzike6480372014-09-25 20:30:58 +000024#include "llvm/Support/MathExtras.h"
Zachary Turner733be512016-10-11 19:24:45 +000025#include "llvm/Support/NativeFormatting.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000026#include "llvm/Support/Process.h"
27#include "llvm/Support/Program.h"
Eugene Zelenko33d7b762016-08-23 17:14:32 +000028#include <algorithm>
Benjamin Krameref14f802010-01-29 15:19:06 +000029#include <cctype>
Benjamin Kramerce84a252010-05-05 15:17:47 +000030#include <cerrno>
Eugene Zelenko33d7b762016-08-23 17:14:32 +000031#include <cstdio>
32#include <iterator>
Eugene Zelenko33d7b762016-08-23 17:14:32 +000033#include <sys/stat.h>
Zachary Turner733be512016-10-11 19:24:45 +000034#include <system_error>
Chris Lattner84b94f72008-08-17 01:35:29 +000035
NAKAMURA Takumi212c80a2013-07-17 02:21:10 +000036// <fcntl.h> may provide O_BINARY.
37#if defined(HAVE_FCNTL_H)
38# include <fcntl.h>
39#endif
40
Chris Lattnerd564f292008-08-22 15:45:00 +000041#if defined(HAVE_UNISTD_H)
42# include <unistd.h>
43#endif
Argyrios Kyrtzidisb97ff822008-08-17 09:25:21 +000044
NAKAMURA Takumife84f392010-10-19 01:21:55 +000045#if defined(__CYGWIN__)
46#include <io.h>
47#endif
48
Argyrios Kyrtzidisb97ff822008-08-17 09:25:21 +000049#if defined(_MSC_VER)
Chris Lattner84b94f72008-08-17 01:35:29 +000050#include <io.h>
Owen Anderson93719642008-08-21 00:14:44 +000051#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
Chris Lattner84b94f72008-08-17 01:35:29 +000060#endif
61
Nico Weber712e8d22018-04-29 00:45:03 +000062#ifdef _WIN32
Reid Kleckner2b8c6922018-09-05 00:08:56 +000063#include "llvm/Support/ConvertUTF.h"
Yunzhong Gaofb2a9c42016-01-06 00:50:06 +000064#include "Windows/WindowsSupport.h"
65#endif
66
Chris Lattnerd564f292008-08-22 15:45:00 +000067using namespace llvm;
68
Dan Gohman58fcef92009-07-15 23:25:33 +000069raw_ostream::~raw_ostream() {
Dan Gohman1b763292009-07-27 20:49:44 +000070 // 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
Daniel Dunbar317a6cd2009-08-18 23:42:36 +000075 if (BufferMode == InternalBuffer)
76 delete [] OutBufStart;
Dan Gohman58fcef92009-07-15 23:25:33 +000077}
Chris Lattnerd564f292008-08-22 15:45:00 +000078
Chris Lattnerdd3e9aa2009-12-19 01:38:42 +000079size_t raw_ostream::preferred_buffer_size() const {
Dan Gohman84487b92009-08-13 17:27:29 +000080 // BUFSIZ is intended to be a reasonable default.
81 return BUFSIZ;
82}
83
84void raw_ostream::SetBuffered() {
85 // Ask the subclass to determine an appropriate buffer size.
Dan Gohman17710222009-08-15 02:05:19 +000086 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();
Dan Gohman84487b92009-08-13 17:27:29 +000091}
92
Dan Gohmanb452d4e2010-03-24 19:38:02 +000093void raw_ostream::SetBufferAndMode(char *BufferStart, size_t Size,
Nick Lewycky7bfd86d2011-08-28 03:30:02 +000094 BufferKind Mode) {
Craig Topper2617dcc2014-04-15 06:32:26 +000095 assert(((Mode == Unbuffered && !BufferStart && Size == 0) ||
96 (Mode != Unbuffered && BufferStart && Size != 0)) &&
Daniel Dunbar316b4a02009-09-15 20:31:46 +000097 "stream must be unbuffered or have at least one byte");
Daniel Dunbar317a6cd2009-08-18 23:42:36 +000098 // 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!");
Dan Gohman54401d42009-08-13 15:58:55 +0000101
Daniel Dunbar317a6cd2009-08-18 23:42:36 +0000102 if (BufferMode == InternalBuffer)
103 delete [] OutBufStart;
104 OutBufStart = BufferStart;
Dan Gohman54401d42009-08-13 15:58:55 +0000105 OutBufEnd = OutBufStart+Size;
106 OutBufCur = OutBufStart;
Daniel Dunbar317a6cd2009-08-18 23:42:36 +0000107 BufferMode = Mode;
Daniel Dunbarb090bf42009-08-19 17:54:29 +0000108
109 assert(OutBufStart <= OutBufEnd && "Invalid size!");
Dan Gohman54401d42009-08-13 15:58:55 +0000110}
111
Owen Andersond2850532008-08-21 20:58:52 +0000112raw_ostream &raw_ostream::operator<<(unsigned long N) {
Zachary Turner11db2642016-11-11 23:57:40 +0000113 write_integer(*this, static_cast<uint64_t>(N), 0, IntegerStyle::Integer);
Zachary Turner733be512016-10-11 19:24:45 +0000114 return *this;
Owen Andersond2850532008-08-21 20:58:52 +0000115}
116
117raw_ostream &raw_ostream::operator<<(long N) {
Zachary Turner11db2642016-11-11 23:57:40 +0000118 write_integer(*this, static_cast<int64_t>(N), 0, IntegerStyle::Integer);
Zachary Turner733be512016-10-11 19:24:45 +0000119 return *this;
Owen Andersond2850532008-08-21 20:58:52 +0000120}
121
122raw_ostream &raw_ostream::operator<<(unsigned long long N) {
Zachary Turner11db2642016-11-11 23:57:40 +0000123 write_integer(*this, static_cast<uint64_t>(N), 0, IntegerStyle::Integer);
Zachary Turner733be512016-10-11 19:24:45 +0000124 return *this;
Owen Andersond2850532008-08-21 20:58:52 +0000125}
126
127raw_ostream &raw_ostream::operator<<(long long N) {
Zachary Turner11db2642016-11-11 23:57:40 +0000128 write_integer(*this, static_cast<int64_t>(N), 0, IntegerStyle::Integer);
Zachary Turner733be512016-10-11 19:24:45 +0000129 return *this;
Owen Andersond2850532008-08-21 20:58:52 +0000130}
131
Daniel Dunbar6c9629b2009-07-30 18:21:23 +0000132raw_ostream &raw_ostream::write_hex(unsigned long long N) {
Zachary Turner5b2243e2016-10-29 00:27:22 +0000133 llvm::write_hex(*this, N, HexPrintStyle::Lower);
Zachary Turner733be512016-10-11 19:24:45 +0000134 return *this;
Chris Lattner0c19df42008-08-23 22:23:09 +0000135}
136
Adrian Prantl3dcd1222017-09-13 18:22:59 +0000137raw_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
Daniel Dunbar65dc8912010-11-27 07:59:50 +0000147raw_ostream &raw_ostream::write_escaped(StringRef Str,
148 bool UseHexEscapes) {
Craig Topper775fb732016-02-04 06:51:41 +0000149 for (unsigned char c : Str) {
Daniel Dunbar4108c432009-10-17 20:43:08 +0000150 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:
Michael Kruse6f1da6e2018-07-26 15:31:41 +0000164 if (isPrint(c)) {
Daniel Dunbar4108c432009-10-17 20:43:08 +0000165 *this << c;
166 break;
167 }
168
Daniel Dunbar65dc8912010-11-27 07:59:50 +0000169 // 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 }
Daniel Dunbar4108c432009-10-17 20:43:08 +0000181 }
182 }
183
184 return *this;
185}
186
Daniel Dunbar6c9629b2009-07-30 18:21:23 +0000187raw_ostream &raw_ostream::operator<<(const void *P) {
Zachary Turner5b2243e2016-10-29 00:27:22 +0000188 llvm::write_hex(*this, (uintptr_t)P, HexPrintStyle::PrefixLower);
Zachary Turner733be512016-10-11 19:24:45 +0000189 return *this;
Daniel Dunbar6c9629b2009-07-30 18:21:23 +0000190}
191
Chris Lattner06fa1762009-08-24 03:52:50 +0000192raw_ostream &raw_ostream::operator<<(double N) {
Zachary Turner5b2243e2016-10-29 00:27:22 +0000193 llvm::write_double(*this, N, FloatStyle::Exponent);
Zachary Turner733be512016-10-11 19:24:45 +0000194 return *this;
Chris Lattner06fa1762009-08-24 03:52:50 +0000195}
196
Daniel Dunbard24535f2009-03-16 22:55:06 +0000197void raw_ostream::flush_nonempty() {
198 assert(OutBufCur > OutBufStart && "Invalid call to flush_nonempty.");
Daniel Dunbar317a6cd2009-08-18 23:42:36 +0000199 size_t Length = OutBufCur - OutBufStart;
200 OutBufCur = OutBufStart;
201 write_impl(OutBufStart, Length);
Daniel Dunbard24535f2009-03-16 22:55:06 +0000202}
203
Daniel Dunbar7a9bb9e2009-03-16 22:00:17 +0000204raw_ostream &raw_ostream::write(unsigned char C) {
Daniel Dunbar64fa3862009-03-17 01:36:56 +0000205 // Group exceptional cases into a single branch.
Benjamin Kramerbd7f8d02012-08-29 22:57:00 +0000206 if (LLVM_UNLIKELY(OutBufCur >= OutBufEnd)) {
207 if (LLVM_UNLIKELY(!OutBufStart)) {
Daniel Dunbar317a6cd2009-08-18 23:42:36 +0000208 if (BufferMode == Unbuffered) {
Dan Gohman23f90c12009-08-18 20:09:59 +0000209 write_impl(reinterpret_cast<char*>(&C), 1);
210 return *this;
211 }
Daniel Dunbar0cf16862009-08-19 00:23:39 +0000212 // Set up a buffer and start over.
213 SetBuffered();
214 return write(C);
Dan Gohman23f90c12009-08-18 20:09:59 +0000215 }
Daniel Dunbar0cf16862009-08-19 00:23:39 +0000216
217 flush_nonempty();
Daniel Dunbar2d603da2009-03-17 01:13:35 +0000218 }
219
Daniel Dunbar7a9bb9e2009-03-16 22:00:17 +0000220 *OutBufCur++ = C;
Daniel Dunbar87862182009-03-16 22:08:44 +0000221 return *this;
Daniel Dunbar7a9bb9e2009-03-16 22:00:17 +0000222}
Chris Lattner0c19df42008-08-23 22:23:09 +0000223
Dan Gohmanf199ad62009-07-16 15:24:40 +0000224raw_ostream &raw_ostream::write(const char *Ptr, size_t Size) {
Daniel Dunbar64fa3862009-03-17 01:36:56 +0000225 // Group exceptional cases into a single branch.
Benjamin Kramerbd7f8d02012-08-29 22:57:00 +0000226 if (LLVM_UNLIKELY(size_t(OutBufEnd - OutBufCur) < Size)) {
227 if (LLVM_UNLIKELY(!OutBufStart)) {
Daniel Dunbar317a6cd2009-08-18 23:42:36 +0000228 if (BufferMode == Unbuffered) {
Dan Gohman52022c22009-08-13 15:44:52 +0000229 write_impl(Ptr, Size);
230 return *this;
231 }
232 // Set up a buffer and start over.
Dan Gohman84487b92009-08-13 17:27:29 +0000233 SetBuffered();
Dan Gohman52022c22009-08-13 15:44:52 +0000234 return write(Ptr, Size);
235 }
Daniel Dunbar0cf16862009-08-19 00:23:39 +0000236
Benjamin Kramerdfb0ad32011-03-04 19:49:30 +0000237 size_t NumBytes = OutBufEnd - OutBufCur;
238
Benjamin Krameracf08422011-03-04 18:18:16 +0000239 // If the buffer is empty at this point we have a string that is larger
Benjamin Kramerdfb0ad32011-03-04 19:49:30 +0000240 // than the buffer. Directly write the chunk that is a multiple of the
241 // preferred buffer size and put the remainder in the buffer.
Benjamin Kramerbd7f8d02012-08-29 22:57:00 +0000242 if (LLVM_UNLIKELY(OutBufCur == OutBufStart)) {
Michael Ilseman5be22a12014-12-12 21:48:03 +0000243 assert(NumBytes != 0 && "undefined behavior");
Benjamin Kramerdfb0ad32011-03-04 19:49:30 +0000244 size_t BytesToWrite = Size - (Size % NumBytes);
245 write_impl(Ptr, BytesToWrite);
Matt Beaumont-Gaya182be82013-03-12 23:55:24 +0000246 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);
Benjamin Krameracf08422011-03-04 18:18:16 +0000252 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.
Benjamin Krameracf08422011-03-04 18:18:16 +0000257 copy_to_buffer(Ptr, NumBytes);
258 flush_nonempty();
259 return write(Ptr + NumBytes, Size - NumBytes);
Daniel Dunbar64fa3862009-03-17 01:36:56 +0000260 }
Dan Gohman52022c22009-08-13 15:44:52 +0000261
262 copy_to_buffer(Ptr, Size);
263
264 return *this;
265}
266
267void raw_ostream::copy_to_buffer(const char *Ptr, size_t Size) {
Dan Gohmanc04a00a2009-08-13 20:32:03 +0000268 assert(Size <= size_t(OutBufEnd - OutBufCur) && "Buffer overrun!");
Dan Gohman98205552009-08-13 18:38:15 +0000269
Owen Andersond2850532008-08-21 20:58:52 +0000270 // Handle short strings specially, memcpy isn't very good at very short
271 // strings.
272 switch (Size) {
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000273 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;
Owen Andersond2850532008-08-21 20:58:52 +0000277 case 0: break;
278 default:
Dan Gohman52022c22009-08-13 15:44:52 +0000279 memcpy(OutBufCur, Ptr, Size);
Owen Andersond2850532008-08-21 20:58:52 +0000280 break;
281 }
Daniel Dunbar3da6a702009-03-10 16:21:55 +0000282
Dan Gohman52022c22009-08-13 15:44:52 +0000283 OutBufCur += Size;
Owen Andersond2850532008-08-21 20:58:52 +0000284}
285
Chris Lattner22b52c92008-08-23 19:23:10 +0000286// Formatted output.
287raw_ostream &raw_ostream::operator<<(const format_object_base &Fmt) {
Daniel Dunbar64fa3862009-03-17 01:36:56 +0000288 // If we have more than a few bytes left in our output buffer, try
289 // formatting directly onto its end.
Dan Gohmanf199ad62009-07-16 15:24:40 +0000290 size_t NextBufferSize = 127;
Daniel Dunbar47a309c2009-08-23 20:31:39 +0000291 size_t BufferBytesLeft = OutBufEnd - OutBufCur;
292 if (BufferBytesLeft > 3) {
Dan Gohmanf199ad62009-07-16 15:24:40 +0000293 size_t BytesUsed = Fmt.print(OutBufCur, BufferBytesLeft);
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000294
Chris Lattner22b52c92008-08-23 19:23:10 +0000295 // Common case is that we have plenty of space.
Daniel Dunbar47a309c2009-08-23 20:31:39 +0000296 if (BytesUsed <= BufferBytesLeft) {
Chris Lattner22b52c92008-08-23 19:23:10 +0000297 OutBufCur += BytesUsed;
298 return *this;
299 }
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000300
Chris Lattner22b52c92008-08-23 19:23:10 +0000301 // Otherwise, we overflowed and the return value tells us the size to try
302 // again with.
303 NextBufferSize = BytesUsed;
304 }
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000305
Chris Lattner22b52c92008-08-23 19:23:10 +0000306 // 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;
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000310
Eugene Zelenko33d7b762016-08-23 17:14:32 +0000311 while (true) {
Chris Lattner22b52c92008-08-23 19:23:10 +0000312 V.resize(NextBufferSize);
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000313
Chris Lattner22b52c92008-08-23 19:23:10 +0000314 // Try formatting into the SmallVector.
Daniel Dunbar47a309c2009-08-23 20:31:39 +0000315 size_t BytesUsed = Fmt.print(V.data(), NextBufferSize);
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000316
Chris Lattner22b52c92008-08-23 19:23:10 +0000317 // If BytesUsed fit into the vector, we win.
Chris Lattner2bfc72e2008-10-26 19:20:47 +0000318 if (BytesUsed <= NextBufferSize)
Daniel Dunbar47a309c2009-08-23 20:31:39 +0000319 return write(V.data(), BytesUsed);
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000320
Chris Lattner22b52c92008-08-23 19:23:10 +0000321 // Otherwise, try again with a new size.
322 assert(BytesUsed > NextBufferSize && "Didn't grow buffer!?");
323 NextBufferSize = BytesUsed;
324 }
325}
326
Zachary Turner11db2642016-11-11 23:57:40 +0000327raw_ostream &raw_ostream::operator<<(const formatv_object_base &Obj) {
328 SmallString<128> S;
329 Obj.format(*this);
330 return *this;
331}
332
Nick Kledzike6480372014-09-25 20:30:58 +0000333raw_ostream &raw_ostream::operator<<(const FormattedString &FS) {
Frederich Munch5e9d6d02017-07-13 16:11:08 +0000334 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;
Nick Kledzike6480372014-09-25 20:30:58 +0000350 this->indent(PadAmount);
Frederich Munch5e9d6d02017-07-13 16:11:08 +0000351 this->operator<<(FS.Str);
352 this->indent(Difference - PadAmount);
353 break;
354 }
355 default:
356 llvm_unreachable("Bad Justification");
357 }
Nick Kledzike6480372014-09-25 20:30:58 +0000358 return *this;
359}
360
361raw_ostream &raw_ostream::operator<<(const FormattedNumber &FN) {
362 if (FN.Hex) {
Zachary Turner5b2243e2016-10-29 00:27:22 +0000363 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);
Nick Kledzike6480372014-09-25 20:30:58 +0000373 } else {
Zachary Turner5b2243e2016-10-29 00:27:22 +0000374 llvm::SmallString<16> Buffer;
375 llvm::raw_svector_ostream Stream(Buffer);
Zachary Turner11db2642016-11-11 23:57:40 +0000376 llvm::write_integer(Stream, FN.DecValue, 0, IntegerStyle::Integer);
Zachary Turner5b2243e2016-10-29 00:27:22 +0000377 if (Buffer.size() < FN.Width)
378 indent(FN.Width - Buffer.size());
379 (*this) << Buffer;
Nick Kledzike6480372014-09-25 20:30:58 +0000380 }
Zachary Turner733be512016-10-11 19:24:45 +0000381 return *this;
Nick Kledzike6480372014-09-25 20:30:58 +0000382}
383
Zachary Turner4a86af02016-11-10 20:16:45 +0000384raw_ostream &raw_ostream::operator<<(const FormattedBytes &FB) {
385 if (FB.Bytes.empty())
386 return *this;
387
Greg Claytonbde0a162016-11-09 00:15:54 +0000388 size_t LineIndex = 0;
Zachary Turner4a86af02016-11-10 20:16:45 +0000389 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);
Zachary Turner805d43a2016-11-10 20:35:21 +0000402 OffsetWidth = std::max<uint64_t>(4, llvm::alignTo(Power, 4) / 4);
Zachary Turner4a86af02016-11-10 20:16:45 +0000403 }
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
Greg Claytonbde0a162016-11-09 00:15:54 +0000413 if (FB.FirstByteOffset.hasValue()) {
414 uint64_t Offset = FB.FirstByteOffset.getValue();
Zachary Turner4a86af02016-11-10 20:16:45 +0000415 llvm::write_hex(*this, Offset + LineIndex, HPS, OffsetWidth);
Greg Claytonbde0a162016-11-09 00:15:54 +0000416 *this << ": ";
417 }
Zachary Turner4a86af02016-11-10 20:16:45 +0000418
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;
Greg Claytonbde0a162016-11-09 00:15:54 +0000426 *this << " ";
Zachary Turner4a86af02016-11-10 20:16:45 +0000427 }
428 llvm::write_hex(*this, Line[I], HPS, 2);
Greg Claytonbde0a162016-11-09 00:15:54 +0000429 }
Zachary Turner4a86af02016-11-10 20:16:45 +0000430
Greg Claytonbde0a162016-11-09 00:15:54 +0000431 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.
Zachary Turner4a86af02016-11-10 20:16:45 +0000434 assert(BlockCharWidth >= CharsPrinted);
435 indent(BlockCharWidth - CharsPrinted + 2);
436 *this << "|";
437
Greg Claytonbde0a162016-11-09 00:15:54 +0000438 // Print the ASCII char values for each byte on this line
Zachary Turner4a86af02016-11-10 20:16:45 +0000439 for (uint8_t Byte : Line) {
Michael Kruse6f1da6e2018-07-26 15:31:41 +0000440 if (isPrint(Byte))
Zachary Turner4a86af02016-11-10 20:16:45 +0000441 *this << static_cast<char>(Byte);
Greg Claytonbde0a162016-11-09 00:15:54 +0000442 else
443 *this << '.';
444 }
445 *this << '|';
446 }
Zachary Turner4a86af02016-11-10 20:16:45 +0000447
448 Bytes = Bytes.drop_front(Line.size());
449 LineIndex += Line.size();
Greg Claytonbde0a162016-11-09 00:15:54 +0000450 if (LineIndex < Size)
451 *this << '\n';
452 }
453 return *this;
454}
455
Peter Collingbourne070777d2018-05-17 22:11:43 +0000456template <char C>
457static 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};
Chris Lattnere6db2c32009-08-22 23:10:29 +0000463
464 // Usually the indentation is small, handle it with a fastpath.
Peter Collingbourne070777d2018-05-17 22:11:43 +0000465 if (NumChars < array_lengthof(Chars))
466 return OS.write(Chars, NumChars);
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000467
Peter Collingbourne070777d2018-05-17 22:11:43 +0000468 while (NumChars) {
469 unsigned NumToWrite = std::min(NumChars,
470 (unsigned)array_lengthof(Chars)-1);
471 OS.write(Chars, NumToWrite);
472 NumChars -= NumToWrite;
Chris Lattnere6db2c32009-08-22 23:10:29 +0000473 }
Peter Collingbourne070777d2018-05-17 22:11:43 +0000474 return OS;
475}
476
477/// indent - Insert 'NumSpaces' spaces.
478raw_ostream &raw_ostream::indent(unsigned NumSpaces) {
479 return write_padding<' '>(*this, NumSpaces);
480}
481
482/// write_zeros - Insert 'NumZeros' nulls.
483raw_ostream &raw_ostream::write_zeros(unsigned NumZeros) {
484 return write_padding<'\0'>(*this, NumZeros);
Chris Lattnere6db2c32009-08-22 23:10:29 +0000485}
486
Weiming Zhao1bd40002018-04-11 23:09:20 +0000487void raw_ostream::anchor() {}
488
Chris Lattner22b52c92008-08-23 19:23:10 +0000489//===----------------------------------------------------------------------===//
490// Formatted Output
491//===----------------------------------------------------------------------===//
492
493// Out of line virtual method.
494void format_object_base::home() {
495}
496
Chris Lattner84b94f72008-08-17 01:35:29 +0000497//===----------------------------------------------------------------------===//
498// raw_fd_ostream
499//===----------------------------------------------------------------------===//
500
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000501static int getFD(StringRef Filename, std::error_code &EC,
Zachary Turner1f67a3c2018-06-07 19:58:58 +0000502 sys::fs::CreationDisposition Disp, sys::fs::FileAccess Access,
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000503 sys::fs::OpenFlags Flags) {
Zachary Turner1f67a3c2018-06-07 19:58:58 +0000504 assert((Access & sys::fs::FA_Write) &&
505 "Cannot make a raw_ostream from a read-only descriptor!");
506
Dan Gohmanc825cee2010-08-18 22:26:19 +0000507 // Handle "-" as stdout. Note that when we do this, we consider ourself
Yaron Keren80745c52017-03-31 12:08:45 +0000508 // the owner of stdout and may set the "binary" flag globally based on Flags.
Rafael Espindola3fd1e992014-08-25 18:16:47 +0000509 if (Filename == "-") {
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000510 EC = std::error_code();
Daniel Dunbared90e702008-11-13 05:01:07 +0000511 // If user requested binary then put stdout into binary mode if
512 // possible.
Zachary Turner1f67a3c2018-06-07 19:58:58 +0000513 if (!(Flags & sys::fs::OF_Text))
Rafael Espindolacb2eca02013-06-12 20:58:35 +0000514 sys::ChangeStdoutToBinary();
Yaron Keren9d27c472017-03-30 19:30:51 +0000515 return STDOUT_FILENO;
Chris Lattnerd5bc0682008-08-17 03:53:23 +0000516 }
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000517
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000518 int FD;
Zachary Turner1f67a3c2018-06-07 19:58:58 +0000519 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);
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000523 if (EC)
524 return -1;
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000525
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000526 return FD;
Chris Lattner84b94f72008-08-17 01:35:29 +0000527}
528
Zachary Turner1f67a3c2018-06-07 19:58:58 +0000529raw_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
533raw_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
537raw_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
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000542raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC,
543 sys::fs::OpenFlags Flags)
Zachary Turner1f67a3c2018-06-07 19:58:58 +0000544 : raw_fd_ostream(Filename, EC, sys::fs::CD_CreateAlways, sys::fs::FA_Write,
545 Flags) {}
546
547raw_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) {}
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000552
Rafael Espindola62e6ec02015-04-09 16:59:07 +0000553/// FD is the file descriptor that this writes to. If ShouldClose is true, this
554/// closes the file when the stream is destroyed.
Francois Picheta3037c32010-10-14 20:30:58 +0000555raw_fd_ostream::raw_fd_ostream(int fd, bool shouldClose, bool unbuffered)
Bob Haarman9ce2d032017-10-24 01:26:22 +0000556 : raw_pwrite_stream(unbuffered), FD(fd), ShouldClose(shouldClose) {
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000557 if (FD < 0 ) {
558 ShouldClose = false;
559 return;
560 }
Reid Kleckner02aeadc2017-08-04 01:39:23 +0000561
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.
Yaron Keren9d27c472017-03-30 19:30:51 +0000568 if (FD <= STDERR_FILENO)
569 ShouldClose = false;
Michael J. Spencerb7479902011-01-17 15:53:12 +0000570
Reid Kleckner2b8c6922018-09-05 00:08:56 +0000571#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
Michael J. Spencerb7479902011-01-17 15:53:12 +0000577 // Get the starting position.
578 off_t loc = ::lseek(FD, 0, SEEK_CUR);
Nico Weber712e8d22018-04-29 00:45:03 +0000579#ifdef _WIN32
Rafael Espindolaa9b84ab2015-04-13 11:09:48 +0000580 // 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
Rafael Espindola74d2f612015-04-10 18:15:51 +0000585 SupportsSeeking = loc != (off_t)-1;
Rafael Espindolaa9b84ab2015-04-13 11:09:48 +0000586#endif
Rafael Espindola74d2f612015-04-10 18:15:51 +0000587 if (!SupportsSeeking)
Michael J. Spencerb7479902011-01-17 15:53:12 +0000588 pos = 0;
589 else
590 pos = static_cast<uint64_t>(loc);
Francois Picheta3037c32010-10-14 20:30:58 +0000591}
592
Chris Lattner84b94f72008-08-17 01:35:29 +0000593raw_fd_ostream::~raw_fd_ostream() {
Dan Gohman38adfdd2010-08-20 16:34:20 +0000594 if (FD >= 0) {
595 flush();
Bob Haarman9ce2d032017-10-24 01:26:22 +0000596 if (ShouldClose) {
597 if (auto EC = sys::Process::SafelyCloseFileDescriptor(FD))
598 error_detected(EC);
599 }
Dan Gohman38adfdd2010-08-20 16:34:20 +0000600 }
601
NAKAMURA Takumi76e68ea2011-03-16 02:53:39 +0000602#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
Dan Gohman38adfdd2010-08-20 16:34:20 +0000610 // 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())
Bob Haarman9ce2d032017-10-24 01:26:22 +0000615 report_fatal_error("IO failure on output stream: " + error().message(),
616 /*GenCrashDiag=*/false);
Chris Lattnerce3b2c32010-08-17 23:11:56 +0000617}
Chris Lattner9e6f1f12009-08-23 02:51:22 +0000618
Reid Kleckner2b8c6922018-09-05 00:08:56 +0000619#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.
634static 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
Dan Gohmanf199ad62009-07-16 15:24:40 +0000669void raw_fd_ostream::write_impl(const char *Ptr, size_t Size) {
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000670 assert(FD >= 0 && "File already closed.");
Daniel Dunbardb7a36c2009-03-16 23:29:31 +0000671 pos += Size;
Dan Gohmanef969f32010-05-06 01:27:36 +0000672
Reid Kleckner2b8c6922018-09-05 00:08:56 +0000673#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
Owen Reynoldsa489d112018-08-06 16:21:41 +0000681 // 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;
Rui Ueyama412b29e2017-10-31 17:37:20 +0000685
Saleem Abdulrasool8199dad2017-06-20 20:51:51 +0000686#if defined(__linux__)
Rui Ueyama412b29e2017-10-31 17:37:20 +0000687 // 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;
Yunzhong Gaofb2a9c42016-01-06 00:50:06 +0000690#endif
691
Benjamin Kramerce84a252010-05-05 15:17:47 +0000692 do {
Rui Ueyama412b29e2017-10-31 17:37:20 +0000693 size_t ChunkSize = std::min(Size, MaxWriteSize);
Yunzhong Gaofb2a9c42016-01-06 00:50:06 +0000694 ssize_t ret = ::write(FD, Ptr, ChunkSize);
Dan Gohmanef969f32010-05-06 01:27:36 +0000695
696 if (ret < 0) {
697 // If it's a recoverable error, swallow it and retry the write.
Dan Gohmandea53102010-05-18 15:25:14 +0000698 //
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.
Dan Gohmand3511162010-05-06 02:06:20 +0000705 if (errno == EINTR || errno == EAGAIN
706#ifdef EWOULDBLOCK
707 || errno == EWOULDBLOCK
708#endif
709 )
Dan Gohmanef969f32010-05-06 01:27:36 +0000710 continue;
711
712 // Otherwise it's a non-recoverable error. Note it and quit.
Bob Haarman9ce2d032017-10-24 01:26:22 +0000713 error_detected(std::error_code(errno, std::generic_category()));
Dan Gohmanef969f32010-05-06 01:27:36 +0000714 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);
Chris Lattner84b94f72008-08-17 01:35:29 +0000723}
724
Dan Gohman44790e72010-08-18 01:34:52 +0000725void raw_fd_ostream::close() {
726 assert(ShouldClose);
727 ShouldClose = false;
728 flush();
Bob Haarman9ce2d032017-10-24 01:26:22 +0000729 if (auto EC = sys::Process::SafelyCloseFileDescriptor(FD))
730 error_detected(EC);
Dan Gohman44790e72010-08-18 01:34:52 +0000731 FD = -1;
732}
733
Ted Kremeneka2669922009-01-26 21:42:04 +0000734uint64_t raw_fd_ostream::seek(uint64_t off) {
Yaron Keren7cf7f802016-02-23 07:17:58 +0000735 assert(SupportsSeeking && "Stream does not support seeking!");
Ted Kremeneka2669922009-01-26 21:42:04 +0000736 flush();
Nico Weber712e8d22018-04-29 00:45:03 +0000737#ifdef _WIN32
Peter Collingbourne8db7e5e2016-12-09 05:20:43 +0000738 pos = ::_lseeki64(FD, off, SEEK_SET);
739#elif defined(HAVE_LSEEK64)
740 pos = ::lseek64(FD, off, SEEK_SET);
741#else
Peter Collingbournef74fcdd2016-12-09 05:04:30 +0000742 pos = ::lseek(FD, off, SEEK_SET);
Peter Collingbourne8db7e5e2016-12-09 05:20:43 +0000743#endif
Rafael Espindola642a2212015-04-14 22:54:16 +0000744 if (pos == (uint64_t)-1)
Bob Haarman9ce2d032017-10-24 01:26:22 +0000745 error_detected(std::error_code(errno, std::generic_category()));
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000746 return pos;
Ted Kremeneka2669922009-01-26 21:42:04 +0000747}
748
Rafael Espindola4ba9af12015-04-20 13:04:30 +0000749void raw_fd_ostream::pwrite_impl(const char *Ptr, size_t Size,
750 uint64_t Offset) {
Rafael Espindola37b70152015-04-14 15:00:34 +0000751 uint64_t Pos = tell();
752 seek(Offset);
753 write(Ptr, Size);
754 seek(Pos);
755}
756
Chris Lattnerdd3e9aa2009-12-19 01:38:42 +0000757size_t raw_fd_ostream::preferred_buffer_size() const {
Reid Kleckner2b8c6922018-09-05 00:08:56 +0000758#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.
Dan Gohman84487b92009-08-13 17:27:29 +0000769 assert(FD >= 0 && "File not yet open!");
770 struct stat statbuf;
Chris Lattnerdd3e9aa2009-12-19 01:38:42 +0000771 if (fstat(FD, &statbuf) != 0)
772 return 0;
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000773
Chris Lattnerdd3e9aa2009-12-19 01:38:42 +0000774 // 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;
Dan Gohmanfeaeb362010-05-28 16:50:01 +0000781#else
Dan Gohman84487b92009-08-13 17:27:29 +0000782 return raw_ostream::preferred_buffer_size();
Dan Gohmanfeaeb362010-05-28 16:50:01 +0000783#endif
Dan Gohman84487b92009-08-13 17:27:29 +0000784}
785
Torok Edwin9b5a47f2009-06-04 07:09:50 +0000786raw_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) {
Dan Gohmanf199ad62009-07-16 15:24:40 +0000794 size_t len = strlen(colorcode);
Torok Edwin9b5a47f2009-06-04 07:09:50 +0000795 write(colorcode, len);
796 // don't account colors towards output characters
797 pos -= len;
798 }
799 return *this;
800}
801
802raw_ostream &raw_fd_ostream::resetColor() {
803 if (sys::Process::ColorNeedsFlush())
804 flush();
805 const char *colorcode = sys::Process::ResetColor();
806 if (colorcode) {
Dan Gohmanf199ad62009-07-16 15:24:40 +0000807 size_t len = strlen(colorcode);
Torok Edwin9b5a47f2009-06-04 07:09:50 +0000808 write(colorcode, len);
809 // don't account colors towards output characters
810 pos -= len;
811 }
812 return *this;
813}
814
Benjamin Kramer13d16f32012-04-16 08:56:50 +0000815raw_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
Dan Gohmane5929232009-09-11 20:46:33 +0000828bool raw_fd_ostream::is_displayed() const {
829 return sys::Process::FileDescriptorIsDisplayed(FD);
830}
831
Daniel Dunbar04b45832012-07-20 18:29:41 +0000832bool raw_fd_ostream::has_colors() const {
833 return sys::Process::FileDescriptorHasColors(FD);
834}
835
Weiming Zhao1bd40002018-04-11 23:09:20 +0000836void raw_fd_ostream::anchor() {}
837
Chris Lattnerd3723fc2008-08-17 04:13:37 +0000838//===----------------------------------------------------------------------===//
Dan Gohmane9a46912010-08-20 16:44:56 +0000839// outs(), errs(), nulls()
Chris Lattnerd3723fc2008-08-17 04:13:37 +0000840//===----------------------------------------------------------------------===//
Chris Lattner84b94f72008-08-17 01:35:29 +0000841
Chris Lattnerd3723fc2008-08-17 04:13:37 +0000842/// outs() - This returns a reference to a raw_ostream for standard output.
843/// Use it like: outs() << "foo" << "bar";
Owen Anderson93719642008-08-21 00:14:44 +0000844raw_ostream &llvm::outs() {
Reid Kleckner02aeadc2017-08-04 01:39:23 +0000845 // Set buffer settings to model stdout behavior.
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000846 std::error_code EC;
847 static raw_fd_ostream S("-", EC, sys::fs::F_None);
848 assert(!EC);
Chris Lattnerd3723fc2008-08-17 04:13:37 +0000849 return S;
850}
851
852/// errs() - This returns a reference to a raw_ostream for standard error.
853/// Use it like: errs() << "foo" << "bar";
Owen Anderson93719642008-08-21 00:14:44 +0000854raw_ostream &llvm::errs() {
Dan Gohman443f2d62010-08-20 16:39:41 +0000855 // Set standard error to be unbuffered by default.
856 static raw_fd_ostream S(STDERR_FILENO, false, true);
Chris Lattnerd3723fc2008-08-17 04:13:37 +0000857 return S;
858}
859
Daniel Dunbar95a551a2009-07-16 21:17:53 +0000860/// nulls() - This returns a reference to a raw_ostream which discards output.
861raw_ostream &llvm::nulls() {
862 static raw_null_ostream S;
863 return S;
864}
865
Chris Lattner205af962008-08-23 22:43:04 +0000866//===----------------------------------------------------------------------===//
867// raw_string_ostream
868//===----------------------------------------------------------------------===//
869
Daniel Dunbard882f4b2009-08-18 20:07:36 +0000870raw_string_ostream::~raw_string_ostream() {
871 flush();
872}
873
Dan Gohmanf199ad62009-07-16 15:24:40 +0000874void raw_string_ostream::write_impl(const char *Ptr, size_t Size) {
Daniel Dunbardb7a36c2009-03-16 23:29:31 +0000875 OS.append(Ptr, Size);
Chris Lattner205af962008-08-23 22:43:04 +0000876}
877
878//===----------------------------------------------------------------------===//
879// raw_svector_ostream
880//===----------------------------------------------------------------------===//
881
Yaron Keren3d1173b2015-08-13 06:19:52 +0000882uint64_t raw_svector_ostream::current_pos() const { return OS.size(); }
Daniel Dunbarb090bf42009-08-19 17:54:29 +0000883
Yaron Keren3d1173b2015-08-13 06:19:52 +0000884void raw_svector_ostream::write_impl(const char *Ptr, size_t Size) {
885 OS.append(Ptr, Ptr + Size);
Nick Lewyckye2f6fb52015-08-13 18:10:19 +0000886}
Daniel Dunbard882f4b2009-08-18 20:07:36 +0000887
Rafael Espindola4ba9af12015-04-20 13:04:30 +0000888void raw_svector_ostream::pwrite_impl(const char *Ptr, size_t Size,
889 uint64_t Offset) {
Yaron Keren3d1173b2015-08-13 06:19:52 +0000890 memcpy(OS.data() + Offset, Ptr, Size);
Daniel Dunbare813cba2009-08-19 18:40:58 +0000891}
892
Daniel Dunbar95a551a2009-07-16 21:17:53 +0000893//===----------------------------------------------------------------------===//
894// raw_null_ostream
895//===----------------------------------------------------------------------===//
896
Dan Gohman4b66b472009-07-27 21:46:02 +0000897raw_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
Daniel Dunbar95a551a2009-07-16 21:17:53 +0000906void raw_null_ostream::write_impl(const char *Ptr, size_t Size) {
907}
908
Chris Lattnerdd3e9aa2009-12-19 01:38:42 +0000909uint64_t raw_null_ostream::current_pos() const {
Daniel Dunbar95a551a2009-07-16 21:17:53 +0000910 return 0;
911}
Rafael Espindola37b70152015-04-14 15:00:34 +0000912
Rafael Espindola4ba9af12015-04-20 13:04:30 +0000913void raw_null_ostream::pwrite_impl(const char *Ptr, size_t Size,
914 uint64_t Offset) {}
Weiming Zhao1bd40002018-04-11 23:09:20 +0000915
916void raw_pwrite_stream::anchor() {}