blob: e1e5fe718b87425d0e33d7df61124cc9381b5118 [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
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:
163 if (std::isprint(c)) {
164 *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) {
439 if (isprint(Byte))
440 *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
570 // Get the starting position.
571 off_t loc = ::lseek(FD, 0, SEEK_CUR);
Nico Weber712e8d22018-04-29 00:45:03 +0000572#ifdef _WIN32
Rafael Espindolaa9b84ab2015-04-13 11:09:48 +0000573 // 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
Rafael Espindola74d2f612015-04-10 18:15:51 +0000578 SupportsSeeking = loc != (off_t)-1;
Rafael Espindolaa9b84ab2015-04-13 11:09:48 +0000579#endif
Rafael Espindola74d2f612015-04-10 18:15:51 +0000580 if (!SupportsSeeking)
Michael J. Spencerb7479902011-01-17 15:53:12 +0000581 pos = 0;
582 else
583 pos = static_cast<uint64_t>(loc);
Francois Picheta3037c32010-10-14 20:30:58 +0000584}
585
Chris Lattner84b94f72008-08-17 01:35:29 +0000586raw_fd_ostream::~raw_fd_ostream() {
Dan Gohman38adfdd2010-08-20 16:34:20 +0000587 if (FD >= 0) {
588 flush();
Bob Haarman9ce2d032017-10-24 01:26:22 +0000589 if (ShouldClose) {
590 if (auto EC = sys::Process::SafelyCloseFileDescriptor(FD))
591 error_detected(EC);
592 }
Dan Gohman38adfdd2010-08-20 16:34:20 +0000593 }
594
NAKAMURA Takumi76e68ea2011-03-16 02:53:39 +0000595#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
Dan Gohman38adfdd2010-08-20 16:34:20 +0000603 // 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())
Bob Haarman9ce2d032017-10-24 01:26:22 +0000608 report_fatal_error("IO failure on output stream: " + error().message(),
609 /*GenCrashDiag=*/false);
Chris Lattnerce3b2c32010-08-17 23:11:56 +0000610}
Chris Lattner9e6f1f12009-08-23 02:51:22 +0000611
Dan Gohmanf199ad62009-07-16 15:24:40 +0000612void raw_fd_ostream::write_impl(const char *Ptr, size_t Size) {
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000613 assert(FD >= 0 && "File already closed.");
Daniel Dunbardb7a36c2009-03-16 23:29:31 +0000614 pos += Size;
Dan Gohmanef969f32010-05-06 01:27:36 +0000615
Rui Ueyama412b29e2017-10-31 17:37:20 +0000616 // 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
Saleem Abdulrasool8199dad2017-06-20 20:51:51 +0000621#if defined(__linux__)
Rui Ueyama412b29e2017-10-31 17:37:20 +0000622 // 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;
Nico Weber712e8d22018-04-29 00:45:03 +0000625#elif defined(_WIN32)
Yunzhong Gaofb2a9c42016-01-06 00:50:06 +0000626 // 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).
Rui Ueyama412b29e2017-10-31 17:37:20 +0000629 if (::_isatty(FD) && !RunningWindows8OrGreater())
630 MaxWriteSize = 32767;
Yunzhong Gaofb2a9c42016-01-06 00:50:06 +0000631#endif
632
Benjamin Kramerce84a252010-05-05 15:17:47 +0000633 do {
Rui Ueyama412b29e2017-10-31 17:37:20 +0000634 size_t ChunkSize = std::min(Size, MaxWriteSize);
Yunzhong Gaofb2a9c42016-01-06 00:50:06 +0000635 ssize_t ret = ::write(FD, Ptr, ChunkSize);
Dan Gohmanef969f32010-05-06 01:27:36 +0000636
637 if (ret < 0) {
638 // If it's a recoverable error, swallow it and retry the write.
Dan Gohmandea53102010-05-18 15:25:14 +0000639 //
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.
Dan Gohmand3511162010-05-06 02:06:20 +0000646 if (errno == EINTR || errno == EAGAIN
647#ifdef EWOULDBLOCK
648 || errno == EWOULDBLOCK
649#endif
650 )
Dan Gohmanef969f32010-05-06 01:27:36 +0000651 continue;
652
653 // Otherwise it's a non-recoverable error. Note it and quit.
Bob Haarman9ce2d032017-10-24 01:26:22 +0000654 error_detected(std::error_code(errno, std::generic_category()));
Dan Gohmanef969f32010-05-06 01:27:36 +0000655 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);
Chris Lattner84b94f72008-08-17 01:35:29 +0000664}
665
Dan Gohman44790e72010-08-18 01:34:52 +0000666void raw_fd_ostream::close() {
667 assert(ShouldClose);
668 ShouldClose = false;
669 flush();
Bob Haarman9ce2d032017-10-24 01:26:22 +0000670 if (auto EC = sys::Process::SafelyCloseFileDescriptor(FD))
671 error_detected(EC);
Dan Gohman44790e72010-08-18 01:34:52 +0000672 FD = -1;
673}
674
Ted Kremeneka2669922009-01-26 21:42:04 +0000675uint64_t raw_fd_ostream::seek(uint64_t off) {
Yaron Keren7cf7f802016-02-23 07:17:58 +0000676 assert(SupportsSeeking && "Stream does not support seeking!");
Ted Kremeneka2669922009-01-26 21:42:04 +0000677 flush();
Nico Weber712e8d22018-04-29 00:45:03 +0000678#ifdef _WIN32
Peter Collingbourne8db7e5e2016-12-09 05:20:43 +0000679 pos = ::_lseeki64(FD, off, SEEK_SET);
680#elif defined(HAVE_LSEEK64)
681 pos = ::lseek64(FD, off, SEEK_SET);
682#else
Peter Collingbournef74fcdd2016-12-09 05:04:30 +0000683 pos = ::lseek(FD, off, SEEK_SET);
Peter Collingbourne8db7e5e2016-12-09 05:20:43 +0000684#endif
Rafael Espindola642a2212015-04-14 22:54:16 +0000685 if (pos == (uint64_t)-1)
Bob Haarman9ce2d032017-10-24 01:26:22 +0000686 error_detected(std::error_code(errno, std::generic_category()));
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000687 return pos;
Ted Kremeneka2669922009-01-26 21:42:04 +0000688}
689
Rafael Espindola4ba9af12015-04-20 13:04:30 +0000690void raw_fd_ostream::pwrite_impl(const char *Ptr, size_t Size,
691 uint64_t Offset) {
Rafael Espindola37b70152015-04-14 15:00:34 +0000692 uint64_t Pos = tell();
693 seek(Offset);
694 write(Ptr, Size);
695 seek(Pos);
696}
697
Chris Lattnerdd3e9aa2009-12-19 01:38:42 +0000698size_t raw_fd_ostream::preferred_buffer_size() const {
Chris Lattnerca97c922010-07-07 15:52:27 +0000699#if !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(__minix)
Chris Lattnerc86cdc72010-04-09 20:45:04 +0000700 // Windows and Minix have no st_blksize.
Dan Gohman84487b92009-08-13 17:27:29 +0000701 assert(FD >= 0 && "File not yet open!");
702 struct stat statbuf;
Chris Lattnerdd3e9aa2009-12-19 01:38:42 +0000703 if (fstat(FD, &statbuf) != 0)
704 return 0;
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000705
Chris Lattnerdd3e9aa2009-12-19 01:38:42 +0000706 // 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;
Dan Gohmanfeaeb362010-05-28 16:50:01 +0000713#else
Dan Gohman84487b92009-08-13 17:27:29 +0000714 return raw_ostream::preferred_buffer_size();
Dan Gohmanfeaeb362010-05-28 16:50:01 +0000715#endif
Dan Gohman84487b92009-08-13 17:27:29 +0000716}
717
Torok Edwin9b5a47f2009-06-04 07:09:50 +0000718raw_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) {
Dan Gohmanf199ad62009-07-16 15:24:40 +0000726 size_t len = strlen(colorcode);
Torok Edwin9b5a47f2009-06-04 07:09:50 +0000727 write(colorcode, len);
728 // don't account colors towards output characters
729 pos -= len;
730 }
731 return *this;
732}
733
734raw_ostream &raw_fd_ostream::resetColor() {
735 if (sys::Process::ColorNeedsFlush())
736 flush();
737 const char *colorcode = sys::Process::ResetColor();
738 if (colorcode) {
Dan Gohmanf199ad62009-07-16 15:24:40 +0000739 size_t len = strlen(colorcode);
Torok Edwin9b5a47f2009-06-04 07:09:50 +0000740 write(colorcode, len);
741 // don't account colors towards output characters
742 pos -= len;
743 }
744 return *this;
745}
746
Benjamin Kramer13d16f32012-04-16 08:56:50 +0000747raw_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
Dan Gohmane5929232009-09-11 20:46:33 +0000760bool raw_fd_ostream::is_displayed() const {
761 return sys::Process::FileDescriptorIsDisplayed(FD);
762}
763
Daniel Dunbar04b45832012-07-20 18:29:41 +0000764bool raw_fd_ostream::has_colors() const {
765 return sys::Process::FileDescriptorHasColors(FD);
766}
767
Weiming Zhao1bd40002018-04-11 23:09:20 +0000768void raw_fd_ostream::anchor() {}
769
Chris Lattnerd3723fc2008-08-17 04:13:37 +0000770//===----------------------------------------------------------------------===//
Dan Gohmane9a46912010-08-20 16:44:56 +0000771// outs(), errs(), nulls()
Chris Lattnerd3723fc2008-08-17 04:13:37 +0000772//===----------------------------------------------------------------------===//
Chris Lattner84b94f72008-08-17 01:35:29 +0000773
Chris Lattnerd3723fc2008-08-17 04:13:37 +0000774/// outs() - This returns a reference to a raw_ostream for standard output.
775/// Use it like: outs() << "foo" << "bar";
Owen Anderson93719642008-08-21 00:14:44 +0000776raw_ostream &llvm::outs() {
Reid Kleckner02aeadc2017-08-04 01:39:23 +0000777 // Set buffer settings to model stdout behavior.
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000778 std::error_code EC;
779 static raw_fd_ostream S("-", EC, sys::fs::F_None);
780 assert(!EC);
Chris Lattnerd3723fc2008-08-17 04:13:37 +0000781 return S;
782}
783
784/// errs() - This returns a reference to a raw_ostream for standard error.
785/// Use it like: errs() << "foo" << "bar";
Owen Anderson93719642008-08-21 00:14:44 +0000786raw_ostream &llvm::errs() {
Dan Gohman443f2d62010-08-20 16:39:41 +0000787 // Set standard error to be unbuffered by default.
788 static raw_fd_ostream S(STDERR_FILENO, false, true);
Chris Lattnerd3723fc2008-08-17 04:13:37 +0000789 return S;
790}
791
Daniel Dunbar95a551a2009-07-16 21:17:53 +0000792/// nulls() - This returns a reference to a raw_ostream which discards output.
793raw_ostream &llvm::nulls() {
794 static raw_null_ostream S;
795 return S;
796}
797
Chris Lattner205af962008-08-23 22:43:04 +0000798//===----------------------------------------------------------------------===//
799// raw_string_ostream
800//===----------------------------------------------------------------------===//
801
Daniel Dunbard882f4b2009-08-18 20:07:36 +0000802raw_string_ostream::~raw_string_ostream() {
803 flush();
804}
805
Dan Gohmanf199ad62009-07-16 15:24:40 +0000806void raw_string_ostream::write_impl(const char *Ptr, size_t Size) {
Daniel Dunbardb7a36c2009-03-16 23:29:31 +0000807 OS.append(Ptr, Size);
Chris Lattner205af962008-08-23 22:43:04 +0000808}
809
810//===----------------------------------------------------------------------===//
811// raw_svector_ostream
812//===----------------------------------------------------------------------===//
813
Yaron Keren3d1173b2015-08-13 06:19:52 +0000814uint64_t raw_svector_ostream::current_pos() const { return OS.size(); }
Daniel Dunbarb090bf42009-08-19 17:54:29 +0000815
Yaron Keren3d1173b2015-08-13 06:19:52 +0000816void raw_svector_ostream::write_impl(const char *Ptr, size_t Size) {
817 OS.append(Ptr, Ptr + Size);
Nick Lewyckye2f6fb52015-08-13 18:10:19 +0000818}
Daniel Dunbard882f4b2009-08-18 20:07:36 +0000819
Rafael Espindola4ba9af12015-04-20 13:04:30 +0000820void raw_svector_ostream::pwrite_impl(const char *Ptr, size_t Size,
821 uint64_t Offset) {
Yaron Keren3d1173b2015-08-13 06:19:52 +0000822 memcpy(OS.data() + Offset, Ptr, Size);
Daniel Dunbare813cba2009-08-19 18:40:58 +0000823}
824
Daniel Dunbar95a551a2009-07-16 21:17:53 +0000825//===----------------------------------------------------------------------===//
826// raw_null_ostream
827//===----------------------------------------------------------------------===//
828
Dan Gohman4b66b472009-07-27 21:46:02 +0000829raw_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
Daniel Dunbar95a551a2009-07-16 21:17:53 +0000838void raw_null_ostream::write_impl(const char *Ptr, size_t Size) {
839}
840
Chris Lattnerdd3e9aa2009-12-19 01:38:42 +0000841uint64_t raw_null_ostream::current_pos() const {
Daniel Dunbar95a551a2009-07-16 21:17:53 +0000842 return 0;
843}
Rafael Espindola37b70152015-04-14 15:00:34 +0000844
Rafael Espindola4ba9af12015-04-20 13:04:30 +0000845void raw_null_ostream::pwrite_impl(const char *Ptr, size_t Size,
846 uint64_t Offset) {}
Weiming Zhao1bd40002018-04-11 23:09:20 +0000847
848void raw_pwrite_stream::anchor() {}