blob: 3de063449f74ce095bce7c3e05fbae2947e36234 [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,
501 sys::fs::OpenFlags Flags) {
Dan Gohmanc825cee2010-08-18 22:26:19 +0000502 // Handle "-" as stdout. Note that when we do this, we consider ourself
Yaron Keren80745c52017-03-31 12:08:45 +0000503 // the owner of stdout and may set the "binary" flag globally based on Flags.
Rafael Espindola3fd1e992014-08-25 18:16:47 +0000504 if (Filename == "-") {
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000505 EC = std::error_code();
Daniel Dunbared90e702008-11-13 05:01:07 +0000506 // If user requested binary then put stdout into binary mode if
507 // possible.
Rafael Espindola90c7f1c2014-02-24 18:20:12 +0000508 if (!(Flags & sys::fs::F_Text))
Rafael Espindolacb2eca02013-06-12 20:58:35 +0000509 sys::ChangeStdoutToBinary();
Yaron Keren9d27c472017-03-30 19:30:51 +0000510 return STDOUT_FILENO;
Chris Lattnerd5bc0682008-08-17 03:53:23 +0000511 }
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000512
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000513 int FD;
Rafael Espindola3fd1e992014-08-25 18:16:47 +0000514 EC = sys::fs::openFileForWrite(Filename, FD, Flags);
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000515 if (EC)
516 return -1;
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000517
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000518 return FD;
Chris Lattner84b94f72008-08-17 01:35:29 +0000519}
520
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000521raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC,
522 sys::fs::OpenFlags Flags)
523 : raw_fd_ostream(getFD(Filename, EC, Flags), true) {}
524
Rafael Espindola62e6ec02015-04-09 16:59:07 +0000525/// FD is the file descriptor that this writes to. If ShouldClose is true, this
526/// closes the file when the stream is destroyed.
Francois Picheta3037c32010-10-14 20:30:58 +0000527raw_fd_ostream::raw_fd_ostream(int fd, bool shouldClose, bool unbuffered)
Bob Haarman9ce2d032017-10-24 01:26:22 +0000528 : raw_pwrite_stream(unbuffered), FD(fd), ShouldClose(shouldClose) {
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000529 if (FD < 0 ) {
530 ShouldClose = false;
531 return;
532 }
Reid Kleckner02aeadc2017-08-04 01:39:23 +0000533
534 // Do not attempt to close stdout or stderr. We used to try to maintain the
535 // property that tools that support writing file to stdout should not also
536 // write informational output to stdout, but in practice we were never able to
537 // maintain this invariant. Many features have been added to LLVM and clang
538 // (-fdump-record-layouts, optimization remarks, etc) that print to stdout, so
539 // users must simply be aware that mixed output and remarks is a possibility.
Yaron Keren9d27c472017-03-30 19:30:51 +0000540 if (FD <= STDERR_FILENO)
541 ShouldClose = false;
Michael J. Spencerb7479902011-01-17 15:53:12 +0000542
543 // Get the starting position.
544 off_t loc = ::lseek(FD, 0, SEEK_CUR);
Nico Weber712e8d22018-04-29 00:45:03 +0000545#ifdef _WIN32
Rafael Espindolaa9b84ab2015-04-13 11:09:48 +0000546 // MSVCRT's _lseek(SEEK_CUR) doesn't return -1 for pipes.
547 sys::fs::file_status Status;
548 std::error_code EC = status(FD, Status);
549 SupportsSeeking = !EC && Status.type() == sys::fs::file_type::regular_file;
550#else
Rafael Espindola74d2f612015-04-10 18:15:51 +0000551 SupportsSeeking = loc != (off_t)-1;
Rafael Espindolaa9b84ab2015-04-13 11:09:48 +0000552#endif
Rafael Espindola74d2f612015-04-10 18:15:51 +0000553 if (!SupportsSeeking)
Michael J. Spencerb7479902011-01-17 15:53:12 +0000554 pos = 0;
555 else
556 pos = static_cast<uint64_t>(loc);
Francois Picheta3037c32010-10-14 20:30:58 +0000557}
558
Chris Lattner84b94f72008-08-17 01:35:29 +0000559raw_fd_ostream::~raw_fd_ostream() {
Dan Gohman38adfdd2010-08-20 16:34:20 +0000560 if (FD >= 0) {
561 flush();
Bob Haarman9ce2d032017-10-24 01:26:22 +0000562 if (ShouldClose) {
563 if (auto EC = sys::Process::SafelyCloseFileDescriptor(FD))
564 error_detected(EC);
565 }
Dan Gohman38adfdd2010-08-20 16:34:20 +0000566 }
567
NAKAMURA Takumi76e68ea2011-03-16 02:53:39 +0000568#ifdef __MINGW32__
569 // On mingw, global dtors should not call exit().
570 // report_fatal_error() invokes exit(). We know report_fatal_error()
571 // might not write messages to stderr when any errors were detected
572 // on FD == 2.
573 if (FD == 2) return;
574#endif
575
Dan Gohman38adfdd2010-08-20 16:34:20 +0000576 // If there are any pending errors, report them now. Clients wishing
577 // to avoid report_fatal_error calls should check for errors with
578 // has_error() and clear the error flag with clear_error() before
579 // destructing raw_ostream objects which may have errors.
580 if (has_error())
Bob Haarman9ce2d032017-10-24 01:26:22 +0000581 report_fatal_error("IO failure on output stream: " + error().message(),
582 /*GenCrashDiag=*/false);
Chris Lattnerce3b2c32010-08-17 23:11:56 +0000583}
Chris Lattner9e6f1f12009-08-23 02:51:22 +0000584
Dan Gohmanf199ad62009-07-16 15:24:40 +0000585void raw_fd_ostream::write_impl(const char *Ptr, size_t Size) {
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000586 assert(FD >= 0 && "File already closed.");
Daniel Dunbardb7a36c2009-03-16 23:29:31 +0000587 pos += Size;
Dan Gohmanef969f32010-05-06 01:27:36 +0000588
Rui Ueyama412b29e2017-10-31 17:37:20 +0000589 // The maximum write size is limited to SSIZE_MAX because a write
590 // greater than SSIZE_MAX is implementation-defined in POSIX.
591 // Since SSIZE_MAX is not portable, we use SIZE_MAX >> 1 instead.
592 size_t MaxWriteSize = SIZE_MAX >> 1;
593
Saleem Abdulrasool8199dad2017-06-20 20:51:51 +0000594#if defined(__linux__)
Rui Ueyama412b29e2017-10-31 17:37:20 +0000595 // It is observed that Linux returns EINVAL for a very large write (>2G).
596 // Make it a reasonably small value.
597 MaxWriteSize = 1024 * 1024 * 1024;
Nico Weber712e8d22018-04-29 00:45:03 +0000598#elif defined(_WIN32)
Yunzhong Gaofb2a9c42016-01-06 00:50:06 +0000599 // Writing a large size of output to Windows console returns ENOMEM. It seems
600 // that, prior to Windows 8, WriteFile() is redirecting to WriteConsole(), and
601 // the latter has a size limit (66000 bytes or less, depending on heap usage).
Rui Ueyama412b29e2017-10-31 17:37:20 +0000602 if (::_isatty(FD) && !RunningWindows8OrGreater())
603 MaxWriteSize = 32767;
Yunzhong Gaofb2a9c42016-01-06 00:50:06 +0000604#endif
605
Benjamin Kramerce84a252010-05-05 15:17:47 +0000606 do {
Rui Ueyama412b29e2017-10-31 17:37:20 +0000607 size_t ChunkSize = std::min(Size, MaxWriteSize);
Yunzhong Gaofb2a9c42016-01-06 00:50:06 +0000608 ssize_t ret = ::write(FD, Ptr, ChunkSize);
Dan Gohmanef969f32010-05-06 01:27:36 +0000609
610 if (ret < 0) {
611 // If it's a recoverable error, swallow it and retry the write.
Dan Gohmandea53102010-05-18 15:25:14 +0000612 //
613 // Ideally we wouldn't ever see EAGAIN or EWOULDBLOCK here, since
614 // raw_ostream isn't designed to do non-blocking I/O. However, some
615 // programs, such as old versions of bjam, have mistakenly used
616 // O_NONBLOCK. For compatibility, emulate blocking semantics by
617 // spinning until the write succeeds. If you don't want spinning,
618 // don't use O_NONBLOCK file descriptors with raw_ostream.
Dan Gohmand3511162010-05-06 02:06:20 +0000619 if (errno == EINTR || errno == EAGAIN
620#ifdef EWOULDBLOCK
621 || errno == EWOULDBLOCK
622#endif
623 )
Dan Gohmanef969f32010-05-06 01:27:36 +0000624 continue;
625
626 // Otherwise it's a non-recoverable error. Note it and quit.
Bob Haarman9ce2d032017-10-24 01:26:22 +0000627 error_detected(std::error_code(errno, std::generic_category()));
Dan Gohmanef969f32010-05-06 01:27:36 +0000628 break;
629 }
630
631 // The write may have written some or all of the data. Update the
632 // size and buffer pointer to reflect the remainder that needs
633 // to be written. If there are no bytes left, we're done.
634 Ptr += ret;
635 Size -= ret;
636 } while (Size > 0);
Chris Lattner84b94f72008-08-17 01:35:29 +0000637}
638
Dan Gohman44790e72010-08-18 01:34:52 +0000639void raw_fd_ostream::close() {
640 assert(ShouldClose);
641 ShouldClose = false;
642 flush();
Bob Haarman9ce2d032017-10-24 01:26:22 +0000643 if (auto EC = sys::Process::SafelyCloseFileDescriptor(FD))
644 error_detected(EC);
Dan Gohman44790e72010-08-18 01:34:52 +0000645 FD = -1;
646}
647
Ted Kremeneka2669922009-01-26 21:42:04 +0000648uint64_t raw_fd_ostream::seek(uint64_t off) {
Yaron Keren7cf7f802016-02-23 07:17:58 +0000649 assert(SupportsSeeking && "Stream does not support seeking!");
Ted Kremeneka2669922009-01-26 21:42:04 +0000650 flush();
Nico Weber712e8d22018-04-29 00:45:03 +0000651#ifdef _WIN32
Peter Collingbourne8db7e5e2016-12-09 05:20:43 +0000652 pos = ::_lseeki64(FD, off, SEEK_SET);
653#elif defined(HAVE_LSEEK64)
654 pos = ::lseek64(FD, off, SEEK_SET);
655#else
Peter Collingbournef74fcdd2016-12-09 05:04:30 +0000656 pos = ::lseek(FD, off, SEEK_SET);
Peter Collingbourne8db7e5e2016-12-09 05:20:43 +0000657#endif
Rafael Espindola642a2212015-04-14 22:54:16 +0000658 if (pos == (uint64_t)-1)
Bob Haarman9ce2d032017-10-24 01:26:22 +0000659 error_detected(std::error_code(errno, std::generic_category()));
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000660 return pos;
Ted Kremeneka2669922009-01-26 21:42:04 +0000661}
662
Rafael Espindola4ba9af12015-04-20 13:04:30 +0000663void raw_fd_ostream::pwrite_impl(const char *Ptr, size_t Size,
664 uint64_t Offset) {
Rafael Espindola37b70152015-04-14 15:00:34 +0000665 uint64_t Pos = tell();
666 seek(Offset);
667 write(Ptr, Size);
668 seek(Pos);
669}
670
Chris Lattnerdd3e9aa2009-12-19 01:38:42 +0000671size_t raw_fd_ostream::preferred_buffer_size() const {
Chris Lattnerca97c922010-07-07 15:52:27 +0000672#if !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(__minix)
Chris Lattnerc86cdc72010-04-09 20:45:04 +0000673 // Windows and Minix have no st_blksize.
Dan Gohman84487b92009-08-13 17:27:29 +0000674 assert(FD >= 0 && "File not yet open!");
675 struct stat statbuf;
Chris Lattnerdd3e9aa2009-12-19 01:38:42 +0000676 if (fstat(FD, &statbuf) != 0)
677 return 0;
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000678
Chris Lattnerdd3e9aa2009-12-19 01:38:42 +0000679 // If this is a terminal, don't use buffering. Line buffering
680 // would be a more traditional thing to do, but it's not worth
681 // the complexity.
682 if (S_ISCHR(statbuf.st_mode) && isatty(FD))
683 return 0;
684 // Return the preferred block size.
685 return statbuf.st_blksize;
Dan Gohmanfeaeb362010-05-28 16:50:01 +0000686#else
Dan Gohman84487b92009-08-13 17:27:29 +0000687 return raw_ostream::preferred_buffer_size();
Dan Gohmanfeaeb362010-05-28 16:50:01 +0000688#endif
Dan Gohman84487b92009-08-13 17:27:29 +0000689}
690
Torok Edwin9b5a47f2009-06-04 07:09:50 +0000691raw_ostream &raw_fd_ostream::changeColor(enum Colors colors, bool bold,
692 bool bg) {
693 if (sys::Process::ColorNeedsFlush())
694 flush();
695 const char *colorcode =
696 (colors == SAVEDCOLOR) ? sys::Process::OutputBold(bg)
697 : sys::Process::OutputColor(colors, bold, bg);
698 if (colorcode) {
Dan Gohmanf199ad62009-07-16 15:24:40 +0000699 size_t len = strlen(colorcode);
Torok Edwin9b5a47f2009-06-04 07:09:50 +0000700 write(colorcode, len);
701 // don't account colors towards output characters
702 pos -= len;
703 }
704 return *this;
705}
706
707raw_ostream &raw_fd_ostream::resetColor() {
708 if (sys::Process::ColorNeedsFlush())
709 flush();
710 const char *colorcode = sys::Process::ResetColor();
711 if (colorcode) {
Dan Gohmanf199ad62009-07-16 15:24:40 +0000712 size_t len = strlen(colorcode);
Torok Edwin9b5a47f2009-06-04 07:09:50 +0000713 write(colorcode, len);
714 // don't account colors towards output characters
715 pos -= len;
716 }
717 return *this;
718}
719
Benjamin Kramer13d16f32012-04-16 08:56:50 +0000720raw_ostream &raw_fd_ostream::reverseColor() {
721 if (sys::Process::ColorNeedsFlush())
722 flush();
723 const char *colorcode = sys::Process::OutputReverse();
724 if (colorcode) {
725 size_t len = strlen(colorcode);
726 write(colorcode, len);
727 // don't account colors towards output characters
728 pos -= len;
729 }
730 return *this;
731}
732
Dan Gohmane5929232009-09-11 20:46:33 +0000733bool raw_fd_ostream::is_displayed() const {
734 return sys::Process::FileDescriptorIsDisplayed(FD);
735}
736
Daniel Dunbar04b45832012-07-20 18:29:41 +0000737bool raw_fd_ostream::has_colors() const {
738 return sys::Process::FileDescriptorHasColors(FD);
739}
740
Weiming Zhao1bd40002018-04-11 23:09:20 +0000741void raw_fd_ostream::anchor() {}
742
Chris Lattnerd3723fc2008-08-17 04:13:37 +0000743//===----------------------------------------------------------------------===//
Dan Gohmane9a46912010-08-20 16:44:56 +0000744// outs(), errs(), nulls()
Chris Lattnerd3723fc2008-08-17 04:13:37 +0000745//===----------------------------------------------------------------------===//
Chris Lattner84b94f72008-08-17 01:35:29 +0000746
Chris Lattnerd3723fc2008-08-17 04:13:37 +0000747/// outs() - This returns a reference to a raw_ostream for standard output.
748/// Use it like: outs() << "foo" << "bar";
Owen Anderson93719642008-08-21 00:14:44 +0000749raw_ostream &llvm::outs() {
Reid Kleckner02aeadc2017-08-04 01:39:23 +0000750 // Set buffer settings to model stdout behavior.
Rafael Espindola79be4cc2015-04-13 10:28:56 +0000751 std::error_code EC;
752 static raw_fd_ostream S("-", EC, sys::fs::F_None);
753 assert(!EC);
Chris Lattnerd3723fc2008-08-17 04:13:37 +0000754 return S;
755}
756
757/// errs() - This returns a reference to a raw_ostream for standard error.
758/// Use it like: errs() << "foo" << "bar";
Owen Anderson93719642008-08-21 00:14:44 +0000759raw_ostream &llvm::errs() {
Dan Gohman443f2d62010-08-20 16:39:41 +0000760 // Set standard error to be unbuffered by default.
761 static raw_fd_ostream S(STDERR_FILENO, false, true);
Chris Lattnerd3723fc2008-08-17 04:13:37 +0000762 return S;
763}
764
Daniel Dunbar95a551a2009-07-16 21:17:53 +0000765/// nulls() - This returns a reference to a raw_ostream which discards output.
766raw_ostream &llvm::nulls() {
767 static raw_null_ostream S;
768 return S;
769}
770
Chris Lattner205af962008-08-23 22:43:04 +0000771//===----------------------------------------------------------------------===//
772// raw_string_ostream
773//===----------------------------------------------------------------------===//
774
Daniel Dunbard882f4b2009-08-18 20:07:36 +0000775raw_string_ostream::~raw_string_ostream() {
776 flush();
777}
778
Dan Gohmanf199ad62009-07-16 15:24:40 +0000779void raw_string_ostream::write_impl(const char *Ptr, size_t Size) {
Daniel Dunbardb7a36c2009-03-16 23:29:31 +0000780 OS.append(Ptr, Size);
Chris Lattner205af962008-08-23 22:43:04 +0000781}
782
783//===----------------------------------------------------------------------===//
784// raw_svector_ostream
785//===----------------------------------------------------------------------===//
786
Yaron Keren3d1173b2015-08-13 06:19:52 +0000787uint64_t raw_svector_ostream::current_pos() const { return OS.size(); }
Daniel Dunbarb090bf42009-08-19 17:54:29 +0000788
Yaron Keren3d1173b2015-08-13 06:19:52 +0000789void raw_svector_ostream::write_impl(const char *Ptr, size_t Size) {
790 OS.append(Ptr, Ptr + Size);
Nick Lewyckye2f6fb52015-08-13 18:10:19 +0000791}
Daniel Dunbard882f4b2009-08-18 20:07:36 +0000792
Rafael Espindola4ba9af12015-04-20 13:04:30 +0000793void raw_svector_ostream::pwrite_impl(const char *Ptr, size_t Size,
794 uint64_t Offset) {
Yaron Keren3d1173b2015-08-13 06:19:52 +0000795 memcpy(OS.data() + Offset, Ptr, Size);
Daniel Dunbare813cba2009-08-19 18:40:58 +0000796}
797
Daniel Dunbar95a551a2009-07-16 21:17:53 +0000798//===----------------------------------------------------------------------===//
799// raw_null_ostream
800//===----------------------------------------------------------------------===//
801
Dan Gohman4b66b472009-07-27 21:46:02 +0000802raw_null_ostream::~raw_null_ostream() {
803#ifndef NDEBUG
804 // ~raw_ostream asserts that the buffer is empty. This isn't necessary
805 // with raw_null_ostream, but it's better to have raw_null_ostream follow
806 // the rules than to change the rules just for raw_null_ostream.
807 flush();
808#endif
809}
810
Daniel Dunbar95a551a2009-07-16 21:17:53 +0000811void raw_null_ostream::write_impl(const char *Ptr, size_t Size) {
812}
813
Chris Lattnerdd3e9aa2009-12-19 01:38:42 +0000814uint64_t raw_null_ostream::current_pos() const {
Daniel Dunbar95a551a2009-07-16 21:17:53 +0000815 return 0;
816}
Rafael Espindola37b70152015-04-14 15:00:34 +0000817
Rafael Espindola4ba9af12015-04-20 13:04:30 +0000818void raw_null_ostream::pwrite_impl(const char *Ptr, size_t Size,
819 uint64_t Offset) {}
Weiming Zhao1bd40002018-04-11 23:09:20 +0000820
821void raw_pwrite_stream::anchor() {}