blob: 4124121b86b1ff970f2c1223634b23b05f0f8acd [file] [log] [blame]
Chris Lattner84b94f72008-08-17 01:35:29 +00001//===--- raw_ostream.cpp - Implement the raw_ostream classes --------------===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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
Chris Lattner84b94f72008-08-17 01:35:29 +00006//
7//===----------------------------------------------------------------------===//
8//
9// This implements support for bulk buffered stream output.
10//
11//===----------------------------------------------------------------------===//
12
13#include "llvm/Support/raw_ostream.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000014#include "llvm/ADT/STLExtras.h"
Chris Lattner22b52c92008-08-23 19:23:10 +000015#include "llvm/ADT/SmallVector.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000016#include "llvm/ADT/StringExtras.h"
Chris Lattnerd564f292008-08-22 15:45:00 +000017#include "llvm/Config/config.h"
Daniel Dunbar437b8a52009-03-17 21:15:18 +000018#include "llvm/Support/Compiler.h"
Daniel Dunbardcb50b92009-07-15 08:11:46 +000019#include "llvm/Support/ErrorHandling.h"
Rafael Espindola6d354812013-07-16 19:44:17 +000020#include "llvm/Support/FileSystem.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000021#include "llvm/Support/Format.h"
Zachary Turner11db2642016-11-11 23:57:40 +000022#include "llvm/Support/FormatVariadic.h"
Nick Kledzike6480372014-09-25 20:30:58 +000023#include "llvm/Support/MathExtras.h"
Zachary Turner733be512016-10-11 19:24:45 +000024#include "llvm/Support/NativeFormatting.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000025#include "llvm/Support/Process.h"
26#include "llvm/Support/Program.h"
Eugene Zelenko33d7b762016-08-23 17:14:32 +000027#include <algorithm>
Benjamin Krameref14f802010-01-29 15:19:06 +000028#include <cctype>
Benjamin Kramerce84a252010-05-05 15:17:47 +000029#include <cerrno>
Eugene Zelenko33d7b762016-08-23 17:14:32 +000030#include <cstdio>
31#include <iterator>
Eugene Zelenko33d7b762016-08-23 17:14:32 +000032#include <sys/stat.h>
Zachary Turner733be512016-10-11 19:24:45 +000033#include <system_error>
Chris Lattner84b94f72008-08-17 01:35:29 +000034
NAKAMURA Takumi212c80a2013-07-17 02:21:10 +000035// <fcntl.h> may provide O_BINARY.
36#if defined(HAVE_FCNTL_H)
37# include <fcntl.h>
38#endif
39
Chris Lattnerd564f292008-08-22 15:45:00 +000040#if defined(HAVE_UNISTD_H)
41# include <unistd.h>
42#endif
Argyrios Kyrtzidisb97ff822008-08-17 09:25:21 +000043
NAKAMURA Takumife84f392010-10-19 01:21:55 +000044#if defined(__CYGWIN__)
45#include <io.h>
46#endif
47
Argyrios Kyrtzidisb97ff822008-08-17 09:25:21 +000048#if defined(_MSC_VER)
Chris Lattner84b94f72008-08-17 01:35:29 +000049#include <io.h>
Owen Anderson93719642008-08-21 00:14:44 +000050#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
Chris Lattner84b94f72008-08-17 01:35:29 +000059#endif
60
Nico Weber712e8d22018-04-29 00:45:03 +000061#ifdef _WIN32
Reid Kleckner2b8c6922018-09-05 00:08:56 +000062#include "llvm/Support/ConvertUTF.h"
Yunzhong Gaofb2a9c42016-01-06 00:50:06 +000063#include "Windows/WindowsSupport.h"
64#endif
65
Chris Lattnerd564f292008-08-22 15:45:00 +000066using namespace llvm;
67
Dan Gohman58fcef92009-07-15 23:25:33 +000068raw_ostream::~raw_ostream() {
Dan Gohman1b763292009-07-27 20:49:44 +000069 // 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
Daniel Dunbar317a6cd2009-08-18 23:42:36 +000074 if (BufferMode == InternalBuffer)
75 delete [] OutBufStart;
Dan Gohman58fcef92009-07-15 23:25:33 +000076}
Chris Lattnerd564f292008-08-22 15:45:00 +000077
Chris Lattnerdd3e9aa2009-12-19 01:38:42 +000078size_t raw_ostream::preferred_buffer_size() const {
Dan Gohman84487b92009-08-13 17:27:29 +000079 // BUFSIZ is intended to be a reasonable default.
80 return BUFSIZ;
81}
82
83void raw_ostream::SetBuffered() {
84 // Ask the subclass to determine an appropriate buffer size.
Dan Gohman17710222009-08-15 02:05:19 +000085 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();
Dan Gohman84487b92009-08-13 17:27:29 +000090}
91
Dan Gohmanb452d4e2010-03-24 19:38:02 +000092void raw_ostream::SetBufferAndMode(char *BufferStart, size_t Size,
Nick Lewycky7bfd86d2011-08-28 03:30:02 +000093 BufferKind Mode) {
Craig Topper2617dcc2014-04-15 06:32:26 +000094 assert(((Mode == Unbuffered && !BufferStart && Size == 0) ||
95 (Mode != Unbuffered && BufferStart && Size != 0)) &&
Daniel Dunbar316b4a02009-09-15 20:31:46 +000096 "stream must be unbuffered or have at least one byte");
Daniel Dunbar317a6cd2009-08-18 23:42:36 +000097 // 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!");
Dan Gohman54401d42009-08-13 15:58:55 +0000100
Daniel Dunbar317a6cd2009-08-18 23:42:36 +0000101 if (BufferMode == InternalBuffer)
102 delete [] OutBufStart;
103 OutBufStart = BufferStart;
Dan Gohman54401d42009-08-13 15:58:55 +0000104 OutBufEnd = OutBufStart+Size;
105 OutBufCur = OutBufStart;
Daniel Dunbar317a6cd2009-08-18 23:42:36 +0000106 BufferMode = Mode;
Daniel Dunbarb090bf42009-08-19 17:54:29 +0000107
108 assert(OutBufStart <= OutBufEnd && "Invalid size!");
Dan Gohman54401d42009-08-13 15:58:55 +0000109}
110
Owen Andersond2850532008-08-21 20:58:52 +0000111raw_ostream &raw_ostream::operator<<(unsigned long N) {
Zachary Turner11db2642016-11-11 23:57:40 +0000112 write_integer(*this, static_cast<uint64_t>(N), 0, IntegerStyle::Integer);
Zachary Turner733be512016-10-11 19:24:45 +0000113 return *this;
Owen Andersond2850532008-08-21 20:58:52 +0000114}
115
116raw_ostream &raw_ostream::operator<<(long N) {
Zachary Turner11db2642016-11-11 23:57:40 +0000117 write_integer(*this, static_cast<int64_t>(N), 0, IntegerStyle::Integer);
Zachary Turner733be512016-10-11 19:24:45 +0000118 return *this;
Owen Andersond2850532008-08-21 20:58:52 +0000119}
120
121raw_ostream &raw_ostream::operator<<(unsigned long long N) {
Zachary Turner11db2642016-11-11 23:57:40 +0000122 write_integer(*this, static_cast<uint64_t>(N), 0, IntegerStyle::Integer);
Zachary Turner733be512016-10-11 19:24:45 +0000123 return *this;
Owen Andersond2850532008-08-21 20:58:52 +0000124}
125
126raw_ostream &raw_ostream::operator<<(long long N) {
Zachary Turner11db2642016-11-11 23:57:40 +0000127 write_integer(*this, static_cast<int64_t>(N), 0, IntegerStyle::Integer);
Zachary Turner733be512016-10-11 19:24:45 +0000128 return *this;
Owen Andersond2850532008-08-21 20:58:52 +0000129}
130
Daniel Dunbar6c9629b2009-07-30 18:21:23 +0000131raw_ostream &raw_ostream::write_hex(unsigned long long N) {
Zachary Turner5b2243e2016-10-29 00:27:22 +0000132 llvm::write_hex(*this, N, HexPrintStyle::Lower);
Zachary Turner733be512016-10-11 19:24:45 +0000133 return *this;
Chris Lattner0c19df42008-08-23 22:23:09 +0000134}
135
Adrian Prantl3dcd1222017-09-13 18:22:59 +0000136raw_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
Daniel Dunbar65dc8912010-11-27 07:59:50 +0000146raw_ostream &raw_ostream::write_escaped(StringRef Str,
147 bool UseHexEscapes) {
Craig Topper775fb732016-02-04 06:51:41 +0000148 for (unsigned char c : Str) {
Daniel Dunbar4108c432009-10-17 20:43:08 +0000149 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:
Michael Kruse6f1da6e2018-07-26 15:31:41 +0000163 if (isPrint(c)) {
Daniel Dunbar4108c432009-10-17 20:43:08 +0000164 *this << c;
165 break;
166 }
167
Daniel Dunbar65dc8912010-11-27 07:59:50 +0000168 // 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 }
Daniel Dunbar4108c432009-10-17 20:43:08 +0000180 }
181 }
182
183 return *this;
184}
185
Daniel Dunbar6c9629b2009-07-30 18:21:23 +0000186raw_ostream &raw_ostream::operator<<(const void *P) {
Zachary Turner5b2243e2016-10-29 00:27:22 +0000187 llvm::write_hex(*this, (uintptr_t)P, HexPrintStyle::PrefixLower);
Zachary Turner733be512016-10-11 19:24:45 +0000188 return *this;
Daniel Dunbar6c9629b2009-07-30 18:21:23 +0000189}
190
Chris Lattner06fa1762009-08-24 03:52:50 +0000191raw_ostream &raw_ostream::operator<<(double N) {
Zachary Turner5b2243e2016-10-29 00:27:22 +0000192 llvm::write_double(*this, N, FloatStyle::Exponent);
Zachary Turner733be512016-10-11 19:24:45 +0000193 return *this;
Chris Lattner06fa1762009-08-24 03:52:50 +0000194}
195
Daniel Dunbard24535f2009-03-16 22:55:06 +0000196void raw_ostream::flush_nonempty() {
197 assert(OutBufCur > OutBufStart && "Invalid call to flush_nonempty.");
Daniel Dunbar317a6cd2009-08-18 23:42:36 +0000198 size_t Length = OutBufCur - OutBufStart;
199 OutBufCur = OutBufStart;
200 write_impl(OutBufStart, Length);
Daniel Dunbard24535f2009-03-16 22:55:06 +0000201}
202
Daniel Dunbar7a9bb9e2009-03-16 22:00:17 +0000203raw_ostream &raw_ostream::write(unsigned char C) {
Daniel Dunbar64fa3862009-03-17 01:36:56 +0000204 // Group exceptional cases into a single branch.
Benjamin Kramerbd7f8d02012-08-29 22:57:00 +0000205 if (LLVM_UNLIKELY(OutBufCur >= OutBufEnd)) {
206 if (LLVM_UNLIKELY(!OutBufStart)) {
Daniel Dunbar317a6cd2009-08-18 23:42:36 +0000207 if (BufferMode == Unbuffered) {
Dan Gohman23f90c12009-08-18 20:09:59 +0000208 write_impl(reinterpret_cast<char*>(&C), 1);
209 return *this;
210 }
Daniel Dunbar0cf16862009-08-19 00:23:39 +0000211 // Set up a buffer and start over.
212 SetBuffered();
213 return write(C);
Dan Gohman23f90c12009-08-18 20:09:59 +0000214 }
Daniel Dunbar0cf16862009-08-19 00:23:39 +0000215
216 flush_nonempty();
Daniel Dunbar2d603da2009-03-17 01:13:35 +0000217 }
218
Daniel Dunbar7a9bb9e2009-03-16 22:00:17 +0000219 *OutBufCur++ = C;
Daniel Dunbar87862182009-03-16 22:08:44 +0000220 return *this;
Daniel Dunbar7a9bb9e2009-03-16 22:00:17 +0000221}
Chris Lattner0c19df42008-08-23 22:23:09 +0000222
Dan Gohmanf199ad62009-07-16 15:24:40 +0000223raw_ostream &raw_ostream::write(const char *Ptr, size_t Size) {
Daniel Dunbar64fa3862009-03-17 01:36:56 +0000224 // Group exceptional cases into a single branch.
Benjamin Kramerbd7f8d02012-08-29 22:57:00 +0000225 if (LLVM_UNLIKELY(size_t(OutBufEnd - OutBufCur) < Size)) {
226 if (LLVM_UNLIKELY(!OutBufStart)) {
Daniel Dunbar317a6cd2009-08-18 23:42:36 +0000227 if (BufferMode == Unbuffered) {
Dan Gohman52022c22009-08-13 15:44:52 +0000228 write_impl(Ptr, Size);
229 return *this;
230 }
231 // Set up a buffer and start over.
Dan Gohman84487b92009-08-13 17:27:29 +0000232 SetBuffered();
Dan Gohman52022c22009-08-13 15:44:52 +0000233 return write(Ptr, Size);
234 }
Daniel Dunbar0cf16862009-08-19 00:23:39 +0000235
Benjamin Kramerdfb0ad32011-03-04 19:49:30 +0000236 size_t NumBytes = OutBufEnd - OutBufCur;
237
Benjamin Krameracf08422011-03-04 18:18:16 +0000238 // If the buffer is empty at this point we have a string that is larger
Benjamin Kramerdfb0ad32011-03-04 19:49:30 +0000239 // than the buffer. Directly write the chunk that is a multiple of the
240 // preferred buffer size and put the remainder in the buffer.
Benjamin Kramerbd7f8d02012-08-29 22:57:00 +0000241 if (LLVM_UNLIKELY(OutBufCur == OutBufStart)) {
Michael Ilseman5be22a12014-12-12 21:48:03 +0000242 assert(NumBytes != 0 && "undefined behavior");
Benjamin Kramerdfb0ad32011-03-04 19:49:30 +0000243 size_t BytesToWrite = Size - (Size % NumBytes);
244 write_impl(Ptr, BytesToWrite);
Matt Beaumont-Gaya182be82013-03-12 23:55:24 +0000245 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);
Benjamin Krameracf08422011-03-04 18:18:16 +0000251 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.
Benjamin Krameracf08422011-03-04 18:18:16 +0000256 copy_to_buffer(Ptr, NumBytes);
257 flush_nonempty();
258 return write(Ptr + NumBytes, Size - NumBytes);
Daniel Dunbar64fa3862009-03-17 01:36:56 +0000259 }
Dan Gohman52022c22009-08-13 15:44:52 +0000260
261 copy_to_buffer(Ptr, Size);
262
263 return *this;
264}
265
266void raw_ostream::copy_to_buffer(const char *Ptr, size_t Size) {
Dan Gohmanc04a00a2009-08-13 20:32:03 +0000267 assert(Size <= size_t(OutBufEnd - OutBufCur) && "Buffer overrun!");
Dan Gohman98205552009-08-13 18:38:15 +0000268
Owen Andersond2850532008-08-21 20:58:52 +0000269 // Handle short strings specially, memcpy isn't very good at very short
270 // strings.
271 switch (Size) {
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000272 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;
Owen Andersond2850532008-08-21 20:58:52 +0000276 case 0: break;
277 default:
Dan Gohman52022c22009-08-13 15:44:52 +0000278 memcpy(OutBufCur, Ptr, Size);
Owen Andersond2850532008-08-21 20:58:52 +0000279 break;
280 }
Daniel Dunbar3da6a702009-03-10 16:21:55 +0000281
Dan Gohman52022c22009-08-13 15:44:52 +0000282 OutBufCur += Size;
Owen Andersond2850532008-08-21 20:58:52 +0000283}
284
Chris Lattner22b52c92008-08-23 19:23:10 +0000285// Formatted output.
286raw_ostream &raw_ostream::operator<<(const format_object_base &Fmt) {
Daniel Dunbar64fa3862009-03-17 01:36:56 +0000287 // If we have more than a few bytes left in our output buffer, try
288 // formatting directly onto its end.
Dan Gohmanf199ad62009-07-16 15:24:40 +0000289 size_t NextBufferSize = 127;
Daniel Dunbar47a309c2009-08-23 20:31:39 +0000290 size_t BufferBytesLeft = OutBufEnd - OutBufCur;
291 if (BufferBytesLeft > 3) {
Dan Gohmanf199ad62009-07-16 15:24:40 +0000292 size_t BytesUsed = Fmt.print(OutBufCur, BufferBytesLeft);
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000293
Chris Lattner22b52c92008-08-23 19:23:10 +0000294 // Common case is that we have plenty of space.
Daniel Dunbar47a309c2009-08-23 20:31:39 +0000295 if (BytesUsed <= BufferBytesLeft) {
Chris Lattner22b52c92008-08-23 19:23:10 +0000296 OutBufCur += BytesUsed;
297 return *this;
298 }
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000299
Chris Lattner22b52c92008-08-23 19:23:10 +0000300 // Otherwise, we overflowed and the return value tells us the size to try
301 // again with.
302 NextBufferSize = BytesUsed;
303 }
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000304
Chris Lattner22b52c92008-08-23 19:23:10 +0000305 // 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;
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000309
Eugene Zelenko33d7b762016-08-23 17:14:32 +0000310 while (true) {
Chris Lattner22b52c92008-08-23 19:23:10 +0000311 V.resize(NextBufferSize);
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000312
Chris Lattner22b52c92008-08-23 19:23:10 +0000313 // Try formatting into the SmallVector.
Daniel Dunbar47a309c2009-08-23 20:31:39 +0000314 size_t BytesUsed = Fmt.print(V.data(), NextBufferSize);
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000315
Chris Lattner22b52c92008-08-23 19:23:10 +0000316 // If BytesUsed fit into the vector, we win.
Chris Lattner2bfc72e2008-10-26 19:20:47 +0000317 if (BytesUsed <= NextBufferSize)
Daniel Dunbar47a309c2009-08-23 20:31:39 +0000318 return write(V.data(), BytesUsed);
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000319
Chris Lattner22b52c92008-08-23 19:23:10 +0000320 // Otherwise, try again with a new size.
321 assert(BytesUsed > NextBufferSize && "Didn't grow buffer!?");
322 NextBufferSize = BytesUsed;
323 }
324}
325
Zachary Turner11db2642016-11-11 23:57:40 +0000326raw_ostream &raw_ostream::operator<<(const formatv_object_base &Obj) {
327 SmallString<128> S;
328 Obj.format(*this);
329 return *this;
330}
331
Nick Kledzike6480372014-09-25 20:30:58 +0000332raw_ostream &raw_ostream::operator<<(const FormattedString &FS) {
Frederich Munch5e9d6d02017-07-13 16:11:08 +0000333 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;
Nick Kledzike6480372014-09-25 20:30:58 +0000349 this->indent(PadAmount);
Frederich Munch5e9d6d02017-07-13 16:11:08 +0000350 this->operator<<(FS.Str);
351 this->indent(Difference - PadAmount);
352 break;
353 }
354 default:
355 llvm_unreachable("Bad Justification");
356 }
Nick Kledzike6480372014-09-25 20:30:58 +0000357 return *this;
358}
359
360raw_ostream &raw_ostream::operator<<(const FormattedNumber &FN) {
361 if (FN.Hex) {
Zachary Turner5b2243e2016-10-29 00:27:22 +0000362 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);
Nick Kledzike6480372014-09-25 20:30:58 +0000372 } else {
Zachary Turner5b2243e2016-10-29 00:27:22 +0000373 llvm::SmallString<16> Buffer;
374 llvm::raw_svector_ostream Stream(Buffer);
Zachary Turner11db2642016-11-11 23:57:40 +0000375 llvm::write_integer(Stream, FN.DecValue, 0, IntegerStyle::Integer);
Zachary Turner5b2243e2016-10-29 00:27:22 +0000376 if (Buffer.size() < FN.Width)
377 indent(FN.Width - Buffer.size());
378 (*this) << Buffer;
Nick Kledzike6480372014-09-25 20:30:58 +0000379 }
Zachary Turner733be512016-10-11 19:24:45 +0000380 return *this;
Nick Kledzike6480372014-09-25 20:30:58 +0000381}
382
Zachary Turner4a86af02016-11-10 20:16:45 +0000383raw_ostream &raw_ostream::operator<<(const FormattedBytes &FB) {
384 if (FB.Bytes.empty())
385 return *this;
386
Greg Claytonbde0a162016-11-09 00:15:54 +0000387 size_t LineIndex = 0;
Zachary Turner4a86af02016-11-10 20:16:45 +0000388 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);
Zachary Turner805d43a2016-11-10 20:35:21 +0000401 OffsetWidth = std::max<uint64_t>(4, llvm::alignTo(Power, 4) / 4);
Zachary Turner4a86af02016-11-10 20:16:45 +0000402 }
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
Greg Claytonbde0a162016-11-09 00:15:54 +0000412 if (FB.FirstByteOffset.hasValue()) {
413 uint64_t Offset = FB.FirstByteOffset.getValue();
Zachary Turner4a86af02016-11-10 20:16:45 +0000414 llvm::write_hex(*this, Offset + LineIndex, HPS, OffsetWidth);
Greg Claytonbde0a162016-11-09 00:15:54 +0000415 *this << ": ";
416 }
Zachary Turner4a86af02016-11-10 20:16:45 +0000417
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;
Greg Claytonbde0a162016-11-09 00:15:54 +0000425 *this << " ";
Zachary Turner4a86af02016-11-10 20:16:45 +0000426 }
427 llvm::write_hex(*this, Line[I], HPS, 2);
Greg Claytonbde0a162016-11-09 00:15:54 +0000428 }
Zachary Turner4a86af02016-11-10 20:16:45 +0000429
Greg Claytonbde0a162016-11-09 00:15:54 +0000430 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.
Zachary Turner4a86af02016-11-10 20:16:45 +0000433 assert(BlockCharWidth >= CharsPrinted);
434 indent(BlockCharWidth - CharsPrinted + 2);
435 *this << "|";
436
Greg Claytonbde0a162016-11-09 00:15:54 +0000437 // Print the ASCII char values for each byte on this line
Zachary Turner4a86af02016-11-10 20:16:45 +0000438 for (uint8_t Byte : Line) {
Michael Kruse6f1da6e2018-07-26 15:31:41 +0000439 if (isPrint(Byte))
Zachary Turner4a86af02016-11-10 20:16:45 +0000440 *this << static_cast<char>(Byte);
Greg Claytonbde0a162016-11-09 00:15:54 +0000441 else
442 *this << '.';
443 }
444 *this << '|';
445 }
Zachary Turner4a86af02016-11-10 20:16:45 +0000446
447 Bytes = Bytes.drop_front(Line.size());
448 LineIndex += Line.size();
Greg Claytonbde0a162016-11-09 00:15:54 +0000449 if (LineIndex < Size)
450 *this << '\n';
451 }
452 return *this;
453}
454
Peter Collingbourne070777d2018-05-17 22:11:43 +0000455template <char C>
456static 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};
Chris Lattnere6db2c32009-08-22 23:10:29 +0000462
463 // Usually the indentation is small, handle it with a fastpath.
Peter Collingbourne070777d2018-05-17 22:11:43 +0000464 if (NumChars < array_lengthof(Chars))
465 return OS.write(Chars, NumChars);
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000466
Peter Collingbourne070777d2018-05-17 22:11:43 +0000467 while (NumChars) {
468 unsigned NumToWrite = std::min(NumChars,
469 (unsigned)array_lengthof(Chars)-1);
470 OS.write(Chars, NumToWrite);
471 NumChars -= NumToWrite;
Chris Lattnere6db2c32009-08-22 23:10:29 +0000472 }
Peter Collingbourne070777d2018-05-17 22:11:43 +0000473 return OS;
474}
475
476/// indent - Insert 'NumSpaces' spaces.
477raw_ostream &raw_ostream::indent(unsigned NumSpaces) {
478 return write_padding<' '>(*this, NumSpaces);
479}
480
481/// write_zeros - Insert 'NumZeros' nulls.
482raw_ostream &raw_ostream::write_zeros(unsigned NumZeros) {
483 return write_padding<'\0'>(*this, NumZeros);
Chris Lattnere6db2c32009-08-22 23:10:29 +0000484}
485
Weiming Zhao1bd40002018-04-11 23:09:20 +0000486void raw_ostream::anchor() {}
487
Chris Lattner22b52c92008-08-23 19:23:10 +0000488//===----------------------------------------------------------------------===//
489// Formatted Output
490//===----------------------------------------------------------------------===//
491
492// Out of line virtual method.
493void format_object_base::home() {
494}
495
Chris Lattner84b94f72008-08-17 01:35:29 +0000496//===----------------------------------------------------------------------===//
497// raw_fd_ostream
498//===----------------------------------------------------------------------===//
499
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000500static int getFD(StringRef Filename, std::error_code &EC,
Zachary Turner1f67a3c2018-06-07 19:58:58 +0000501 sys::fs::CreationDisposition Disp, sys::fs::FileAccess Access,
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000502 sys::fs::OpenFlags Flags) {
Zachary Turner1f67a3c2018-06-07 19:58:58 +0000503 assert((Access & sys::fs::FA_Write) &&
504 "Cannot make a raw_ostream from a read-only descriptor!");
505
Dan Gohmanc825cee2010-08-18 22:26:19 +0000506 // Handle "-" as stdout. Note that when we do this, we consider ourself
Yaron Keren80745c52017-03-31 12:08:45 +0000507 // the owner of stdout and may set the "binary" flag globally based on Flags.
Rafael Espindola3fd1e992014-08-25 18:16:47 +0000508 if (Filename == "-") {
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000509 EC = std::error_code();
Daniel Dunbared90e702008-11-13 05:01:07 +0000510 // If user requested binary then put stdout into binary mode if
511 // possible.
Zachary Turner1f67a3c2018-06-07 19:58:58 +0000512 if (!(Flags & sys::fs::OF_Text))
Rafael Espindolacb2eca02013-06-12 20:58:35 +0000513 sys::ChangeStdoutToBinary();
Yaron Keren9d27c472017-03-30 19:30:51 +0000514 return STDOUT_FILENO;
Chris Lattnerd5bc0682008-08-17 03:53:23 +0000515 }
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000516
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000517 int FD;
Zachary Turner1f67a3c2018-06-07 19:58:58 +0000518 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);
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000522 if (EC)
523 return -1;
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000524
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000525 return FD;
Chris Lattner84b94f72008-08-17 01:35:29 +0000526}
527
Zachary Turner1f67a3c2018-06-07 19:58:58 +0000528raw_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
532raw_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
536raw_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
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000541raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC,
542 sys::fs::OpenFlags Flags)
Zachary Turner1f67a3c2018-06-07 19:58:58 +0000543 : raw_fd_ostream(Filename, EC, sys::fs::CD_CreateAlways, sys::fs::FA_Write,
544 Flags) {}
545
546raw_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) {}
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000551
Rafael Espindola62e6ec02015-04-09 16:59:07 +0000552/// FD is the file descriptor that this writes to. If ShouldClose is true, this
553/// closes the file when the stream is destroyed.
Francois Picheta3037c32010-10-14 20:30:58 +0000554raw_fd_ostream::raw_fd_ostream(int fd, bool shouldClose, bool unbuffered)
Bob Haarman9ce2d032017-10-24 01:26:22 +0000555 : raw_pwrite_stream(unbuffered), FD(fd), ShouldClose(shouldClose) {
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000556 if (FD < 0 ) {
557 ShouldClose = false;
558 return;
559 }
Reid Kleckner02aeadc2017-08-04 01:39:23 +0000560
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.
Yaron Keren9d27c472017-03-30 19:30:51 +0000567 if (FD <= STDERR_FILENO)
568 ShouldClose = false;
Michael J. Spencerb7479902011-01-17 15:53:12 +0000569
Reid Kleckner2b8c6922018-09-05 00:08:56 +0000570#ifdef _WIN32
571 // Check if this is a console device. This is not equivalent to isatty.
572 IsWindowsConsole =
573 ::GetFileType((HANDLE)::_get_osfhandle(fd)) == FILE_TYPE_CHAR;
574#endif
575
Michael J. Spencerb7479902011-01-17 15:53:12 +0000576 // Get the starting position.
577 off_t loc = ::lseek(FD, 0, SEEK_CUR);
Nico Weber712e8d22018-04-29 00:45:03 +0000578#ifdef _WIN32
Rafael Espindolaa9b84ab2015-04-13 11:09:48 +0000579 // MSVCRT's _lseek(SEEK_CUR) doesn't return -1 for pipes.
580 sys::fs::file_status Status;
581 std::error_code EC = status(FD, Status);
582 SupportsSeeking = !EC && Status.type() == sys::fs::file_type::regular_file;
583#else
Rafael Espindola74d2f612015-04-10 18:15:51 +0000584 SupportsSeeking = loc != (off_t)-1;
Rafael Espindolaa9b84ab2015-04-13 11:09:48 +0000585#endif
Rafael Espindola74d2f612015-04-10 18:15:51 +0000586 if (!SupportsSeeking)
Michael J. Spencerb7479902011-01-17 15:53:12 +0000587 pos = 0;
588 else
589 pos = static_cast<uint64_t>(loc);
Francois Picheta3037c32010-10-14 20:30:58 +0000590}
591
Chris Lattner84b94f72008-08-17 01:35:29 +0000592raw_fd_ostream::~raw_fd_ostream() {
Dan Gohman38adfdd2010-08-20 16:34:20 +0000593 if (FD >= 0) {
594 flush();
Bob Haarman9ce2d032017-10-24 01:26:22 +0000595 if (ShouldClose) {
596 if (auto EC = sys::Process::SafelyCloseFileDescriptor(FD))
597 error_detected(EC);
598 }
Dan Gohman38adfdd2010-08-20 16:34:20 +0000599 }
600
NAKAMURA Takumi76e68ea2011-03-16 02:53:39 +0000601#ifdef __MINGW32__
602 // On mingw, global dtors should not call exit().
603 // report_fatal_error() invokes exit(). We know report_fatal_error()
604 // might not write messages to stderr when any errors were detected
605 // on FD == 2.
606 if (FD == 2) return;
607#endif
608
Dan Gohman38adfdd2010-08-20 16:34:20 +0000609 // If there are any pending errors, report them now. Clients wishing
610 // to avoid report_fatal_error calls should check for errors with
611 // has_error() and clear the error flag with clear_error() before
612 // destructing raw_ostream objects which may have errors.
613 if (has_error())
Bob Haarman9ce2d032017-10-24 01:26:22 +0000614 report_fatal_error("IO failure on output stream: " + error().message(),
615 /*GenCrashDiag=*/false);
Chris Lattnerce3b2c32010-08-17 23:11:56 +0000616}
Chris Lattner9e6f1f12009-08-23 02:51:22 +0000617
Reid Kleckner2b8c6922018-09-05 00:08:56 +0000618#if defined(_WIN32)
619// The most reliable way to print unicode in a Windows console is with
620// WriteConsoleW. To use that, first transcode from UTF-8 to UTF-16. This
621// assumes that LLVM programs always print valid UTF-8 to the console. The data
622// might not be UTF-8 for two major reasons:
623// 1. The program is printing binary (-filetype=obj -o -), in which case it
624// would have been gibberish anyway.
625// 2. The program is printing text in a semi-ascii compatible codepage like
626// shift-jis or cp1252.
627//
628// Most LLVM programs don't produce non-ascii text unless they are quoting
629// user source input. A well-behaved LLVM program should either validate that
630// the input is UTF-8 or transcode from the local codepage to UTF-8 before
631// quoting it. If they don't, this may mess up the encoding, but this is still
632// probably the best compromise we can make.
633static bool write_console_impl(int FD, StringRef Data) {
634 SmallVector<wchar_t, 256> WideText;
635
636 // Fall back to ::write if it wasn't valid UTF-8.
637 if (auto EC = sys::windows::UTF8ToUTF16(Data, WideText))
638 return false;
639
640 // On Windows 7 and earlier, WriteConsoleW has a low maximum amount of data
641 // that can be written to the console at a time.
642 size_t MaxWriteSize = WideText.size();
643 if (!RunningWindows8OrGreater())
644 MaxWriteSize = 32767;
645
646 size_t WCharsWritten = 0;
647 do {
648 size_t WCharsToWrite =
649 std::min(MaxWriteSize, WideText.size() - WCharsWritten);
650 DWORD ActuallyWritten;
651 bool Success =
652 ::WriteConsoleW((HANDLE)::_get_osfhandle(FD), &WideText[WCharsWritten],
653 WCharsToWrite, &ActuallyWritten,
654 /*Reserved=*/nullptr);
655
656 // The most likely reason for WriteConsoleW to fail is that FD no longer
657 // points to a console. Fall back to ::write. If this isn't the first loop
658 // iteration, something is truly wrong.
659 if (!Success)
660 return false;
661
662 WCharsWritten += ActuallyWritten;
663 } while (WCharsWritten != WideText.size());
664 return true;
665}
666#endif
667
Dan Gohmanf199ad62009-07-16 15:24:40 +0000668void raw_fd_ostream::write_impl(const char *Ptr, size_t Size) {
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000669 assert(FD >= 0 && "File already closed.");
Daniel Dunbardb7a36c2009-03-16 23:29:31 +0000670 pos += Size;
Dan Gohmanef969f32010-05-06 01:27:36 +0000671
Reid Kleckner2b8c6922018-09-05 00:08:56 +0000672#if defined(_WIN32)
673 // If this is a Windows console device, try re-encoding from UTF-8 to UTF-16
674 // and using WriteConsoleW. If that fails, fall back to plain write().
675 if (IsWindowsConsole)
676 if (write_console_impl(FD, StringRef(Ptr, Size)))
677 return;
678#endif
679
Owen Reynoldsa489d112018-08-06 16:21:41 +0000680 // The maximum write size is limited to INT32_MAX. A write
681 // greater than SSIZE_MAX is implementation-defined in POSIX,
682 // and Windows _write requires 32 bit input.
683 size_t MaxWriteSize = INT32_MAX;
Rui Ueyama412b29e2017-10-31 17:37:20 +0000684
Saleem Abdulrasool8199dad2017-06-20 20:51:51 +0000685#if defined(__linux__)
Rui Ueyama412b29e2017-10-31 17:37:20 +0000686 // It is observed that Linux returns EINVAL for a very large write (>2G).
687 // Make it a reasonably small value.
688 MaxWriteSize = 1024 * 1024 * 1024;
Yunzhong Gaofb2a9c42016-01-06 00:50:06 +0000689#endif
690
Benjamin Kramerce84a252010-05-05 15:17:47 +0000691 do {
Rui Ueyama412b29e2017-10-31 17:37:20 +0000692 size_t ChunkSize = std::min(Size, MaxWriteSize);
Yunzhong Gaofb2a9c42016-01-06 00:50:06 +0000693 ssize_t ret = ::write(FD, Ptr, ChunkSize);
Dan Gohmanef969f32010-05-06 01:27:36 +0000694
695 if (ret < 0) {
696 // If it's a recoverable error, swallow it and retry the write.
Dan Gohmandea53102010-05-18 15:25:14 +0000697 //
698 // Ideally we wouldn't ever see EAGAIN or EWOULDBLOCK here, since
699 // raw_ostream isn't designed to do non-blocking I/O. However, some
700 // programs, such as old versions of bjam, have mistakenly used
701 // O_NONBLOCK. For compatibility, emulate blocking semantics by
702 // spinning until the write succeeds. If you don't want spinning,
703 // don't use O_NONBLOCK file descriptors with raw_ostream.
Dan Gohmand3511162010-05-06 02:06:20 +0000704 if (errno == EINTR || errno == EAGAIN
705#ifdef EWOULDBLOCK
706 || errno == EWOULDBLOCK
707#endif
708 )
Dan Gohmanef969f32010-05-06 01:27:36 +0000709 continue;
710
711 // Otherwise it's a non-recoverable error. Note it and quit.
Bob Haarman9ce2d032017-10-24 01:26:22 +0000712 error_detected(std::error_code(errno, std::generic_category()));
Dan Gohmanef969f32010-05-06 01:27:36 +0000713 break;
714 }
715
716 // The write may have written some or all of the data. Update the
717 // size and buffer pointer to reflect the remainder that needs
718 // to be written. If there are no bytes left, we're done.
719 Ptr += ret;
720 Size -= ret;
721 } while (Size > 0);
Chris Lattner84b94f72008-08-17 01:35:29 +0000722}
723
Dan Gohman44790e72010-08-18 01:34:52 +0000724void raw_fd_ostream::close() {
725 assert(ShouldClose);
726 ShouldClose = false;
727 flush();
Bob Haarman9ce2d032017-10-24 01:26:22 +0000728 if (auto EC = sys::Process::SafelyCloseFileDescriptor(FD))
729 error_detected(EC);
Dan Gohman44790e72010-08-18 01:34:52 +0000730 FD = -1;
731}
732
Ted Kremeneka2669922009-01-26 21:42:04 +0000733uint64_t raw_fd_ostream::seek(uint64_t off) {
Yaron Keren7cf7f802016-02-23 07:17:58 +0000734 assert(SupportsSeeking && "Stream does not support seeking!");
Ted Kremeneka2669922009-01-26 21:42:04 +0000735 flush();
Nico Weber712e8d22018-04-29 00:45:03 +0000736#ifdef _WIN32
Peter Collingbourne8db7e5e2016-12-09 05:20:43 +0000737 pos = ::_lseeki64(FD, off, SEEK_SET);
738#elif defined(HAVE_LSEEK64)
739 pos = ::lseek64(FD, off, SEEK_SET);
740#else
Peter Collingbournef74fcdd2016-12-09 05:04:30 +0000741 pos = ::lseek(FD, off, SEEK_SET);
Peter Collingbourne8db7e5e2016-12-09 05:20:43 +0000742#endif
Rafael Espindola642a2212015-04-14 22:54:16 +0000743 if (pos == (uint64_t)-1)
Bob Haarman9ce2d032017-10-24 01:26:22 +0000744 error_detected(std::error_code(errno, std::generic_category()));
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000745 return pos;
Ted Kremeneka2669922009-01-26 21:42:04 +0000746}
747
Rafael Espindola4ba9af12015-04-20 13:04:30 +0000748void raw_fd_ostream::pwrite_impl(const char *Ptr, size_t Size,
749 uint64_t Offset) {
Rafael Espindola37b70152015-04-14 15:00:34 +0000750 uint64_t Pos = tell();
751 seek(Offset);
752 write(Ptr, Size);
753 seek(Pos);
754}
755
Chris Lattnerdd3e9aa2009-12-19 01:38:42 +0000756size_t raw_fd_ostream::preferred_buffer_size() const {
Reid Kleckner2b8c6922018-09-05 00:08:56 +0000757#if defined(_WIN32)
758 // Disable buffering for console devices. Console output is re-encoded from
759 // UTF-8 to UTF-16 on Windows, and buffering it would require us to split the
760 // buffer on a valid UTF-8 codepoint boundary. Terminal buffering is disabled
761 // below on most other OSs, so do the same thing on Windows and avoid that
762 // complexity.
763 if (IsWindowsConsole)
764 return 0;
765 return raw_ostream::preferred_buffer_size();
766#elif !defined(__minix)
767 // Minix has no st_blksize.
Dan Gohman84487b92009-08-13 17:27:29 +0000768 assert(FD >= 0 && "File not yet open!");
769 struct stat statbuf;
Chris Lattnerdd3e9aa2009-12-19 01:38:42 +0000770 if (fstat(FD, &statbuf) != 0)
771 return 0;
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000772
Chris Lattnerdd3e9aa2009-12-19 01:38:42 +0000773 // If this is a terminal, don't use buffering. Line buffering
774 // would be a more traditional thing to do, but it's not worth
775 // the complexity.
776 if (S_ISCHR(statbuf.st_mode) && isatty(FD))
777 return 0;
778 // Return the preferred block size.
779 return statbuf.st_blksize;
Dan Gohmanfeaeb362010-05-28 16:50:01 +0000780#else
Dan Gohman84487b92009-08-13 17:27:29 +0000781 return raw_ostream::preferred_buffer_size();
Dan Gohmanfeaeb362010-05-28 16:50:01 +0000782#endif
Dan Gohman84487b92009-08-13 17:27:29 +0000783}
784
Torok Edwin9b5a47f2009-06-04 07:09:50 +0000785raw_ostream &raw_fd_ostream::changeColor(enum Colors colors, bool bold,
786 bool bg) {
787 if (sys::Process::ColorNeedsFlush())
788 flush();
789 const char *colorcode =
790 (colors == SAVEDCOLOR) ? sys::Process::OutputBold(bg)
791 : sys::Process::OutputColor(colors, bold, bg);
792 if (colorcode) {
Dan Gohmanf199ad62009-07-16 15:24:40 +0000793 size_t len = strlen(colorcode);
Torok Edwin9b5a47f2009-06-04 07:09:50 +0000794 write(colorcode, len);
795 // don't account colors towards output characters
796 pos -= len;
797 }
798 return *this;
799}
800
801raw_ostream &raw_fd_ostream::resetColor() {
802 if (sys::Process::ColorNeedsFlush())
803 flush();
804 const char *colorcode = sys::Process::ResetColor();
805 if (colorcode) {
Dan Gohmanf199ad62009-07-16 15:24:40 +0000806 size_t len = strlen(colorcode);
Torok Edwin9b5a47f2009-06-04 07:09:50 +0000807 write(colorcode, len);
808 // don't account colors towards output characters
809 pos -= len;
810 }
811 return *this;
812}
813
Benjamin Kramer13d16f32012-04-16 08:56:50 +0000814raw_ostream &raw_fd_ostream::reverseColor() {
815 if (sys::Process::ColorNeedsFlush())
816 flush();
817 const char *colorcode = sys::Process::OutputReverse();
818 if (colorcode) {
819 size_t len = strlen(colorcode);
820 write(colorcode, len);
821 // don't account colors towards output characters
822 pos -= len;
823 }
824 return *this;
825}
826
Dan Gohmane5929232009-09-11 20:46:33 +0000827bool raw_fd_ostream::is_displayed() const {
828 return sys::Process::FileDescriptorIsDisplayed(FD);
829}
830
Daniel Dunbar04b45832012-07-20 18:29:41 +0000831bool raw_fd_ostream::has_colors() const {
832 return sys::Process::FileDescriptorHasColors(FD);
833}
834
Weiming Zhao1bd40002018-04-11 23:09:20 +0000835void raw_fd_ostream::anchor() {}
836
Chris Lattnerd3723fc2008-08-17 04:13:37 +0000837//===----------------------------------------------------------------------===//
Dan Gohmane9a46912010-08-20 16:44:56 +0000838// outs(), errs(), nulls()
Chris Lattnerd3723fc2008-08-17 04:13:37 +0000839//===----------------------------------------------------------------------===//
Chris Lattner84b94f72008-08-17 01:35:29 +0000840
Chris Lattnerd3723fc2008-08-17 04:13:37 +0000841/// outs() - This returns a reference to a raw_ostream for standard output.
842/// Use it like: outs() << "foo" << "bar";
Owen Anderson93719642008-08-21 00:14:44 +0000843raw_ostream &llvm::outs() {
Reid Kleckner02aeadc2017-08-04 01:39:23 +0000844 // Set buffer settings to model stdout behavior.
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000845 std::error_code EC;
846 static raw_fd_ostream S("-", EC, sys::fs::F_None);
847 assert(!EC);
Chris Lattnerd3723fc2008-08-17 04:13:37 +0000848 return S;
849}
850
851/// errs() - This returns a reference to a raw_ostream for standard error.
852/// Use it like: errs() << "foo" << "bar";
Owen Anderson93719642008-08-21 00:14:44 +0000853raw_ostream &llvm::errs() {
Dan Gohman443f2d62010-08-20 16:39:41 +0000854 // Set standard error to be unbuffered by default.
855 static raw_fd_ostream S(STDERR_FILENO, false, true);
Chris Lattnerd3723fc2008-08-17 04:13:37 +0000856 return S;
857}
858
Daniel Dunbar95a551a2009-07-16 21:17:53 +0000859/// nulls() - This returns a reference to a raw_ostream which discards output.
860raw_ostream &llvm::nulls() {
861 static raw_null_ostream S;
862 return S;
863}
864
Chris Lattner205af962008-08-23 22:43:04 +0000865//===----------------------------------------------------------------------===//
866// raw_string_ostream
867//===----------------------------------------------------------------------===//
868
Daniel Dunbard882f4b2009-08-18 20:07:36 +0000869raw_string_ostream::~raw_string_ostream() {
870 flush();
871}
872
Dan Gohmanf199ad62009-07-16 15:24:40 +0000873void raw_string_ostream::write_impl(const char *Ptr, size_t Size) {
Daniel Dunbardb7a36c2009-03-16 23:29:31 +0000874 OS.append(Ptr, Size);
Chris Lattner205af962008-08-23 22:43:04 +0000875}
876
877//===----------------------------------------------------------------------===//
878// raw_svector_ostream
879//===----------------------------------------------------------------------===//
880
Yaron Keren3d1173b2015-08-13 06:19:52 +0000881uint64_t raw_svector_ostream::current_pos() const { return OS.size(); }
Daniel Dunbarb090bf42009-08-19 17:54:29 +0000882
Yaron Keren3d1173b2015-08-13 06:19:52 +0000883void raw_svector_ostream::write_impl(const char *Ptr, size_t Size) {
884 OS.append(Ptr, Ptr + Size);
Nick Lewyckye2f6fb52015-08-13 18:10:19 +0000885}
Daniel Dunbard882f4b2009-08-18 20:07:36 +0000886
Rafael Espindola4ba9af12015-04-20 13:04:30 +0000887void raw_svector_ostream::pwrite_impl(const char *Ptr, size_t Size,
888 uint64_t Offset) {
Yaron Keren3d1173b2015-08-13 06:19:52 +0000889 memcpy(OS.data() + Offset, Ptr, Size);
Daniel Dunbare813cba2009-08-19 18:40:58 +0000890}
891
Daniel Dunbar95a551a2009-07-16 21:17:53 +0000892//===----------------------------------------------------------------------===//
893// raw_null_ostream
894//===----------------------------------------------------------------------===//
895
Dan Gohman4b66b472009-07-27 21:46:02 +0000896raw_null_ostream::~raw_null_ostream() {
897#ifndef NDEBUG
898 // ~raw_ostream asserts that the buffer is empty. This isn't necessary
899 // with raw_null_ostream, but it's better to have raw_null_ostream follow
900 // the rules than to change the rules just for raw_null_ostream.
901 flush();
902#endif
903}
904
Daniel Dunbar95a551a2009-07-16 21:17:53 +0000905void raw_null_ostream::write_impl(const char *Ptr, size_t Size) {
906}
907
Chris Lattnerdd3e9aa2009-12-19 01:38:42 +0000908uint64_t raw_null_ostream::current_pos() const {
Daniel Dunbar95a551a2009-07-16 21:17:53 +0000909 return 0;
910}
Rafael Espindola37b70152015-04-14 15:00:34 +0000911
Rafael Espindola4ba9af12015-04-20 13:04:30 +0000912void raw_null_ostream::pwrite_impl(const char *Ptr, size_t Size,
913 uint64_t Offset) {}
Weiming Zhao1bd40002018-04-11 23:09:20 +0000914
915void raw_pwrite_stream::anchor() {}
Richard Trieua87b70d2018-12-29 02:02:13 +0000916
917void buffer_ostream::anchor() {}