File: | src/gnu/usr.bin/clang/libLLVMSupport/../../../llvm/llvm/lib/Support/raw_ostream.cpp |
Warning: | line 295, column 5 Null pointer passed as 1st argument to memory copy function |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | //===--- raw_ostream.cpp - Implement the raw_ostream classes --------------===// | |||
2 | // | |||
3 | // 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 | |||
6 | // | |||
7 | //===----------------------------------------------------------------------===// | |||
8 | // | |||
9 | // This implements support for bulk buffered stream output. | |||
10 | // | |||
11 | //===----------------------------------------------------------------------===// | |||
12 | ||||
13 | #include "llvm/Support/raw_ostream.h" | |||
14 | #include "llvm/ADT/STLExtras.h" | |||
15 | #include "llvm/ADT/StringExtras.h" | |||
16 | #include "llvm/Config/config.h" | |||
17 | #include "llvm/Support/Compiler.h" | |||
18 | #include "llvm/Support/ErrorHandling.h" | |||
19 | #include "llvm/Support/FileSystem.h" | |||
20 | #include "llvm/Support/Format.h" | |||
21 | #include "llvm/Support/FormatVariadic.h" | |||
22 | #include "llvm/Support/MathExtras.h" | |||
23 | #include "llvm/Support/NativeFormatting.h" | |||
24 | #include "llvm/Support/Process.h" | |||
25 | #include "llvm/Support/Program.h" | |||
26 | #include <algorithm> | |||
27 | #include <cctype> | |||
28 | #include <cerrno> | |||
29 | #include <cstdio> | |||
30 | #include <iterator> | |||
31 | #include <sys/stat.h> | |||
32 | ||||
33 | // <fcntl.h> may provide O_BINARY. | |||
34 | #if defined(HAVE_FCNTL_H1) | |||
35 | # include <fcntl.h> | |||
36 | #endif | |||
37 | ||||
38 | #if defined(HAVE_UNISTD_H1) | |||
39 | # include <unistd.h> | |||
40 | #endif | |||
41 | ||||
42 | #if defined(__CYGWIN__) | |||
43 | #include <io.h> | |||
44 | #endif | |||
45 | ||||
46 | #if defined(_MSC_VER) | |||
47 | #include <io.h> | |||
48 | #ifndef STDIN_FILENO0 | |||
49 | # define STDIN_FILENO0 0 | |||
50 | #endif | |||
51 | #ifndef STDOUT_FILENO1 | |||
52 | # define STDOUT_FILENO1 1 | |||
53 | #endif | |||
54 | #ifndef STDERR_FILENO2 | |||
55 | # define STDERR_FILENO2 2 | |||
56 | #endif | |||
57 | #endif | |||
58 | ||||
59 | #ifdef _WIN32 | |||
60 | #include "llvm/Support/ConvertUTF.h" | |||
61 | #include "llvm/Support/Windows/WindowsSupport.h" | |||
62 | #endif | |||
63 | ||||
64 | using namespace llvm; | |||
65 | ||||
66 | constexpr raw_ostream::Colors raw_ostream::BLACK; | |||
67 | constexpr raw_ostream::Colors raw_ostream::RED; | |||
68 | constexpr raw_ostream::Colors raw_ostream::GREEN; | |||
69 | constexpr raw_ostream::Colors raw_ostream::YELLOW; | |||
70 | constexpr raw_ostream::Colors raw_ostream::BLUE; | |||
71 | constexpr raw_ostream::Colors raw_ostream::MAGENTA; | |||
72 | constexpr raw_ostream::Colors raw_ostream::CYAN; | |||
73 | constexpr raw_ostream::Colors raw_ostream::WHITE; | |||
74 | constexpr raw_ostream::Colors raw_ostream::SAVEDCOLOR; | |||
75 | constexpr raw_ostream::Colors raw_ostream::RESET; | |||
76 | ||||
77 | raw_ostream::~raw_ostream() { | |||
78 | // raw_ostream's subclasses should take care to flush the buffer | |||
79 | // in their destructors. | |||
80 | assert(OutBufCur == OutBufStart &&((void)0) | |||
81 | "raw_ostream destructor called with non-empty buffer!")((void)0); | |||
82 | ||||
83 | if (BufferMode == BufferKind::InternalBuffer) | |||
84 | delete [] OutBufStart; | |||
85 | } | |||
86 | ||||
87 | size_t raw_ostream::preferred_buffer_size() const { | |||
88 | // BUFSIZ is intended to be a reasonable default. | |||
89 | return BUFSIZ1024; | |||
90 | } | |||
91 | ||||
92 | void raw_ostream::SetBuffered() { | |||
93 | // Ask the subclass to determine an appropriate buffer size. | |||
94 | if (size_t Size = preferred_buffer_size()) | |||
95 | SetBufferSize(Size); | |||
96 | else | |||
97 | // It may return 0, meaning this stream should be unbuffered. | |||
98 | SetUnbuffered(); | |||
99 | } | |||
100 | ||||
101 | void raw_ostream::SetBufferAndMode(char *BufferStart, size_t Size, | |||
102 | BufferKind Mode) { | |||
103 | assert(((Mode == BufferKind::Unbuffered && !BufferStart && Size == 0) ||((void)0) | |||
104 | (Mode != BufferKind::Unbuffered && BufferStart && Size != 0)) &&((void)0) | |||
105 | "stream must be unbuffered or have at least one byte")((void)0); | |||
106 | // Make sure the current buffer is free of content (we can't flush here; the | |||
107 | // child buffer management logic will be in write_impl). | |||
108 | assert(GetNumBytesInBuffer() == 0 && "Current buffer is non-empty!")((void)0); | |||
109 | ||||
110 | if (BufferMode == BufferKind::InternalBuffer) | |||
111 | delete [] OutBufStart; | |||
112 | OutBufStart = BufferStart; | |||
113 | OutBufEnd = OutBufStart+Size; | |||
114 | OutBufCur = OutBufStart; | |||
115 | BufferMode = Mode; | |||
116 | ||||
117 | assert(OutBufStart <= OutBufEnd && "Invalid size!")((void)0); | |||
118 | } | |||
119 | ||||
120 | raw_ostream &raw_ostream::operator<<(unsigned long N) { | |||
121 | write_integer(*this, static_cast<uint64_t>(N), 0, IntegerStyle::Integer); | |||
122 | return *this; | |||
123 | } | |||
124 | ||||
125 | raw_ostream &raw_ostream::operator<<(long N) { | |||
126 | write_integer(*this, static_cast<int64_t>(N), 0, IntegerStyle::Integer); | |||
127 | return *this; | |||
128 | } | |||
129 | ||||
130 | raw_ostream &raw_ostream::operator<<(unsigned long long N) { | |||
131 | write_integer(*this, static_cast<uint64_t>(N), 0, IntegerStyle::Integer); | |||
132 | return *this; | |||
133 | } | |||
134 | ||||
135 | raw_ostream &raw_ostream::operator<<(long long N) { | |||
136 | write_integer(*this, static_cast<int64_t>(N), 0, IntegerStyle::Integer); | |||
137 | return *this; | |||
138 | } | |||
139 | ||||
140 | raw_ostream &raw_ostream::write_hex(unsigned long long N) { | |||
141 | llvm::write_hex(*this, N, HexPrintStyle::Lower); | |||
142 | return *this; | |||
143 | } | |||
144 | ||||
145 | raw_ostream &raw_ostream::operator<<(Colors C) { | |||
146 | if (C == Colors::RESET) | |||
147 | resetColor(); | |||
148 | else | |||
149 | changeColor(C); | |||
150 | return *this; | |||
151 | } | |||
152 | ||||
153 | raw_ostream &raw_ostream::write_uuid(const uuid_t UUID) { | |||
154 | for (int Idx = 0; Idx < 16; ++Idx) { | |||
| ||||
155 | *this << format("%02" PRIX32"X", UUID[Idx]); | |||
156 | if (Idx == 3 || Idx == 5 || Idx == 7 || Idx == 9) | |||
157 | *this << "-"; | |||
158 | } | |||
159 | return *this; | |||
160 | } | |||
161 | ||||
162 | ||||
163 | raw_ostream &raw_ostream::write_escaped(StringRef Str, | |||
164 | bool UseHexEscapes) { | |||
165 | for (unsigned char c : Str) { | |||
166 | switch (c) { | |||
167 | case '\\': | |||
168 | *this << '\\' << '\\'; | |||
169 | break; | |||
170 | case '\t': | |||
171 | *this << '\\' << 't'; | |||
172 | break; | |||
173 | case '\n': | |||
174 | *this << '\\' << 'n'; | |||
175 | break; | |||
176 | case '"': | |||
177 | *this << '\\' << '"'; | |||
178 | break; | |||
179 | default: | |||
180 | if (isPrint(c)) { | |||
181 | *this << c; | |||
182 | break; | |||
183 | } | |||
184 | ||||
185 | // Write out the escaped representation. | |||
186 | if (UseHexEscapes) { | |||
187 | *this << '\\' << 'x'; | |||
188 | *this << hexdigit((c >> 4 & 0xF)); | |||
189 | *this << hexdigit((c >> 0) & 0xF); | |||
190 | } else { | |||
191 | // Always use a full 3-character octal escape. | |||
192 | *this << '\\'; | |||
193 | *this << char('0' + ((c >> 6) & 7)); | |||
194 | *this << char('0' + ((c >> 3) & 7)); | |||
195 | *this << char('0' + ((c >> 0) & 7)); | |||
196 | } | |||
197 | } | |||
198 | } | |||
199 | ||||
200 | return *this; | |||
201 | } | |||
202 | ||||
203 | raw_ostream &raw_ostream::operator<<(const void *P) { | |||
204 | llvm::write_hex(*this, (uintptr_t)P, HexPrintStyle::PrefixLower); | |||
205 | return *this; | |||
206 | } | |||
207 | ||||
208 | raw_ostream &raw_ostream::operator<<(double N) { | |||
209 | llvm::write_double(*this, N, FloatStyle::Exponent); | |||
210 | return *this; | |||
211 | } | |||
212 | ||||
213 | void raw_ostream::flush_nonempty() { | |||
214 | assert(OutBufCur > OutBufStart && "Invalid call to flush_nonempty.")((void)0); | |||
215 | size_t Length = OutBufCur - OutBufStart; | |||
216 | OutBufCur = OutBufStart; | |||
217 | flush_tied_then_write(OutBufStart, Length); | |||
218 | } | |||
219 | ||||
220 | raw_ostream &raw_ostream::write(unsigned char C) { | |||
221 | // Group exceptional cases into a single branch. | |||
222 | if (LLVM_UNLIKELY(OutBufCur >= OutBufEnd)__builtin_expect((bool)(OutBufCur >= OutBufEnd), false)) { | |||
223 | if (LLVM_UNLIKELY(!OutBufStart)__builtin_expect((bool)(!OutBufStart), false)) { | |||
224 | if (BufferMode == BufferKind::Unbuffered) { | |||
225 | flush_tied_then_write(reinterpret_cast<char *>(&C), 1); | |||
226 | return *this; | |||
227 | } | |||
228 | // Set up a buffer and start over. | |||
229 | SetBuffered(); | |||
230 | return write(C); | |||
231 | } | |||
232 | ||||
233 | flush_nonempty(); | |||
234 | } | |||
235 | ||||
236 | *OutBufCur++ = C; | |||
237 | return *this; | |||
238 | } | |||
239 | ||||
240 | raw_ostream &raw_ostream::write(const char *Ptr, size_t Size) { | |||
241 | // Group exceptional cases into a single branch. | |||
242 | if (LLVM_UNLIKELY(size_t(OutBufEnd - OutBufCur) < Size)__builtin_expect((bool)(size_t(OutBufEnd - OutBufCur) < Size ), false)) { | |||
243 | if (LLVM_UNLIKELY(!OutBufStart)__builtin_expect((bool)(!OutBufStart), false)) { | |||
244 | if (BufferMode == BufferKind::Unbuffered) { | |||
245 | flush_tied_then_write(Ptr, Size); | |||
246 | return *this; | |||
247 | } | |||
248 | // Set up a buffer and start over. | |||
249 | SetBuffered(); | |||
250 | return write(Ptr, Size); | |||
251 | } | |||
252 | ||||
253 | size_t NumBytes = OutBufEnd - OutBufCur; | |||
254 | ||||
255 | // If the buffer is empty at this point we have a string that is larger | |||
256 | // than the buffer. Directly write the chunk that is a multiple of the | |||
257 | // preferred buffer size and put the remainder in the buffer. | |||
258 | if (LLVM_UNLIKELY(OutBufCur == OutBufStart)__builtin_expect((bool)(OutBufCur == OutBufStart), false)) { | |||
259 | assert(NumBytes != 0 && "undefined behavior")((void)0); | |||
260 | size_t BytesToWrite = Size - (Size % NumBytes); | |||
261 | flush_tied_then_write(Ptr, BytesToWrite); | |||
262 | size_t BytesRemaining = Size - BytesToWrite; | |||
263 | if (BytesRemaining > size_t(OutBufEnd - OutBufCur)) { | |||
264 | // Too much left over to copy into our buffer. | |||
265 | return write(Ptr + BytesToWrite, BytesRemaining); | |||
266 | } | |||
267 | copy_to_buffer(Ptr + BytesToWrite, BytesRemaining); | |||
268 | return *this; | |||
269 | } | |||
270 | ||||
271 | // We don't have enough space in the buffer to fit the string in. Insert as | |||
272 | // much as possible, flush and start over with the remainder. | |||
273 | copy_to_buffer(Ptr, NumBytes); | |||
274 | flush_nonempty(); | |||
275 | return write(Ptr + NumBytes, Size - NumBytes); | |||
276 | } | |||
277 | ||||
278 | copy_to_buffer(Ptr, Size); | |||
279 | ||||
280 | return *this; | |||
281 | } | |||
282 | ||||
283 | void raw_ostream::copy_to_buffer(const char *Ptr, size_t Size) { | |||
284 | assert(Size <= size_t(OutBufEnd - OutBufCur) && "Buffer overrun!")((void)0); | |||
285 | ||||
286 | // Handle short strings specially, memcpy isn't very good at very short | |||
287 | // strings. | |||
288 | switch (Size) { | |||
289 | case 4: OutBufCur[3] = Ptr[3]; LLVM_FALLTHROUGH[[gnu::fallthrough]]; | |||
290 | case 3: OutBufCur[2] = Ptr[2]; LLVM_FALLTHROUGH[[gnu::fallthrough]]; | |||
291 | case 2: OutBufCur[1] = Ptr[1]; LLVM_FALLTHROUGH[[gnu::fallthrough]]; | |||
292 | case 1: OutBufCur[0] = Ptr[0]; LLVM_FALLTHROUGH[[gnu::fallthrough]]; | |||
293 | case 0: break; | |||
294 | default: | |||
295 | memcpy(OutBufCur, Ptr, Size); | |||
| ||||
296 | break; | |||
297 | } | |||
298 | ||||
299 | OutBufCur += Size; | |||
300 | } | |||
301 | ||||
302 | void raw_ostream::flush_tied_then_write(const char *Ptr, size_t Size) { | |||
303 | if (TiedStream) | |||
304 | TiedStream->flush(); | |||
305 | write_impl(Ptr, Size); | |||
306 | } | |||
307 | ||||
308 | // Formatted output. | |||
309 | raw_ostream &raw_ostream::operator<<(const format_object_base &Fmt) { | |||
310 | // If we have more than a few bytes left in our output buffer, try | |||
311 | // formatting directly onto its end. | |||
312 | size_t NextBufferSize = 127; | |||
313 | size_t BufferBytesLeft = OutBufEnd - OutBufCur; | |||
314 | if (BufferBytesLeft > 3) { | |||
315 | size_t BytesUsed = Fmt.print(OutBufCur, BufferBytesLeft); | |||
316 | ||||
317 | // Common case is that we have plenty of space. | |||
318 | if (BytesUsed <= BufferBytesLeft) { | |||
319 | OutBufCur += BytesUsed; | |||
320 | return *this; | |||
321 | } | |||
322 | ||||
323 | // Otherwise, we overflowed and the return value tells us the size to try | |||
324 | // again with. | |||
325 | NextBufferSize = BytesUsed; | |||
326 | } | |||
327 | ||||
328 | // If we got here, we didn't have enough space in the output buffer for the | |||
329 | // string. Try printing into a SmallVector that is resized to have enough | |||
330 | // space. Iterate until we win. | |||
331 | SmallVector<char, 128> V; | |||
332 | ||||
333 | while (true) { | |||
334 | V.resize(NextBufferSize); | |||
335 | ||||
336 | // Try formatting into the SmallVector. | |||
337 | size_t BytesUsed = Fmt.print(V.data(), NextBufferSize); | |||
338 | ||||
339 | // If BytesUsed fit into the vector, we win. | |||
340 | if (BytesUsed <= NextBufferSize) | |||
341 | return write(V.data(), BytesUsed); | |||
342 | ||||
343 | // Otherwise, try again with a new size. | |||
344 | assert(BytesUsed > NextBufferSize && "Didn't grow buffer!?")((void)0); | |||
345 | NextBufferSize = BytesUsed; | |||
346 | } | |||
347 | } | |||
348 | ||||
349 | raw_ostream &raw_ostream::operator<<(const formatv_object_base &Obj) { | |||
350 | Obj.format(*this); | |||
351 | return *this; | |||
352 | } | |||
353 | ||||
354 | raw_ostream &raw_ostream::operator<<(const FormattedString &FS) { | |||
355 | unsigned LeftIndent = 0; | |||
356 | unsigned RightIndent = 0; | |||
357 | const ssize_t Difference = FS.Width - FS.Str.size(); | |||
358 | if (Difference > 0) { | |||
359 | switch (FS.Justify) { | |||
360 | case FormattedString::JustifyNone: | |||
361 | break; | |||
362 | case FormattedString::JustifyLeft: | |||
363 | RightIndent = Difference; | |||
364 | break; | |||
365 | case FormattedString::JustifyRight: | |||
366 | LeftIndent = Difference; | |||
367 | break; | |||
368 | case FormattedString::JustifyCenter: | |||
369 | LeftIndent = Difference / 2; | |||
370 | RightIndent = Difference - LeftIndent; | |||
371 | break; | |||
372 | } | |||
373 | } | |||
374 | indent(LeftIndent); | |||
375 | (*this) << FS.Str; | |||
376 | indent(RightIndent); | |||
377 | return *this; | |||
378 | } | |||
379 | ||||
380 | raw_ostream &raw_ostream::operator<<(const FormattedNumber &FN) { | |||
381 | if (FN.Hex) { | |||
382 | HexPrintStyle Style; | |||
383 | if (FN.Upper && FN.HexPrefix) | |||
384 | Style = HexPrintStyle::PrefixUpper; | |||
385 | else if (FN.Upper && !FN.HexPrefix) | |||
386 | Style = HexPrintStyle::Upper; | |||
387 | else if (!FN.Upper && FN.HexPrefix) | |||
388 | Style = HexPrintStyle::PrefixLower; | |||
389 | else | |||
390 | Style = HexPrintStyle::Lower; | |||
391 | llvm::write_hex(*this, FN.HexValue, Style, FN.Width); | |||
392 | } else { | |||
393 | llvm::SmallString<16> Buffer; | |||
394 | llvm::raw_svector_ostream Stream(Buffer); | |||
395 | llvm::write_integer(Stream, FN.DecValue, 0, IntegerStyle::Integer); | |||
396 | if (Buffer.size() < FN.Width) | |||
397 | indent(FN.Width - Buffer.size()); | |||
398 | (*this) << Buffer; | |||
399 | } | |||
400 | return *this; | |||
401 | } | |||
402 | ||||
403 | raw_ostream &raw_ostream::operator<<(const FormattedBytes &FB) { | |||
404 | if (FB.Bytes.empty()) | |||
405 | return *this; | |||
406 | ||||
407 | size_t LineIndex = 0; | |||
408 | auto Bytes = FB.Bytes; | |||
409 | const size_t Size = Bytes.size(); | |||
410 | HexPrintStyle HPS = FB.Upper ? HexPrintStyle::Upper : HexPrintStyle::Lower; | |||
411 | uint64_t OffsetWidth = 0; | |||
412 | if (FB.FirstByteOffset.hasValue()) { | |||
413 | // Figure out how many nibbles are needed to print the largest offset | |||
414 | // represented by this data set, so that we can align the offset field | |||
415 | // to the right width. | |||
416 | size_t Lines = Size / FB.NumPerLine; | |||
417 | uint64_t MaxOffset = *FB.FirstByteOffset + Lines * FB.NumPerLine; | |||
418 | unsigned Power = 0; | |||
419 | if (MaxOffset > 0) | |||
420 | Power = llvm::Log2_64_Ceil(MaxOffset); | |||
421 | OffsetWidth = std::max<uint64_t>(4, llvm::alignTo(Power, 4) / 4); | |||
422 | } | |||
423 | ||||
424 | // The width of a block of data including all spaces for group separators. | |||
425 | unsigned NumByteGroups = | |||
426 | alignTo(FB.NumPerLine, FB.ByteGroupSize) / FB.ByteGroupSize; | |||
427 | unsigned BlockCharWidth = FB.NumPerLine * 2 + NumByteGroups - 1; | |||
428 | ||||
429 | while (!Bytes.empty()) { | |||
430 | indent(FB.IndentLevel); | |||
431 | ||||
432 | if (FB.FirstByteOffset.hasValue()) { | |||
433 | uint64_t Offset = FB.FirstByteOffset.getValue(); | |||
434 | llvm::write_hex(*this, Offset + LineIndex, HPS, OffsetWidth); | |||
435 | *this << ": "; | |||
436 | } | |||
437 | ||||
438 | auto Line = Bytes.take_front(FB.NumPerLine); | |||
439 | ||||
440 | size_t CharsPrinted = 0; | |||
441 | // Print the hex bytes for this line in groups | |||
442 | for (size_t I = 0; I < Line.size(); ++I, CharsPrinted += 2) { | |||
443 | if (I && (I % FB.ByteGroupSize) == 0) { | |||
444 | ++CharsPrinted; | |||
445 | *this << " "; | |||
446 | } | |||
447 | llvm::write_hex(*this, Line[I], HPS, 2); | |||
448 | } | |||
449 | ||||
450 | if (FB.ASCII) { | |||
451 | // Print any spaces needed for any bytes that we didn't print on this | |||
452 | // line so that the ASCII bytes are correctly aligned. | |||
453 | assert(BlockCharWidth >= CharsPrinted)((void)0); | |||
454 | indent(BlockCharWidth - CharsPrinted + 2); | |||
455 | *this << "|"; | |||
456 | ||||
457 | // Print the ASCII char values for each byte on this line | |||
458 | for (uint8_t Byte : Line) { | |||
459 | if (isPrint(Byte)) | |||
460 | *this << static_cast<char>(Byte); | |||
461 | else | |||
462 | *this << '.'; | |||
463 | } | |||
464 | *this << '|'; | |||
465 | } | |||
466 | ||||
467 | Bytes = Bytes.drop_front(Line.size()); | |||
468 | LineIndex += Line.size(); | |||
469 | if (LineIndex < Size) | |||
470 | *this << '\n'; | |||
471 | } | |||
472 | return *this; | |||
473 | } | |||
474 | ||||
475 | template <char C> | |||
476 | static raw_ostream &write_padding(raw_ostream &OS, unsigned NumChars) { | |||
477 | static const char Chars[] = {C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, | |||
478 | C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, | |||
479 | C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, | |||
480 | C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, | |||
481 | C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C}; | |||
482 | ||||
483 | // Usually the indentation is small, handle it with a fastpath. | |||
484 | if (NumChars < array_lengthof(Chars)) | |||
485 | return OS.write(Chars, NumChars); | |||
486 | ||||
487 | while (NumChars) { | |||
488 | unsigned NumToWrite = std::min(NumChars, | |||
489 | (unsigned)array_lengthof(Chars)-1); | |||
490 | OS.write(Chars, NumToWrite); | |||
491 | NumChars -= NumToWrite; | |||
492 | } | |||
493 | return OS; | |||
494 | } | |||
495 | ||||
496 | /// indent - Insert 'NumSpaces' spaces. | |||
497 | raw_ostream &raw_ostream::indent(unsigned NumSpaces) { | |||
498 | return write_padding<' '>(*this, NumSpaces); | |||
499 | } | |||
500 | ||||
501 | /// write_zeros - Insert 'NumZeros' nulls. | |||
502 | raw_ostream &raw_ostream::write_zeros(unsigned NumZeros) { | |||
503 | return write_padding<'\0'>(*this, NumZeros); | |||
504 | } | |||
505 | ||||
506 | bool raw_ostream::prepare_colors() { | |||
507 | // Colors were explicitly disabled. | |||
508 | if (!ColorEnabled) | |||
509 | return false; | |||
510 | ||||
511 | // Colors require changing the terminal but this stream is not going to a | |||
512 | // terminal. | |||
513 | if (sys::Process::ColorNeedsFlush() && !is_displayed()) | |||
514 | return false; | |||
515 | ||||
516 | if (sys::Process::ColorNeedsFlush()) | |||
517 | flush(); | |||
518 | ||||
519 | return true; | |||
520 | } | |||
521 | ||||
522 | raw_ostream &raw_ostream::changeColor(enum Colors colors, bool bold, bool bg) { | |||
523 | if (!prepare_colors()) | |||
524 | return *this; | |||
525 | ||||
526 | const char *colorcode = | |||
527 | (colors == SAVEDCOLOR) | |||
528 | ? sys::Process::OutputBold(bg) | |||
529 | : sys::Process::OutputColor(static_cast<char>(colors), bold, bg); | |||
530 | if (colorcode) | |||
531 | write(colorcode, strlen(colorcode)); | |||
532 | return *this; | |||
533 | } | |||
534 | ||||
535 | raw_ostream &raw_ostream::resetColor() { | |||
536 | if (!prepare_colors()) | |||
537 | return *this; | |||
538 | ||||
539 | if (const char *colorcode = sys::Process::ResetColor()) | |||
540 | write(colorcode, strlen(colorcode)); | |||
541 | return *this; | |||
542 | } | |||
543 | ||||
544 | raw_ostream &raw_ostream::reverseColor() { | |||
545 | if (!prepare_colors()) | |||
546 | return *this; | |||
547 | ||||
548 | if (const char *colorcode = sys::Process::OutputReverse()) | |||
549 | write(colorcode, strlen(colorcode)); | |||
550 | return *this; | |||
551 | } | |||
552 | ||||
553 | void raw_ostream::anchor() {} | |||
554 | ||||
555 | //===----------------------------------------------------------------------===// | |||
556 | // Formatted Output | |||
557 | //===----------------------------------------------------------------------===// | |||
558 | ||||
559 | // Out of line virtual method. | |||
560 | void format_object_base::home() { | |||
561 | } | |||
562 | ||||
563 | //===----------------------------------------------------------------------===// | |||
564 | // raw_fd_ostream | |||
565 | //===----------------------------------------------------------------------===// | |||
566 | ||||
567 | static int getFD(StringRef Filename, std::error_code &EC, | |||
568 | sys::fs::CreationDisposition Disp, sys::fs::FileAccess Access, | |||
569 | sys::fs::OpenFlags Flags) { | |||
570 | assert((Access & sys::fs::FA_Write) &&((void)0) | |||
571 | "Cannot make a raw_ostream from a read-only descriptor!")((void)0); | |||
572 | ||||
573 | // Handle "-" as stdout. Note that when we do this, we consider ourself | |||
574 | // the owner of stdout and may set the "binary" flag globally based on Flags. | |||
575 | if (Filename == "-") { | |||
576 | EC = std::error_code(); | |||
577 | // Change stdout's text/binary mode based on the Flags. | |||
578 | sys::ChangeStdoutMode(Flags); | |||
579 | return STDOUT_FILENO1; | |||
580 | } | |||
581 | ||||
582 | int FD; | |||
583 | if (Access & sys::fs::FA_Read) | |||
584 | EC = sys::fs::openFileForReadWrite(Filename, FD, Disp, Flags); | |||
585 | else | |||
586 | EC = sys::fs::openFileForWrite(Filename, FD, Disp, Flags); | |||
587 | if (EC) | |||
588 | return -1; | |||
589 | ||||
590 | return FD; | |||
591 | } | |||
592 | ||||
593 | raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC) | |||
594 | : raw_fd_ostream(Filename, EC, sys::fs::CD_CreateAlways, sys::fs::FA_Write, | |||
595 | sys::fs::OF_None) {} | |||
596 | ||||
597 | raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC, | |||
598 | sys::fs::CreationDisposition Disp) | |||
599 | : raw_fd_ostream(Filename, EC, Disp, sys::fs::FA_Write, sys::fs::OF_None) {} | |||
600 | ||||
601 | raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC, | |||
602 | sys::fs::FileAccess Access) | |||
603 | : raw_fd_ostream(Filename, EC, sys::fs::CD_CreateAlways, Access, | |||
604 | sys::fs::OF_None) {} | |||
605 | ||||
606 | raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC, | |||
607 | sys::fs::OpenFlags Flags) | |||
608 | : raw_fd_ostream(Filename, EC, sys::fs::CD_CreateAlways, sys::fs::FA_Write, | |||
609 | Flags) {} | |||
610 | ||||
611 | raw_fd_ostream::raw_fd_ostream(StringRef Filename, std::error_code &EC, | |||
612 | sys::fs::CreationDisposition Disp, | |||
613 | sys::fs::FileAccess Access, | |||
614 | sys::fs::OpenFlags Flags) | |||
615 | : raw_fd_ostream(getFD(Filename, EC, Disp, Access, Flags), true) {} | |||
616 | ||||
617 | /// FD is the file descriptor that this writes to. If ShouldClose is true, this | |||
618 | /// closes the file when the stream is destroyed. | |||
619 | raw_fd_ostream::raw_fd_ostream(int fd, bool shouldClose, bool unbuffered, | |||
620 | OStreamKind K) | |||
621 | : raw_pwrite_stream(unbuffered, K), FD(fd), ShouldClose(shouldClose) { | |||
622 | if (FD < 0 ) { | |||
623 | ShouldClose = false; | |||
624 | return; | |||
625 | } | |||
626 | ||||
627 | enable_colors(true); | |||
628 | ||||
629 | // Do not attempt to close stdout or stderr. We used to try to maintain the | |||
630 | // property that tools that support writing file to stdout should not also | |||
631 | // write informational output to stdout, but in practice we were never able to | |||
632 | // maintain this invariant. Many features have been added to LLVM and clang | |||
633 | // (-fdump-record-layouts, optimization remarks, etc) that print to stdout, so | |||
634 | // users must simply be aware that mixed output and remarks is a possibility. | |||
635 | if (FD <= STDERR_FILENO2) | |||
636 | ShouldClose = false; | |||
637 | ||||
638 | #ifdef _WIN32 | |||
639 | // Check if this is a console device. This is not equivalent to isatty. | |||
640 | IsWindowsConsole = | |||
641 | ::GetFileType((HANDLE)::_get_osfhandle(fd)) == FILE_TYPE_CHAR; | |||
642 | #endif | |||
643 | ||||
644 | // Get the starting position. | |||
645 | off_t loc = ::lseek(FD, 0, SEEK_CUR1); | |||
646 | #ifdef _WIN32 | |||
647 | // MSVCRT's _lseek(SEEK_CUR) doesn't return -1 for pipes. | |||
648 | sys::fs::file_status Status; | |||
649 | std::error_code EC = status(FD, Status); | |||
650 | SupportsSeeking = !EC && Status.type() == sys::fs::file_type::regular_file; | |||
651 | #else | |||
652 | SupportsSeeking = loc != (off_t)-1; | |||
653 | #endif | |||
654 | if (!SupportsSeeking) | |||
655 | pos = 0; | |||
656 | else | |||
657 | pos = static_cast<uint64_t>(loc); | |||
658 | } | |||
659 | ||||
660 | raw_fd_ostream::~raw_fd_ostream() { | |||
661 | if (FD >= 0) { | |||
662 | flush(); | |||
663 | if (ShouldClose) { | |||
664 | if (auto EC = sys::Process::SafelyCloseFileDescriptor(FD)) | |||
665 | error_detected(EC); | |||
666 | } | |||
667 | } | |||
668 | ||||
669 | #ifdef __MINGW32__ | |||
670 | // On mingw, global dtors should not call exit(). | |||
671 | // report_fatal_error() invokes exit(). We know report_fatal_error() | |||
672 | // might not write messages to stderr when any errors were detected | |||
673 | // on FD == 2. | |||
674 | if (FD == 2) return; | |||
675 | #endif | |||
676 | ||||
677 | // If there are any pending errors, report them now. Clients wishing | |||
678 | // to avoid report_fatal_error calls should check for errors with | |||
679 | // has_error() and clear the error flag with clear_error() before | |||
680 | // destructing raw_ostream objects which may have errors. | |||
681 | if (has_error()) | |||
682 | report_fatal_error("IO failure on output stream: " + error().message(), | |||
683 | /*gen_crash_diag=*/false); | |||
684 | } | |||
685 | ||||
686 | #if defined(_WIN32) | |||
687 | // The most reliable way to print unicode in a Windows console is with | |||
688 | // WriteConsoleW. To use that, first transcode from UTF-8 to UTF-16. This | |||
689 | // assumes that LLVM programs always print valid UTF-8 to the console. The data | |||
690 | // might not be UTF-8 for two major reasons: | |||
691 | // 1. The program is printing binary (-filetype=obj -o -), in which case it | |||
692 | // would have been gibberish anyway. | |||
693 | // 2. The program is printing text in a semi-ascii compatible codepage like | |||
694 | // shift-jis or cp1252. | |||
695 | // | |||
696 | // Most LLVM programs don't produce non-ascii text unless they are quoting | |||
697 | // user source input. A well-behaved LLVM program should either validate that | |||
698 | // the input is UTF-8 or transcode from the local codepage to UTF-8 before | |||
699 | // quoting it. If they don't, this may mess up the encoding, but this is still | |||
700 | // probably the best compromise we can make. | |||
701 | static bool write_console_impl(int FD, StringRef Data) { | |||
702 | SmallVector<wchar_t, 256> WideText; | |||
703 | ||||
704 | // Fall back to ::write if it wasn't valid UTF-8. | |||
705 | if (auto EC = sys::windows::UTF8ToUTF16(Data, WideText)) | |||
706 | return false; | |||
707 | ||||
708 | // On Windows 7 and earlier, WriteConsoleW has a low maximum amount of data | |||
709 | // that can be written to the console at a time. | |||
710 | size_t MaxWriteSize = WideText.size(); | |||
711 | if (!RunningWindows8OrGreater()) | |||
712 | MaxWriteSize = 32767; | |||
713 | ||||
714 | size_t WCharsWritten = 0; | |||
715 | do { | |||
716 | size_t WCharsToWrite = | |||
717 | std::min(MaxWriteSize, WideText.size() - WCharsWritten); | |||
718 | DWORD ActuallyWritten; | |||
719 | bool Success = | |||
720 | ::WriteConsoleW((HANDLE)::_get_osfhandle(FD), &WideText[WCharsWritten], | |||
721 | WCharsToWrite, &ActuallyWritten, | |||
722 | /*Reserved=*/nullptr); | |||
723 | ||||
724 | // The most likely reason for WriteConsoleW to fail is that FD no longer | |||
725 | // points to a console. Fall back to ::write. If this isn't the first loop | |||
726 | // iteration, something is truly wrong. | |||
727 | if (!Success) | |||
728 | return false; | |||
729 | ||||
730 | WCharsWritten += ActuallyWritten; | |||
731 | } while (WCharsWritten != WideText.size()); | |||
732 | return true; | |||
733 | } | |||
734 | #endif | |||
735 | ||||
736 | void raw_fd_ostream::write_impl(const char *Ptr, size_t Size) { | |||
737 | assert(FD >= 0 && "File already closed.")((void)0); | |||
738 | pos += Size; | |||
739 | ||||
740 | #if defined(_WIN32) | |||
741 | // If this is a Windows console device, try re-encoding from UTF-8 to UTF-16 | |||
742 | // and using WriteConsoleW. If that fails, fall back to plain write(). | |||
743 | if (IsWindowsConsole) | |||
744 | if (write_console_impl(FD, StringRef(Ptr, Size))) | |||
745 | return; | |||
746 | #endif | |||
747 | ||||
748 | // The maximum write size is limited to INT32_MAX. A write | |||
749 | // greater than SSIZE_MAX is implementation-defined in POSIX, | |||
750 | // and Windows _write requires 32 bit input. | |||
751 | size_t MaxWriteSize = INT32_MAX0x7fffffff; | |||
752 | ||||
753 | #if defined(__linux__) | |||
754 | // It is observed that Linux returns EINVAL for a very large write (>2G). | |||
755 | // Make it a reasonably small value. | |||
756 | MaxWriteSize = 1024 * 1024 * 1024; | |||
757 | #endif | |||
758 | ||||
759 | do { | |||
760 | size_t ChunkSize = std::min(Size, MaxWriteSize); | |||
761 | ssize_t ret = ::write(FD, Ptr, ChunkSize); | |||
762 | ||||
763 | if (ret < 0) { | |||
764 | // If it's a recoverable error, swallow it and retry the write. | |||
765 | // | |||
766 | // Ideally we wouldn't ever see EAGAIN or EWOULDBLOCK here, since | |||
767 | // raw_ostream isn't designed to do non-blocking I/O. However, some | |||
768 | // programs, such as old versions of bjam, have mistakenly used | |||
769 | // O_NONBLOCK. For compatibility, emulate blocking semantics by | |||
770 | // spinning until the write succeeds. If you don't want spinning, | |||
771 | // don't use O_NONBLOCK file descriptors with raw_ostream. | |||
772 | if (errno(*__errno()) == EINTR4 || errno(*__errno()) == EAGAIN35 | |||
773 | #ifdef EWOULDBLOCK35 | |||
774 | || errno(*__errno()) == EWOULDBLOCK35 | |||
775 | #endif | |||
776 | ) | |||
777 | continue; | |||
778 | ||||
779 | // Otherwise it's a non-recoverable error. Note it and quit. | |||
780 | error_detected(std::error_code(errno(*__errno()), std::generic_category())); | |||
781 | break; | |||
782 | } | |||
783 | ||||
784 | // The write may have written some or all of the data. Update the | |||
785 | // size and buffer pointer to reflect the remainder that needs | |||
786 | // to be written. If there are no bytes left, we're done. | |||
787 | Ptr += ret; | |||
788 | Size -= ret; | |||
789 | } while (Size > 0); | |||
790 | } | |||
791 | ||||
792 | void raw_fd_ostream::close() { | |||
793 | assert(ShouldClose)((void)0); | |||
794 | ShouldClose = false; | |||
795 | flush(); | |||
796 | if (auto EC = sys::Process::SafelyCloseFileDescriptor(FD)) | |||
797 | error_detected(EC); | |||
798 | FD = -1; | |||
799 | } | |||
800 | ||||
801 | uint64_t raw_fd_ostream::seek(uint64_t off) { | |||
802 | assert(SupportsSeeking && "Stream does not support seeking!")((void)0); | |||
803 | flush(); | |||
804 | #ifdef _WIN32 | |||
805 | pos = ::_lseeki64(FD, off, SEEK_SET0); | |||
806 | #elif defined(HAVE_LSEEK64) | |||
807 | pos = ::lseek64(FD, off, SEEK_SET0); | |||
808 | #else | |||
809 | pos = ::lseek(FD, off, SEEK_SET0); | |||
810 | #endif | |||
811 | if (pos == (uint64_t)-1) | |||
812 | error_detected(std::error_code(errno(*__errno()), std::generic_category())); | |||
813 | return pos; | |||
814 | } | |||
815 | ||||
816 | void raw_fd_ostream::pwrite_impl(const char *Ptr, size_t Size, | |||
817 | uint64_t Offset) { | |||
818 | uint64_t Pos = tell(); | |||
819 | seek(Offset); | |||
820 | write(Ptr, Size); | |||
821 | seek(Pos); | |||
822 | } | |||
823 | ||||
824 | size_t raw_fd_ostream::preferred_buffer_size() const { | |||
825 | #if defined(_WIN32) | |||
826 | // Disable buffering for console devices. Console output is re-encoded from | |||
827 | // UTF-8 to UTF-16 on Windows, and buffering it would require us to split the | |||
828 | // buffer on a valid UTF-8 codepoint boundary. Terminal buffering is disabled | |||
829 | // below on most other OSs, so do the same thing on Windows and avoid that | |||
830 | // complexity. | |||
831 | if (IsWindowsConsole) | |||
832 | return 0; | |||
833 | return raw_ostream::preferred_buffer_size(); | |||
834 | #elif !defined(__minix) | |||
835 | // Minix has no st_blksize. | |||
836 | assert(FD >= 0 && "File not yet open!")((void)0); | |||
837 | struct stat statbuf; | |||
838 | if (fstat(FD, &statbuf) != 0) | |||
839 | return 0; | |||
840 | ||||
841 | // If this is a terminal, don't use buffering. Line buffering | |||
842 | // would be a more traditional thing to do, but it's not worth | |||
843 | // the complexity. | |||
844 | if (S_ISCHR(statbuf.st_mode)((statbuf.st_mode & 0170000) == 0020000) && is_displayed()) | |||
845 | return 0; | |||
846 | // Return the preferred block size. | |||
847 | return statbuf.st_blksize; | |||
848 | #else | |||
849 | return raw_ostream::preferred_buffer_size(); | |||
850 | #endif | |||
851 | } | |||
852 | ||||
853 | bool raw_fd_ostream::is_displayed() const { | |||
854 | return sys::Process::FileDescriptorIsDisplayed(FD); | |||
855 | } | |||
856 | ||||
857 | bool raw_fd_ostream::has_colors() const { | |||
858 | if (!HasColors) | |||
859 | HasColors = sys::Process::FileDescriptorHasColors(FD); | |||
860 | return *HasColors; | |||
861 | } | |||
862 | ||||
863 | Expected<sys::fs::FileLocker> raw_fd_ostream::lock() { | |||
864 | std::error_code EC = sys::fs::lockFile(FD); | |||
865 | if (!EC) | |||
866 | return sys::fs::FileLocker(FD); | |||
867 | return errorCodeToError(EC); | |||
868 | } | |||
869 | ||||
870 | Expected<sys::fs::FileLocker> | |||
871 | raw_fd_ostream::tryLockFor(std::chrono::milliseconds Timeout) { | |||
872 | std::error_code EC = sys::fs::tryLockFile(FD, Timeout); | |||
873 | if (!EC) | |||
874 | return sys::fs::FileLocker(FD); | |||
875 | return errorCodeToError(EC); | |||
876 | } | |||
877 | ||||
878 | void raw_fd_ostream::anchor() {} | |||
879 | ||||
880 | //===----------------------------------------------------------------------===// | |||
881 | // outs(), errs(), nulls() | |||
882 | //===----------------------------------------------------------------------===// | |||
883 | ||||
884 | raw_fd_ostream &llvm::outs() { | |||
885 | // Set buffer settings to model stdout behavior. | |||
886 | std::error_code EC; | |||
887 | static raw_fd_ostream S("-", EC, sys::fs::OF_None); | |||
888 | assert(!EC)((void)0); | |||
889 | return S; | |||
890 | } | |||
891 | ||||
892 | raw_fd_ostream &llvm::errs() { | |||
893 | // Set standard error to be unbuffered and tied to outs() by default. | |||
894 | static raw_fd_ostream S(STDERR_FILENO2, false, true); | |||
895 | return S; | |||
896 | } | |||
897 | ||||
898 | /// nulls() - This returns a reference to a raw_ostream which discards output. | |||
899 | raw_ostream &llvm::nulls() { | |||
900 | static raw_null_ostream S; | |||
901 | return S; | |||
902 | } | |||
903 | ||||
904 | //===----------------------------------------------------------------------===// | |||
905 | // File Streams | |||
906 | //===----------------------------------------------------------------------===// | |||
907 | ||||
908 | raw_fd_stream::raw_fd_stream(StringRef Filename, std::error_code &EC) | |||
909 | : raw_fd_ostream(getFD(Filename, EC, sys::fs::CD_CreateAlways, | |||
910 | sys::fs::FA_Write | sys::fs::FA_Read, | |||
911 | sys::fs::OF_None), | |||
912 | true, false, OStreamKind::OK_FDStream) { | |||
913 | if (EC) | |||
914 | return; | |||
915 | ||||
916 | // Do not support non-seekable files. | |||
917 | if (!supportsSeeking()) | |||
918 | EC = std::make_error_code(std::errc::invalid_argument); | |||
919 | } | |||
920 | ||||
921 | ssize_t raw_fd_stream::read(char *Ptr, size_t Size) { | |||
922 | assert(get_fd() >= 0 && "File already closed.")((void)0); | |||
923 | ssize_t Ret = ::read(get_fd(), (void *)Ptr, Size); | |||
924 | if (Ret >= 0) | |||
925 | inc_pos(Ret); | |||
926 | else | |||
927 | error_detected(std::error_code(errno(*__errno()), std::generic_category())); | |||
928 | return Ret; | |||
929 | } | |||
930 | ||||
931 | bool raw_fd_stream::classof(const raw_ostream *OS) { | |||
932 | return OS->get_kind() == OStreamKind::OK_FDStream; | |||
933 | } | |||
934 | ||||
935 | //===----------------------------------------------------------------------===// | |||
936 | // raw_string_ostream | |||
937 | //===----------------------------------------------------------------------===// | |||
938 | ||||
939 | raw_string_ostream::~raw_string_ostream() { | |||
940 | flush(); | |||
941 | } | |||
942 | ||||
943 | void raw_string_ostream::write_impl(const char *Ptr, size_t Size) { | |||
944 | OS.append(Ptr, Size); | |||
945 | } | |||
946 | ||||
947 | //===----------------------------------------------------------------------===// | |||
948 | // raw_svector_ostream | |||
949 | //===----------------------------------------------------------------------===// | |||
950 | ||||
951 | uint64_t raw_svector_ostream::current_pos() const { return OS.size(); } | |||
952 | ||||
953 | void raw_svector_ostream::write_impl(const char *Ptr, size_t Size) { | |||
954 | OS.append(Ptr, Ptr + Size); | |||
955 | } | |||
956 | ||||
957 | void raw_svector_ostream::pwrite_impl(const char *Ptr, size_t Size, | |||
958 | uint64_t Offset) { | |||
959 | memcpy(OS.data() + Offset, Ptr, Size); | |||
960 | } | |||
961 | ||||
962 | //===----------------------------------------------------------------------===// | |||
963 | // raw_null_ostream | |||
964 | //===----------------------------------------------------------------------===// | |||
965 | ||||
966 | raw_null_ostream::~raw_null_ostream() { | |||
967 | #ifndef NDEBUG1 | |||
968 | // ~raw_ostream asserts that the buffer is empty. This isn't necessary | |||
969 | // with raw_null_ostream, but it's better to have raw_null_ostream follow | |||
970 | // the rules than to change the rules just for raw_null_ostream. | |||
971 | flush(); | |||
972 | #endif | |||
973 | } | |||
974 | ||||
975 | void raw_null_ostream::write_impl(const char *Ptr, size_t Size) { | |||
976 | } | |||
977 | ||||
978 | uint64_t raw_null_ostream::current_pos() const { | |||
979 | return 0; | |||
980 | } | |||
981 | ||||
982 | void raw_null_ostream::pwrite_impl(const char *Ptr, size_t Size, | |||
983 | uint64_t Offset) {} | |||
984 | ||||
985 | void raw_pwrite_stream::anchor() {} | |||
986 | ||||
987 | void buffer_ostream::anchor() {} | |||
988 | ||||
989 | void buffer_unique_ostream::anchor() {} | |||
990 | ||||
991 | Error llvm::writeToOutput(StringRef OutputFileName, | |||
992 | std::function<Error(raw_ostream &)> Write) { | |||
993 | if (OutputFileName == "-") | |||
994 | return Write(outs()); | |||
995 | ||||
996 | if (OutputFileName == "/dev/null") { | |||
997 | raw_null_ostream Out; | |||
998 | return Write(Out); | |||
999 | } | |||
1000 | ||||
1001 | unsigned Mode = sys::fs::all_read | sys::fs::all_write | sys::fs::all_exe; | |||
1002 | Expected<sys::fs::TempFile> Temp = | |||
1003 | sys::fs::TempFile::create(OutputFileName + ".temp-stream-%%%%%%", Mode); | |||
1004 | if (!Temp) | |||
1005 | return createFileError(OutputFileName, Temp.takeError()); | |||
1006 | ||||
1007 | raw_fd_ostream Out(Temp->FD, false); | |||
1008 | ||||
1009 | if (Error E = Write(Out)) { | |||
1010 | if (Error DiscardError = Temp->discard()) | |||
1011 | return joinErrors(std::move(E), std::move(DiscardError)); | |||
1012 | return E; | |||
1013 | } | |||
1014 | Out.flush(); | |||
1015 | ||||
1016 | return Temp->keep(OutputFileName); | |||
1017 | } |
1 | //===- Format.h - Efficient printf-style formatting for streams -*- C++ -*-===// |
2 | // |
3 | // 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 |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // This file implements the format() function, which can be used with other |
10 | // LLVM subsystems to provide printf-style formatting. This gives all the power |
11 | // and risk of printf. This can be used like this (with raw_ostreams as an |
12 | // example): |
13 | // |
14 | // OS << "mynumber: " << format("%4.5f", 1234.412) << '\n'; |
15 | // |
16 | // Or if you prefer: |
17 | // |
18 | // OS << format("mynumber: %4.5f\n", 1234.412); |
19 | // |
20 | //===----------------------------------------------------------------------===// |
21 | |
22 | #ifndef LLVM_SUPPORT_FORMAT_H |
23 | #define LLVM_SUPPORT_FORMAT_H |
24 | |
25 | #include "llvm/ADT/ArrayRef.h" |
26 | #include "llvm/ADT/STLExtras.h" |
27 | #include "llvm/ADT/StringRef.h" |
28 | #include "llvm/Support/DataTypes.h" |
29 | #include <cassert> |
30 | #include <cstdio> |
31 | #include <tuple> |
32 | #include <utility> |
33 | |
34 | namespace llvm { |
35 | |
36 | /// This is a helper class used for handling formatted output. It is the |
37 | /// abstract base class of a templated derived class. |
38 | class format_object_base { |
39 | protected: |
40 | const char *Fmt; |
41 | ~format_object_base() = default; // Disallow polymorphic deletion. |
42 | format_object_base(const format_object_base &) = default; |
43 | virtual void home(); // Out of line virtual method. |
44 | |
45 | /// Call snprintf() for this object, on the given buffer and size. |
46 | virtual int snprint(char *Buffer, unsigned BufferSize) const = 0; |
47 | |
48 | public: |
49 | format_object_base(const char *fmt) : Fmt(fmt) {} |
50 | |
51 | /// Format the object into the specified buffer. On success, this returns |
52 | /// the length of the formatted string. If the buffer is too small, this |
53 | /// returns a length to retry with, which will be larger than BufferSize. |
54 | unsigned print(char *Buffer, unsigned BufferSize) const { |
55 | assert(BufferSize && "Invalid buffer size!")((void)0); |
56 | |
57 | // Print the string, leaving room for the terminating null. |
58 | int N = snprint(Buffer, BufferSize); |
59 | |
60 | // VC++ and old GlibC return negative on overflow, just double the size. |
61 | if (N < 0) |
62 | return BufferSize * 2; |
63 | |
64 | // Other implementations yield number of bytes needed, not including the |
65 | // final '\0'. |
66 | if (unsigned(N) >= BufferSize) |
67 | return N + 1; |
68 | |
69 | // Otherwise N is the length of output (not including the final '\0'). |
70 | return N; |
71 | } |
72 | }; |
73 | |
74 | /// These are templated helper classes used by the format function that |
75 | /// capture the object to be formatted and the format string. When actually |
76 | /// printed, this synthesizes the string into a temporary buffer provided and |
77 | /// returns whether or not it is big enough. |
78 | |
79 | // Helper to validate that format() parameters are scalars or pointers. |
80 | template <typename... Args> struct validate_format_parameters; |
81 | template <typename Arg, typename... Args> |
82 | struct validate_format_parameters<Arg, Args...> { |
83 | static_assert(std::is_scalar<Arg>::value, |
84 | "format can't be used with non fundamental / non pointer type"); |
85 | validate_format_parameters() { validate_format_parameters<Args...>(); } |
86 | }; |
87 | template <> struct validate_format_parameters<> {}; |
88 | |
89 | template <typename... Ts> |
90 | class format_object final : public format_object_base { |
91 | std::tuple<Ts...> Vals; |
92 | |
93 | template <std::size_t... Is> |
94 | int snprint_tuple(char *Buffer, unsigned BufferSize, |
95 | std::index_sequence<Is...>) const { |
96 | #ifdef _MSC_VER |
97 | return _snprintf(Buffer, BufferSize, Fmt, std::get<Is>(Vals)...); |
98 | #else |
99 | return snprintf(Buffer, BufferSize, Fmt, std::get<Is>(Vals)...); |
100 | #endif |
101 | } |
102 | |
103 | public: |
104 | format_object(const char *fmt, const Ts &... vals) |
105 | : format_object_base(fmt), Vals(vals...) { |
106 | validate_format_parameters<Ts...>(); |
107 | } |
108 | |
109 | int snprint(char *Buffer, unsigned BufferSize) const override { |
110 | return snprint_tuple(Buffer, BufferSize, std::index_sequence_for<Ts...>()); |
111 | } |
112 | }; |
113 | |
114 | /// These are helper functions used to produce formatted output. They use |
115 | /// template type deduction to construct the appropriate instance of the |
116 | /// format_object class to simplify their construction. |
117 | /// |
118 | /// This is typically used like: |
119 | /// \code |
120 | /// OS << format("%0.4f", myfloat) << '\n'; |
121 | /// \endcode |
122 | |
123 | template <typename... Ts> |
124 | inline format_object<Ts...> format(const char *Fmt, const Ts &... Vals) { |
125 | return format_object<Ts...>(Fmt, Vals...); |
126 | } |
127 | |
128 | /// This is a helper class for left_justify, right_justify, and center_justify. |
129 | class FormattedString { |
130 | public: |
131 | enum Justification { JustifyNone, JustifyLeft, JustifyRight, JustifyCenter }; |
132 | FormattedString(StringRef S, unsigned W, Justification J) |
133 | : Str(S), Width(W), Justify(J) {} |
134 | |
135 | private: |
136 | StringRef Str; |
137 | unsigned Width; |
138 | Justification Justify; |
139 | friend class raw_ostream; |
140 | }; |
141 | |
142 | /// left_justify - append spaces after string so total output is |
143 | /// \p Width characters. If \p Str is larger that \p Width, full string |
144 | /// is written with no padding. |
145 | inline FormattedString left_justify(StringRef Str, unsigned Width) { |
146 | return FormattedString(Str, Width, FormattedString::JustifyLeft); |
147 | } |
148 | |
149 | /// right_justify - add spaces before string so total output is |
150 | /// \p Width characters. If \p Str is larger that \p Width, full string |
151 | /// is written with no padding. |
152 | inline FormattedString right_justify(StringRef Str, unsigned Width) { |
153 | return FormattedString(Str, Width, FormattedString::JustifyRight); |
154 | } |
155 | |
156 | /// center_justify - add spaces before and after string so total output is |
157 | /// \p Width characters. If \p Str is larger that \p Width, full string |
158 | /// is written with no padding. |
159 | inline FormattedString center_justify(StringRef Str, unsigned Width) { |
160 | return FormattedString(Str, Width, FormattedString::JustifyCenter); |
161 | } |
162 | |
163 | /// This is a helper class used for format_hex() and format_decimal(). |
164 | class FormattedNumber { |
165 | uint64_t HexValue; |
166 | int64_t DecValue; |
167 | unsigned Width; |
168 | bool Hex; |
169 | bool Upper; |
170 | bool HexPrefix; |
171 | friend class raw_ostream; |
172 | |
173 | public: |
174 | FormattedNumber(uint64_t HV, int64_t DV, unsigned W, bool H, bool U, |
175 | bool Prefix) |
176 | : HexValue(HV), DecValue(DV), Width(W), Hex(H), Upper(U), |
177 | HexPrefix(Prefix) {} |
178 | }; |
179 | |
180 | /// format_hex - Output \p N as a fixed width hexadecimal. If number will not |
181 | /// fit in width, full number is still printed. Examples: |
182 | /// OS << format_hex(255, 4) => 0xff |
183 | /// OS << format_hex(255, 4, true) => 0xFF |
184 | /// OS << format_hex(255, 6) => 0x00ff |
185 | /// OS << format_hex(255, 2) => 0xff |
186 | inline FormattedNumber format_hex(uint64_t N, unsigned Width, |
187 | bool Upper = false) { |
188 | assert(Width <= 18 && "hex width must be <= 18")((void)0); |
189 | return FormattedNumber(N, 0, Width, true, Upper, true); |
190 | } |
191 | |
192 | /// format_hex_no_prefix - Output \p N as a fixed width hexadecimal. Does not |
193 | /// prepend '0x' to the outputted string. If number will not fit in width, |
194 | /// full number is still printed. Examples: |
195 | /// OS << format_hex_no_prefix(255, 2) => ff |
196 | /// OS << format_hex_no_prefix(255, 2, true) => FF |
197 | /// OS << format_hex_no_prefix(255, 4) => 00ff |
198 | /// OS << format_hex_no_prefix(255, 1) => ff |
199 | inline FormattedNumber format_hex_no_prefix(uint64_t N, unsigned Width, |
200 | bool Upper = false) { |
201 | assert(Width <= 16 && "hex width must be <= 16")((void)0); |
202 | return FormattedNumber(N, 0, Width, true, Upper, false); |
203 | } |
204 | |
205 | /// format_decimal - Output \p N as a right justified, fixed-width decimal. If |
206 | /// number will not fit in width, full number is still printed. Examples: |
207 | /// OS << format_decimal(0, 5) => " 0" |
208 | /// OS << format_decimal(255, 5) => " 255" |
209 | /// OS << format_decimal(-1, 3) => " -1" |
210 | /// OS << format_decimal(12345, 3) => "12345" |
211 | inline FormattedNumber format_decimal(int64_t N, unsigned Width) { |
212 | return FormattedNumber(0, N, Width, false, false, false); |
213 | } |
214 | |
215 | class FormattedBytes { |
216 | ArrayRef<uint8_t> Bytes; |
217 | |
218 | // If not None, display offsets for each line relative to starting value. |
219 | Optional<uint64_t> FirstByteOffset; |
220 | uint32_t IndentLevel; // Number of characters to indent each line. |
221 | uint32_t NumPerLine; // Number of bytes to show per line. |
222 | uint8_t ByteGroupSize; // How many hex bytes are grouped without spaces |
223 | bool Upper; // Show offset and hex bytes as upper case. |
224 | bool ASCII; // Show the ASCII bytes for the hex bytes to the right. |
225 | friend class raw_ostream; |
226 | |
227 | public: |
228 | FormattedBytes(ArrayRef<uint8_t> B, uint32_t IL, Optional<uint64_t> O, |
229 | uint32_t NPL, uint8_t BGS, bool U, bool A) |
230 | : Bytes(B), FirstByteOffset(O), IndentLevel(IL), NumPerLine(NPL), |
231 | ByteGroupSize(BGS), Upper(U), ASCII(A) { |
232 | |
233 | if (ByteGroupSize > NumPerLine) |
234 | ByteGroupSize = NumPerLine; |
235 | } |
236 | }; |
237 | |
238 | inline FormattedBytes |
239 | format_bytes(ArrayRef<uint8_t> Bytes, Optional<uint64_t> FirstByteOffset = None, |
240 | uint32_t NumPerLine = 16, uint8_t ByteGroupSize = 4, |
241 | uint32_t IndentLevel = 0, bool Upper = false) { |
242 | return FormattedBytes(Bytes, IndentLevel, FirstByteOffset, NumPerLine, |
243 | ByteGroupSize, Upper, false); |
244 | } |
245 | |
246 | inline FormattedBytes |
247 | format_bytes_with_ascii(ArrayRef<uint8_t> Bytes, |
248 | Optional<uint64_t> FirstByteOffset = None, |
249 | uint32_t NumPerLine = 16, uint8_t ByteGroupSize = 4, |
250 | uint32_t IndentLevel = 0, bool Upper = false) { |
251 | return FormattedBytes(Bytes, IndentLevel, FirstByteOffset, NumPerLine, |
252 | ByteGroupSize, Upper, true); |
253 | } |
254 | |
255 | } // end namespace llvm |
256 | |
257 | #endif |
1 | //===--- raw_ostream.h - Raw output stream ----------------------*- C++ -*-===// |
2 | // |
3 | // 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 |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // This file defines the raw_ostream class. |
10 | // |
11 | //===----------------------------------------------------------------------===// |
12 | |
13 | #ifndef LLVM_SUPPORT_RAW_OSTREAM_H |
14 | #define LLVM_SUPPORT_RAW_OSTREAM_H |
15 | |
16 | #include "llvm/ADT/SmallVector.h" |
17 | #include "llvm/ADT/StringRef.h" |
18 | #include "llvm/Support/DataTypes.h" |
19 | #include <cassert> |
20 | #include <chrono> |
21 | #include <cstddef> |
22 | #include <cstdint> |
23 | #include <cstring> |
24 | #include <string> |
25 | #if __cplusplus201402L > 201402L |
26 | #include <string_view> |
27 | #endif |
28 | #include <system_error> |
29 | #include <type_traits> |
30 | |
31 | namespace llvm { |
32 | |
33 | class formatv_object_base; |
34 | class format_object_base; |
35 | class FormattedString; |
36 | class FormattedNumber; |
37 | class FormattedBytes; |
38 | template <class T> class LLVM_NODISCARD[[clang::warn_unused_result]] Expected; |
39 | |
40 | namespace sys { |
41 | namespace fs { |
42 | enum FileAccess : unsigned; |
43 | enum OpenFlags : unsigned; |
44 | enum CreationDisposition : unsigned; |
45 | class FileLocker; |
46 | } // end namespace fs |
47 | } // end namespace sys |
48 | |
49 | /// This class implements an extremely fast bulk output stream that can *only* |
50 | /// output to a stream. It does not support seeking, reopening, rewinding, line |
51 | /// buffered disciplines etc. It is a simple buffer that outputs |
52 | /// a chunk at a time. |
53 | class raw_ostream { |
54 | public: |
55 | // Class kinds to support LLVM-style RTTI. |
56 | enum class OStreamKind { |
57 | OK_OStream, |
58 | OK_FDStream, |
59 | }; |
60 | |
61 | private: |
62 | OStreamKind Kind; |
63 | |
64 | /// The buffer is handled in such a way that the buffer is |
65 | /// uninitialized, unbuffered, or out of space when OutBufCur >= |
66 | /// OutBufEnd. Thus a single comparison suffices to determine if we |
67 | /// need to take the slow path to write a single character. |
68 | /// |
69 | /// The buffer is in one of three states: |
70 | /// 1. Unbuffered (BufferMode == Unbuffered) |
71 | /// 1. Uninitialized (BufferMode != Unbuffered && OutBufStart == 0). |
72 | /// 2. Buffered (BufferMode != Unbuffered && OutBufStart != 0 && |
73 | /// OutBufEnd - OutBufStart >= 1). |
74 | /// |
75 | /// If buffered, then the raw_ostream owns the buffer if (BufferMode == |
76 | /// InternalBuffer); otherwise the buffer has been set via SetBuffer and is |
77 | /// managed by the subclass. |
78 | /// |
79 | /// If a subclass installs an external buffer using SetBuffer then it can wait |
80 | /// for a \see write_impl() call to handle the data which has been put into |
81 | /// this buffer. |
82 | char *OutBufStart, *OutBufEnd, *OutBufCur; |
83 | bool ColorEnabled = false; |
84 | |
85 | /// Optional stream this stream is tied to. If this stream is written to, the |
86 | /// tied-to stream will be flushed first. |
87 | raw_ostream *TiedStream = nullptr; |
88 | |
89 | enum class BufferKind { |
90 | Unbuffered = 0, |
91 | InternalBuffer, |
92 | ExternalBuffer |
93 | } BufferMode; |
94 | |
95 | public: |
96 | // color order matches ANSI escape sequence, don't change |
97 | enum class Colors { |
98 | BLACK = 0, |
99 | RED, |
100 | GREEN, |
101 | YELLOW, |
102 | BLUE, |
103 | MAGENTA, |
104 | CYAN, |
105 | WHITE, |
106 | SAVEDCOLOR, |
107 | RESET, |
108 | }; |
109 | |
110 | static constexpr Colors BLACK = Colors::BLACK; |
111 | static constexpr Colors RED = Colors::RED; |
112 | static constexpr Colors GREEN = Colors::GREEN; |
113 | static constexpr Colors YELLOW = Colors::YELLOW; |
114 | static constexpr Colors BLUE = Colors::BLUE; |
115 | static constexpr Colors MAGENTA = Colors::MAGENTA; |
116 | static constexpr Colors CYAN = Colors::CYAN; |
117 | static constexpr Colors WHITE = Colors::WHITE; |
118 | static constexpr Colors SAVEDCOLOR = Colors::SAVEDCOLOR; |
119 | static constexpr Colors RESET = Colors::RESET; |
120 | |
121 | explicit raw_ostream(bool unbuffered = false, |
122 | OStreamKind K = OStreamKind::OK_OStream) |
123 | : Kind(K), BufferMode(unbuffered ? BufferKind::Unbuffered |
124 | : BufferKind::InternalBuffer) { |
125 | // Start out ready to flush. |
126 | OutBufStart = OutBufEnd = OutBufCur = nullptr; |
127 | } |
128 | |
129 | raw_ostream(const raw_ostream &) = delete; |
130 | void operator=(const raw_ostream &) = delete; |
131 | |
132 | virtual ~raw_ostream(); |
133 | |
134 | /// tell - Return the current offset with the file. |
135 | uint64_t tell() const { return current_pos() + GetNumBytesInBuffer(); } |
136 | |
137 | OStreamKind get_kind() const { return Kind; } |
138 | |
139 | //===--------------------------------------------------------------------===// |
140 | // Configuration Interface |
141 | //===--------------------------------------------------------------------===// |
142 | |
143 | /// If possible, pre-allocate \p ExtraSize bytes for stream data. |
144 | /// i.e. it extends internal buffers to keep additional ExtraSize bytes. |
145 | /// So that the stream could keep at least tell() + ExtraSize bytes |
146 | /// without re-allocations. reserveExtraSpace() does not change |
147 | /// the size/data of the stream. |
148 | virtual void reserveExtraSpace(uint64_t ExtraSize) {} |
149 | |
150 | /// Set the stream to be buffered, with an automatically determined buffer |
151 | /// size. |
152 | void SetBuffered(); |
153 | |
154 | /// Set the stream to be buffered, using the specified buffer size. |
155 | void SetBufferSize(size_t Size) { |
156 | flush(); |
157 | SetBufferAndMode(new char[Size], Size, BufferKind::InternalBuffer); |
158 | } |
159 | |
160 | size_t GetBufferSize() const { |
161 | // If we're supposed to be buffered but haven't actually gotten around |
162 | // to allocating the buffer yet, return the value that would be used. |
163 | if (BufferMode != BufferKind::Unbuffered && OutBufStart == nullptr) |
164 | return preferred_buffer_size(); |
165 | |
166 | // Otherwise just return the size of the allocated buffer. |
167 | return OutBufEnd - OutBufStart; |
168 | } |
169 | |
170 | /// Set the stream to be unbuffered. When unbuffered, the stream will flush |
171 | /// after every write. This routine will also flush the buffer immediately |
172 | /// when the stream is being set to unbuffered. |
173 | void SetUnbuffered() { |
174 | flush(); |
175 | SetBufferAndMode(nullptr, 0, BufferKind::Unbuffered); |
176 | } |
177 | |
178 | size_t GetNumBytesInBuffer() const { |
179 | return OutBufCur - OutBufStart; |
180 | } |
181 | |
182 | //===--------------------------------------------------------------------===// |
183 | // Data Output Interface |
184 | //===--------------------------------------------------------------------===// |
185 | |
186 | void flush() { |
187 | if (OutBufCur != OutBufStart) |
188 | flush_nonempty(); |
189 | } |
190 | |
191 | raw_ostream &operator<<(char C) { |
192 | if (OutBufCur >= OutBufEnd) |
193 | return write(C); |
194 | *OutBufCur++ = C; |
195 | return *this; |
196 | } |
197 | |
198 | raw_ostream &operator<<(unsigned char C) { |
199 | if (OutBufCur >= OutBufEnd) |
200 | return write(C); |
201 | *OutBufCur++ = C; |
202 | return *this; |
203 | } |
204 | |
205 | raw_ostream &operator<<(signed char C) { |
206 | if (OutBufCur >= OutBufEnd) |
207 | return write(C); |
208 | *OutBufCur++ = C; |
209 | return *this; |
210 | } |
211 | |
212 | raw_ostream &operator<<(StringRef Str) { |
213 | // Inline fast path, particularly for strings with a known length. |
214 | size_t Size = Str.size(); |
215 | |
216 | // Make sure we can use the fast path. |
217 | if (Size > (size_t)(OutBufEnd - OutBufCur)) |
218 | return write(Str.data(), Size); |
219 | |
220 | if (Size) { |
221 | memcpy(OutBufCur, Str.data(), Size); |
222 | OutBufCur += Size; |
223 | } |
224 | return *this; |
225 | } |
226 | |
227 | raw_ostream &operator<<(const char *Str) { |
228 | // Inline fast path, particularly for constant strings where a sufficiently |
229 | // smart compiler will simplify strlen. |
230 | |
231 | return this->operator<<(StringRef(Str)); |
232 | } |
233 | |
234 | raw_ostream &operator<<(const std::string &Str) { |
235 | // Avoid the fast path, it would only increase code size for a marginal win. |
236 | return write(Str.data(), Str.length()); |
237 | } |
238 | |
239 | #if __cplusplus201402L > 201402L |
240 | raw_ostream &operator<<(const std::string_view &Str) { |
241 | return write(Str.data(), Str.length()); |
242 | } |
243 | #endif |
244 | |
245 | raw_ostream &operator<<(const SmallVectorImpl<char> &Str) { |
246 | return write(Str.data(), Str.size()); |
247 | } |
248 | |
249 | raw_ostream &operator<<(unsigned long N); |
250 | raw_ostream &operator<<(long N); |
251 | raw_ostream &operator<<(unsigned long long N); |
252 | raw_ostream &operator<<(long long N); |
253 | raw_ostream &operator<<(const void *P); |
254 | |
255 | raw_ostream &operator<<(unsigned int N) { |
256 | return this->operator<<(static_cast<unsigned long>(N)); |
257 | } |
258 | |
259 | raw_ostream &operator<<(int N) { |
260 | return this->operator<<(static_cast<long>(N)); |
261 | } |
262 | |
263 | raw_ostream &operator<<(double N); |
264 | |
265 | /// Output \p N in hexadecimal, without any prefix or padding. |
266 | raw_ostream &write_hex(unsigned long long N); |
267 | |
268 | // Change the foreground color of text. |
269 | raw_ostream &operator<<(Colors C); |
270 | |
271 | /// Output a formatted UUID with dash separators. |
272 | using uuid_t = uint8_t[16]; |
273 | raw_ostream &write_uuid(const uuid_t UUID); |
274 | |
275 | /// Output \p Str, turning '\\', '\t', '\n', '"', and anything that doesn't |
276 | /// satisfy llvm::isPrint into an escape sequence. |
277 | raw_ostream &write_escaped(StringRef Str, bool UseHexEscapes = false); |
278 | |
279 | raw_ostream &write(unsigned char C); |
280 | raw_ostream &write(const char *Ptr, size_t Size); |
281 | |
282 | // Formatted output, see the format() function in Support/Format.h. |
283 | raw_ostream &operator<<(const format_object_base &Fmt); |
284 | |
285 | // Formatted output, see the leftJustify() function in Support/Format.h. |
286 | raw_ostream &operator<<(const FormattedString &); |
287 | |
288 | // Formatted output, see the formatHex() function in Support/Format.h. |
289 | raw_ostream &operator<<(const FormattedNumber &); |
290 | |
291 | // Formatted output, see the formatv() function in Support/FormatVariadic.h. |
292 | raw_ostream &operator<<(const formatv_object_base &); |
293 | |
294 | // Formatted output, see the format_bytes() function in Support/Format.h. |
295 | raw_ostream &operator<<(const FormattedBytes &); |
296 | |
297 | /// indent - Insert 'NumSpaces' spaces. |
298 | raw_ostream &indent(unsigned NumSpaces); |
299 | |
300 | /// write_zeros - Insert 'NumZeros' nulls. |
301 | raw_ostream &write_zeros(unsigned NumZeros); |
302 | |
303 | /// Changes the foreground color of text that will be output from this point |
304 | /// forward. |
305 | /// @param Color ANSI color to use, the special SAVEDCOLOR can be used to |
306 | /// change only the bold attribute, and keep colors untouched |
307 | /// @param Bold bold/brighter text, default false |
308 | /// @param BG if true change the background, default: change foreground |
309 | /// @returns itself so it can be used within << invocations |
310 | virtual raw_ostream &changeColor(enum Colors Color, bool Bold = false, |
311 | bool BG = false); |
312 | |
313 | /// Resets the colors to terminal defaults. Call this when you are done |
314 | /// outputting colored text, or before program exit. |
315 | virtual raw_ostream &resetColor(); |
316 | |
317 | /// Reverses the foreground and background colors. |
318 | virtual raw_ostream &reverseColor(); |
319 | |
320 | /// This function determines if this stream is connected to a "tty" or |
321 | /// "console" window. That is, the output would be displayed to the user |
322 | /// rather than being put on a pipe or stored in a file. |
323 | virtual bool is_displayed() const { return false; } |
324 | |
325 | /// This function determines if this stream is displayed and supports colors. |
326 | /// The result is unaffected by calls to enable_color(). |
327 | virtual bool has_colors() const { return is_displayed(); } |
328 | |
329 | // Enable or disable colors. Once enable_colors(false) is called, |
330 | // changeColor() has no effect until enable_colors(true) is called. |
331 | virtual void enable_colors(bool enable) { ColorEnabled = enable; } |
332 | |
333 | /// Tie this stream to the specified stream. Replaces any existing tied-to |
334 | /// stream. Specifying a nullptr unties the stream. |
335 | void tie(raw_ostream *TieTo) { TiedStream = TieTo; } |
336 | |
337 | //===--------------------------------------------------------------------===// |
338 | // Subclass Interface |
339 | //===--------------------------------------------------------------------===// |
340 | |
341 | private: |
342 | /// The is the piece of the class that is implemented by subclasses. This |
343 | /// writes the \p Size bytes starting at |
344 | /// \p Ptr to the underlying stream. |
345 | /// |
346 | /// This function is guaranteed to only be called at a point at which it is |
347 | /// safe for the subclass to install a new buffer via SetBuffer. |
348 | /// |
349 | /// \param Ptr The start of the data to be written. For buffered streams this |
350 | /// is guaranteed to be the start of the buffer. |
351 | /// |
352 | /// \param Size The number of bytes to be written. |
353 | /// |
354 | /// \invariant { Size > 0 } |
355 | virtual void write_impl(const char *Ptr, size_t Size) = 0; |
356 | |
357 | /// Return the current position within the stream, not counting the bytes |
358 | /// currently in the buffer. |
359 | virtual uint64_t current_pos() const = 0; |
360 | |
361 | protected: |
362 | /// Use the provided buffer as the raw_ostream buffer. This is intended for |
363 | /// use only by subclasses which can arrange for the output to go directly |
364 | /// into the desired output buffer, instead of being copied on each flush. |
365 | void SetBuffer(char *BufferStart, size_t Size) { |
366 | SetBufferAndMode(BufferStart, Size, BufferKind::ExternalBuffer); |
367 | } |
368 | |
369 | /// Return an efficient buffer size for the underlying output mechanism. |
370 | virtual size_t preferred_buffer_size() const; |
371 | |
372 | /// Return the beginning of the current stream buffer, or 0 if the stream is |
373 | /// unbuffered. |
374 | const char *getBufferStart() const { return OutBufStart; } |
375 | |
376 | //===--------------------------------------------------------------------===// |
377 | // Private Interface |
378 | //===--------------------------------------------------------------------===// |
379 | private: |
380 | /// Install the given buffer and mode. |
381 | void SetBufferAndMode(char *BufferStart, size_t Size, BufferKind Mode); |
382 | |
383 | /// Flush the current buffer, which is known to be non-empty. This outputs the |
384 | /// currently buffered data and resets the buffer to empty. |
385 | void flush_nonempty(); |
386 | |
387 | /// Copy data into the buffer. Size must not be greater than the number of |
388 | /// unused bytes in the buffer. |
389 | void copy_to_buffer(const char *Ptr, size_t Size); |
390 | |
391 | /// Compute whether colors should be used and do the necessary work such as |
392 | /// flushing. The result is affected by calls to enable_color(). |
393 | bool prepare_colors(); |
394 | |
395 | /// Flush the tied-to stream (if present) and then write the required data. |
396 | void flush_tied_then_write(const char *Ptr, size_t Size); |
397 | |
398 | virtual void anchor(); |
399 | }; |
400 | |
401 | /// Call the appropriate insertion operator, given an rvalue reference to a |
402 | /// raw_ostream object and return a stream of the same type as the argument. |
403 | template <typename OStream, typename T> |
404 | std::enable_if_t<!std::is_reference<OStream>::value && |
405 | std::is_base_of<raw_ostream, OStream>::value, |
406 | OStream &&> |
407 | operator<<(OStream &&OS, const T &Value) { |
408 | OS << Value; |
409 | return std::move(OS); |
410 | } |
411 | |
412 | /// An abstract base class for streams implementations that also support a |
413 | /// pwrite operation. This is useful for code that can mostly stream out data, |
414 | /// but needs to patch in a header that needs to know the output size. |
415 | class raw_pwrite_stream : public raw_ostream { |
416 | virtual void pwrite_impl(const char *Ptr, size_t Size, uint64_t Offset) = 0; |
417 | void anchor() override; |
418 | |
419 | public: |
420 | explicit raw_pwrite_stream(bool Unbuffered = false, |
421 | OStreamKind K = OStreamKind::OK_OStream) |
422 | : raw_ostream(Unbuffered, K) {} |
423 | void pwrite(const char *Ptr, size_t Size, uint64_t Offset) { |
424 | #ifndef NDEBUG1 |
425 | uint64_t Pos = tell(); |
426 | // /dev/null always reports a pos of 0, so we cannot perform this check |
427 | // in that case. |
428 | if (Pos) |
429 | assert(Size + Offset <= Pos && "We don't support extending the stream")((void)0); |
430 | #endif |
431 | pwrite_impl(Ptr, Size, Offset); |
432 | } |
433 | }; |
434 | |
435 | //===----------------------------------------------------------------------===// |
436 | // File Output Streams |
437 | //===----------------------------------------------------------------------===// |
438 | |
439 | /// A raw_ostream that writes to a file descriptor. |
440 | /// |
441 | class raw_fd_ostream : public raw_pwrite_stream { |
442 | int FD; |
443 | bool ShouldClose; |
444 | bool SupportsSeeking = false; |
445 | mutable Optional<bool> HasColors; |
446 | |
447 | #ifdef _WIN32 |
448 | /// True if this fd refers to a Windows console device. Mintty and other |
449 | /// terminal emulators are TTYs, but they are not consoles. |
450 | bool IsWindowsConsole = false; |
451 | #endif |
452 | |
453 | std::error_code EC; |
454 | |
455 | uint64_t pos = 0; |
456 | |
457 | /// See raw_ostream::write_impl. |
458 | void write_impl(const char *Ptr, size_t Size) override; |
459 | |
460 | void pwrite_impl(const char *Ptr, size_t Size, uint64_t Offset) override; |
461 | |
462 | /// Return the current position within the stream, not counting the bytes |
463 | /// currently in the buffer. |
464 | uint64_t current_pos() const override { return pos; } |
465 | |
466 | /// Determine an efficient buffer size. |
467 | size_t preferred_buffer_size() const override; |
468 | |
469 | void anchor() override; |
470 | |
471 | protected: |
472 | /// Set the flag indicating that an output error has been encountered. |
473 | void error_detected(std::error_code EC) { this->EC = EC; } |
474 | |
475 | /// Return the file descriptor. |
476 | int get_fd() const { return FD; } |
477 | |
478 | // Update the file position by increasing \p Delta. |
479 | void inc_pos(uint64_t Delta) { pos += Delta; } |
480 | |
481 | public: |
482 | /// Open the specified file for writing. If an error occurs, information |
483 | /// about the error is put into EC, and the stream should be immediately |
484 | /// destroyed; |
485 | /// \p Flags allows optional flags to control how the file will be opened. |
486 | /// |
487 | /// As a special case, if Filename is "-", then the stream will use |
488 | /// STDOUT_FILENO instead of opening a file. This will not close the stdout |
489 | /// descriptor. |
490 | raw_fd_ostream(StringRef Filename, std::error_code &EC); |
491 | raw_fd_ostream(StringRef Filename, std::error_code &EC, |
492 | sys::fs::CreationDisposition Disp); |
493 | raw_fd_ostream(StringRef Filename, std::error_code &EC, |
494 | sys::fs::FileAccess Access); |
495 | raw_fd_ostream(StringRef Filename, std::error_code &EC, |
496 | sys::fs::OpenFlags Flags); |
497 | raw_fd_ostream(StringRef Filename, std::error_code &EC, |
498 | sys::fs::CreationDisposition Disp, sys::fs::FileAccess Access, |
499 | sys::fs::OpenFlags Flags); |
500 | |
501 | /// FD is the file descriptor that this writes to. If ShouldClose is true, |
502 | /// this closes the file when the stream is destroyed. If FD is for stdout or |
503 | /// stderr, it will not be closed. |
504 | raw_fd_ostream(int fd, bool shouldClose, bool unbuffered = false, |
505 | OStreamKind K = OStreamKind::OK_OStream); |
506 | |
507 | ~raw_fd_ostream() override; |
508 | |
509 | /// Manually flush the stream and close the file. Note that this does not call |
510 | /// fsync. |
511 | void close(); |
512 | |
513 | bool supportsSeeking() const { return SupportsSeeking; } |
514 | |
515 | /// Flushes the stream and repositions the underlying file descriptor position |
516 | /// to the offset specified from the beginning of the file. |
517 | uint64_t seek(uint64_t off); |
518 | |
519 | bool is_displayed() const override; |
520 | |
521 | bool has_colors() const override; |
522 | |
523 | std::error_code error() const { return EC; } |
524 | |
525 | /// Return the value of the flag in this raw_fd_ostream indicating whether an |
526 | /// output error has been encountered. |
527 | /// This doesn't implicitly flush any pending output. Also, it doesn't |
528 | /// guarantee to detect all errors unless the stream has been closed. |
529 | bool has_error() const { return bool(EC); } |
530 | |
531 | /// Set the flag read by has_error() to false. If the error flag is set at the |
532 | /// time when this raw_ostream's destructor is called, report_fatal_error is |
533 | /// called to report the error. Use clear_error() after handling the error to |
534 | /// avoid this behavior. |
535 | /// |
536 | /// "Errors should never pass silently. |
537 | /// Unless explicitly silenced." |
538 | /// - from The Zen of Python, by Tim Peters |
539 | /// |
540 | void clear_error() { EC = std::error_code(); } |
541 | |
542 | /// Locks the underlying file. |
543 | /// |
544 | /// @returns RAII object that releases the lock upon leaving the scope, if the |
545 | /// locking was successful. Otherwise returns corresponding |
546 | /// error code. |
547 | /// |
548 | /// The function blocks the current thread until the lock become available or |
549 | /// error occurs. |
550 | /// |
551 | /// Possible use of this function may be as follows: |
552 | /// |
553 | /// @code{.cpp} |
554 | /// if (auto L = stream.lock()) { |
555 | /// // ... do action that require file to be locked. |
556 | /// } else { |
557 | /// handleAllErrors(std::move(L.takeError()), [&](ErrorInfoBase &EIB) { |
558 | /// // ... handle lock error. |
559 | /// }); |
560 | /// } |
561 | /// @endcode |
562 | LLVM_NODISCARD[[clang::warn_unused_result]] Expected<sys::fs::FileLocker> lock(); |
563 | |
564 | /// Tries to lock the underlying file within the specified period. |
565 | /// |
566 | /// @returns RAII object that releases the lock upon leaving the scope, if the |
567 | /// locking was successful. Otherwise returns corresponding |
568 | /// error code. |
569 | /// |
570 | /// It is used as @ref lock. |
571 | LLVM_NODISCARD[[clang::warn_unused_result]] |
572 | Expected<sys::fs::FileLocker> tryLockFor(std::chrono::milliseconds Timeout); |
573 | }; |
574 | |
575 | /// This returns a reference to a raw_fd_ostream for standard output. Use it |
576 | /// like: outs() << "foo" << "bar"; |
577 | raw_fd_ostream &outs(); |
578 | |
579 | /// This returns a reference to a raw_ostream for standard error. |
580 | /// Use it like: errs() << "foo" << "bar"; |
581 | /// By default, the stream is tied to stdout to ensure stdout is flushed before |
582 | /// stderr is written, to ensure the error messages are written in their |
583 | /// expected place. |
584 | raw_fd_ostream &errs(); |
585 | |
586 | /// This returns a reference to a raw_ostream which simply discards output. |
587 | raw_ostream &nulls(); |
588 | |
589 | //===----------------------------------------------------------------------===// |
590 | // File Streams |
591 | //===----------------------------------------------------------------------===// |
592 | |
593 | /// A raw_ostream of a file for reading/writing/seeking. |
594 | /// |
595 | class raw_fd_stream : public raw_fd_ostream { |
596 | public: |
597 | /// Open the specified file for reading/writing/seeking. If an error occurs, |
598 | /// information about the error is put into EC, and the stream should be |
599 | /// immediately destroyed. |
600 | raw_fd_stream(StringRef Filename, std::error_code &EC); |
601 | |
602 | /// This reads the \p Size bytes into a buffer pointed by \p Ptr. |
603 | /// |
604 | /// \param Ptr The start of the buffer to hold data to be read. |
605 | /// |
606 | /// \param Size The number of bytes to be read. |
607 | /// |
608 | /// On success, the number of bytes read is returned, and the file position is |
609 | /// advanced by this number. On error, -1 is returned, use error() to get the |
610 | /// error code. |
611 | ssize_t read(char *Ptr, size_t Size); |
612 | |
613 | /// Check if \p OS is a pointer of type raw_fd_stream*. |
614 | static bool classof(const raw_ostream *OS); |
615 | }; |
616 | |
617 | //===----------------------------------------------------------------------===// |
618 | // Output Stream Adaptors |
619 | //===----------------------------------------------------------------------===// |
620 | |
621 | /// A raw_ostream that writes to an std::string. This is a simple adaptor |
622 | /// class. This class does not encounter output errors. |
623 | class raw_string_ostream : public raw_ostream { |
624 | std::string &OS; |
625 | |
626 | /// See raw_ostream::write_impl. |
627 | void write_impl(const char *Ptr, size_t Size) override; |
628 | |
629 | /// Return the current position within the stream, not counting the bytes |
630 | /// currently in the buffer. |
631 | uint64_t current_pos() const override { return OS.size(); } |
632 | |
633 | public: |
634 | explicit raw_string_ostream(std::string &O) : OS(O) { |
635 | SetUnbuffered(); |
636 | } |
637 | ~raw_string_ostream() override; |
638 | |
639 | /// Flushes the stream contents to the target string and returns the string's |
640 | /// reference. |
641 | std::string& str() { |
642 | flush(); |
643 | return OS; |
644 | } |
645 | |
646 | void reserveExtraSpace(uint64_t ExtraSize) override { |
647 | OS.reserve(tell() + ExtraSize); |
648 | } |
649 | }; |
650 | |
651 | /// A raw_ostream that writes to an SmallVector or SmallString. This is a |
652 | /// simple adaptor class. This class does not encounter output errors. |
653 | /// raw_svector_ostream operates without a buffer, delegating all memory |
654 | /// management to the SmallString. Thus the SmallString is always up-to-date, |
655 | /// may be used directly and there is no need to call flush(). |
656 | class raw_svector_ostream : public raw_pwrite_stream { |
657 | SmallVectorImpl<char> &OS; |
658 | |
659 | /// See raw_ostream::write_impl. |
660 | void write_impl(const char *Ptr, size_t Size) override; |
661 | |
662 | void pwrite_impl(const char *Ptr, size_t Size, uint64_t Offset) override; |
663 | |
664 | /// Return the current position within the stream. |
665 | uint64_t current_pos() const override; |
666 | |
667 | public: |
668 | /// Construct a new raw_svector_ostream. |
669 | /// |
670 | /// \param O The vector to write to; this should generally have at least 128 |
671 | /// bytes free to avoid any extraneous memory overhead. |
672 | explicit raw_svector_ostream(SmallVectorImpl<char> &O) : OS(O) { |
673 | SetUnbuffered(); |
674 | } |
675 | |
676 | ~raw_svector_ostream() override = default; |
677 | |
678 | void flush() = delete; |
679 | |
680 | /// Return a StringRef for the vector contents. |
681 | StringRef str() const { return StringRef(OS.data(), OS.size()); } |
682 | |
683 | void reserveExtraSpace(uint64_t ExtraSize) override { |
684 | OS.reserve(tell() + ExtraSize); |
685 | } |
686 | }; |
687 | |
688 | /// A raw_ostream that discards all output. |
689 | class raw_null_ostream : public raw_pwrite_stream { |
690 | /// See raw_ostream::write_impl. |
691 | void write_impl(const char *Ptr, size_t size) override; |
692 | void pwrite_impl(const char *Ptr, size_t Size, uint64_t Offset) override; |
693 | |
694 | /// Return the current position within the stream, not counting the bytes |
695 | /// currently in the buffer. |
696 | uint64_t current_pos() const override; |
697 | |
698 | public: |
699 | explicit raw_null_ostream() = default; |
700 | ~raw_null_ostream() override; |
701 | }; |
702 | |
703 | class buffer_ostream : public raw_svector_ostream { |
704 | raw_ostream &OS; |
705 | SmallVector<char, 0> Buffer; |
706 | |
707 | virtual void anchor() override; |
708 | |
709 | public: |
710 | buffer_ostream(raw_ostream &OS) : raw_svector_ostream(Buffer), OS(OS) {} |
711 | ~buffer_ostream() override { OS << str(); } |
712 | }; |
713 | |
714 | class buffer_unique_ostream : public raw_svector_ostream { |
715 | std::unique_ptr<raw_ostream> OS; |
716 | SmallVector<char, 0> Buffer; |
717 | |
718 | virtual void anchor() override; |
719 | |
720 | public: |
721 | buffer_unique_ostream(std::unique_ptr<raw_ostream> OS) |
722 | : raw_svector_ostream(Buffer), OS(std::move(OS)) {} |
723 | ~buffer_unique_ostream() override { *OS << str(); } |
724 | }; |
725 | |
726 | class Error; |
727 | |
728 | /// This helper creates an output stream and then passes it to \p Write. |
729 | /// The stream created is based on the specified \p OutputFileName: |
730 | /// llvm::outs for "-", raw_null_ostream for "/dev/null", and raw_fd_ostream |
731 | /// for other names. For raw_fd_ostream instances, the stream writes to |
732 | /// a temporary file. The final output file is atomically replaced with the |
733 | /// temporary file after the \p Write function is finished. |
734 | Error writeToOutput(StringRef OutputFileName, |
735 | std::function<Error(raw_ostream &)> Write); |
736 | |
737 | } // end namespace llvm |
738 | |
739 | #endif // LLVM_SUPPORT_RAW_OSTREAM_H |