15#include "llvm/Config/config.h"
36#if defined(HAVE_UNISTD_H)
40#if defined(__CYGWIN__)
47# define STDIN_FILENO 0
50# define STDOUT_FILENO 1
53# define STDERR_FILENO 2
68 assert(OutBufCur == OutBufStart &&
69 "raw_ostream destructor called with non-empty buffer!");
71 if (BufferMode == BufferKind::InternalBuffer)
72 delete [] OutBufStart;
96void raw_ostream::SetBufferAndMode(
char *BufferStart,
size_t Size,
98 assert(((Mode == BufferKind::Unbuffered && !BufferStart &&
Size == 0) ||
99 (Mode != BufferKind::Unbuffered && BufferStart &&
Size != 0)) &&
100 "stream must be unbuffered or have at least one byte");
105 if (BufferMode == BufferKind::InternalBuffer)
106 delete [] OutBufStart;
107 OutBufStart = BufferStart;
108 OutBufEnd = OutBufStart+
Size;
109 OutBufCur = OutBufStart;
112 assert(OutBufStart <= OutBufEnd &&
"Invalid size!");
149 for (
int Idx = 0; Idx < 16; ++Idx) {
151 if (Idx == 3 || Idx == 5 || Idx == 7 || Idx == 9)
159 bool UseHexEscapes) {
160 for (
unsigned char c : Str) {
163 *
this <<
'\\' <<
'\\';
166 *
this <<
'\\' <<
't';
169 *
this <<
'\\' <<
'n';
172 *
this <<
'\\' <<
'"';
182 *
this <<
'\\' <<
'x';
188 *
this <<
char(
'0' + ((c >> 6) & 7));
189 *
this <<
char(
'0' + ((c >> 3) & 7));
190 *
this <<
char(
'0' + ((c >> 0) & 7));
208void raw_ostream::flush_nonempty() {
209 assert(OutBufCur > OutBufStart &&
"Invalid call to flush_nonempty.");
210 size_t Length = OutBufCur - OutBufStart;
211 OutBufCur = OutBufStart;
212 write_impl(OutBufStart,
Length);
219 if (BufferMode == BufferKind::Unbuffered) {
220 write_impl(
reinterpret_cast<char *
>(&
C), 1);
239 if (BufferMode == BufferKind::Unbuffered) {
240 write_impl(Ptr,
Size);
248 size_t NumBytes = OutBufEnd - OutBufCur;
254 assert(NumBytes != 0 &&
"undefined behavior");
255 size_t BytesToWrite =
Size - (
Size % NumBytes);
256 write_impl(Ptr, BytesToWrite);
257 size_t BytesRemaining =
Size - BytesToWrite;
258 if (BytesRemaining >
size_t(OutBufEnd - OutBufCur)) {
260 return write(Ptr + BytesToWrite, BytesRemaining);
262 copy_to_buffer(Ptr + BytesToWrite, BytesRemaining);
268 copy_to_buffer(Ptr, NumBytes);
270 return write(Ptr + NumBytes,
Size - NumBytes);
273 copy_to_buffer(Ptr,
Size);
278void raw_ostream::copy_to_buffer(
const char *Ptr,
size_t Size) {
279 assert(
Size <=
size_t(OutBufEnd - OutBufCur) &&
"Buffer overrun!");
284 case 4: OutBufCur[3] = Ptr[3]; [[fallthrough]];
285 case 3: OutBufCur[2] = Ptr[2]; [[fallthrough]];
286 case 2: OutBufCur[1] = Ptr[1]; [[fallthrough]];
287 case 1: OutBufCur[0] = Ptr[0]; [[fallthrough]];
290 memcpy(OutBufCur, Ptr,
Size);
305 size_t BufferBytesLeft = OutBufEnd - OutBufCur;
306 if (BufferBytesLeft > 3) {
307 int N = Snprint(OutBufCur, BufferBytesLeft);
311 if (
size_t(
N) < BufferBytesLeft) {
316 Size = size_t(
N) + 1;
323 int N = Snprint(V.data(),
Size);
326 if (
size_t(
N) <
Size)
327 return write(V.data(),
N);
328 Size = size_t(
N) + 1;
338 unsigned LeftIndent = 0;
339 unsigned RightIndent = 0;
340 const ssize_t Difference = FS.Width - FS.Str.size();
341 if (Difference > 0) {
342 switch (FS.Justify) {
346 RightIndent = Difference;
349 LeftIndent = Difference;
352 LeftIndent = Difference / 2;
353 RightIndent = Difference - LeftIndent;
366 if (FN.Upper && FN.HexPrefix)
368 else if (FN.Upper && !FN.HexPrefix)
370 else if (!FN.Upper && FN.HexPrefix)
379 if (Buffer.
size() < FN.Width)
387 if (FB.Bytes.
empty())
390 size_t LineIndex = 0;
391 auto Bytes = FB.Bytes;
392 const size_t Size = Bytes.size();
395 if (FB.FirstByteOffset) {
399 size_t Lines =
Size / FB.NumPerLine;
400 uint64_t MaxOffset = *FB.FirstByteOffset + Lines * FB.NumPerLine;
404 OffsetWidth = std::max<uint64_t>(4,
llvm::alignTo(Power, 4) / 4);
408 unsigned NumByteGroups =
409 alignTo(FB.NumPerLine, FB.ByteGroupSize) / FB.ByteGroupSize;
410 unsigned BlockCharWidth = FB.NumPerLine * 2 + NumByteGroups - 1;
412 while (!Bytes.empty()) {
415 if (FB.FirstByteOffset) {
421 auto Line = Bytes.take_front(FB.NumPerLine);
423 size_t CharsPrinted = 0;
425 for (
size_t I = 0;
I < Line.size(); ++
I, CharsPrinted += 2) {
426 if (
I && (
I % FB.ByteGroupSize) == 0) {
436 assert(BlockCharWidth >= CharsPrinted);
437 indent(BlockCharWidth - CharsPrinted + 2);
443 *this << static_cast<char>(Byte);
450 Bytes = Bytes.drop_front(Line.size());
451 LineIndex += Line.size();
452 if (LineIndex <
Size)
460 static const char Chars[] = {
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
461 C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
462 C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
463 C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
464 C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C,
C};
467 if (NumChars < std::size(Chars))
468 return OS.
write(Chars, NumChars);
471 unsigned NumToWrite = std::min(NumChars, (
unsigned)std::size(Chars) - 1);
472 OS.
write(Chars, NumToWrite);
473 NumChars -= NumToWrite;
488bool raw_ostream::prepare_colors() {
505 if (!prepare_colors())
508 const char *colorcode =
513 write(colorcode, strlen(colorcode));
518 if (!prepare_colors())
522 write(colorcode, strlen(colorcode));
527 if (!prepare_colors())
531 write(colorcode, strlen(colorcode));
535void raw_ostream::anchor() {}
548 "Cannot make a raw_ostream from a read-only descriptor!");
553 EC = std::error_code();
621 ::GetFileType((HANDLE)::_get_osfhandle(fd)) == FILE_TYPE_CHAR;
625 off_t loc = ::lseek(FD, 0, SEEK_CUR);
627 std::error_code EC = status(FD,
Status);
631 SupportsSeeking = !EC && IsRegularFile;
633 SupportsSeeking = !EC && loc != (off_t)-1;
635 if (!SupportsSeeking)
686 if (
auto EC = sys::windows::UTF8ToUTF16(
Data, WideText))
691 size_t MaxWriteSize = WideText.
size();
693 MaxWriteSize = 32767;
695 size_t WCharsWritten = 0;
697 size_t WCharsToWrite =
698 std::min(MaxWriteSize, WideText.
size() - WCharsWritten);
699 DWORD ActuallyWritten;
701 ::WriteConsoleW((HANDLE)::_get_osfhandle(FD), &WideText[WCharsWritten],
702 WCharsToWrite, &ActuallyWritten,
711 WCharsWritten += ActuallyWritten;
712 }
while (WCharsWritten != WideText.
size());
717void raw_fd_ostream::write_impl(
const char *Ptr,
size_t Size) {
721 assert(FD >= 0 &&
"File already closed.");
727 if (IsWindowsConsole)
728 if (write_console_impl(FD, StringRef(Ptr,
Size)))
735 size_t MaxWriteSize = INT32_MAX;
737#if defined(__linux__)
740 MaxWriteSize = 1024 * 1024 * 1024;
744 size_t ChunkSize = std::min(
Size, MaxWriteSize);
745 ssize_t ret =
::write(FD, Ptr, ChunkSize);
756 if (errno == EINTR || errno == EAGAIN
758 || errno == EWOULDBLOCK
765 DWORD WinLastError = GetLastError();
766 if (WinLastError == ERROR_BROKEN_PIPE ||
767 (WinLastError == ERROR_NO_DATA && errno == EINVAL)) {
768 llvm::sys::CallOneShotPipeSignalHandler();
795 assert(SupportsSeeking &&
"Stream does not support seeking!");
798 pos = ::_lseeki64(FD, off, SEEK_SET);
800 pos = ::lseek(FD, off, SEEK_SET);
807void raw_fd_ostream::pwrite_impl(
const char *Ptr,
size_t Size,
822 if (IsWindowsConsole)
825#elif defined(__MVS__)
830 assert(FD >= 0 &&
"File not yet open!");
832 if (fstat(FD, &statbuf) != 0)
841 return statbuf.st_blksize;
870void raw_fd_ostream::anchor() {}
881 static std::error_code EC1 = enableAutoConversion(
STDOUT_FILENO);
892 static std::error_code EC = enableAutoConversion(
STDERR_FILENO);
920 EC = std::make_error_code(std::errc::invalid_argument);
944void raw_string_ostream::write_impl(
const char *Ptr,
size_t Size) {
945 OS.append(Ptr,
Size);
952uint64_t raw_svector_ostream::current_pos()
const {
return OS.
size(); }
954void raw_svector_ostream::write_impl(
const char *Ptr,
size_t Size) {
955 OS.append(Ptr, Ptr +
Size);
958void raw_svector_ostream::pwrite_impl(
const char *Ptr,
size_t Size,
980void raw_null_ostream::write_impl(
const char *Ptr,
size_t Size) {
983uint64_t raw_null_ostream::current_pos()
const {
987void raw_null_ostream::pwrite_impl(
const char *Ptr,
size_t Size,
990void raw_pwrite_stream::anchor() {}
992void buffer_ostream::anchor() {}
994void buffer_unique_ostream::anchor() {}
998 if (OutputFileName ==
"-")
1001 if (OutputFileName ==
"/dev/null") {
1015 if (
auto EC = llvm::copyFileTagAttributes(OutputFileName.
str(), Temp->FD)) {
1016 if (EC != std::errc::no_such_file_or_directory)
1022 if (
Error DiscardError = Temp->discard())
1023 return joinErrors(std::move(E), std::move(DiscardError));
1028 return Temp->keep(OutputFileName);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define LLVM_UNLIKELY(EXPR)
static constexpr StringLiteral Filename
Provides a library for accessing information about this process and other processes on the operating ...
std::pair< llvm::MachO::Target, std::string > UUID
bool empty() const
Check if the array is empty.
Lightweight error class with error context and mandatory checking.
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
std::string str() const
Get the contents as an std::string.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
An efficient, type-erasing, non-owning reference to a callable.
A raw_ostream that writes to a file descriptor.
bool is_displayed() const override
This function determines if this stream is connected to a "tty" or "console" window.
bool has_error() const
Return the value of the flag in this raw_fd_ostream indicating whether an output error has been encou...
std::error_code error() const
void close()
Manually flush the stream and close the file.
void inc_pos(uint64_t Delta)
Expected< sys::fs::FileLocker > lock()
Locks the underlying file.
~raw_fd_ostream() override
bool has_colors() const override
This function determines if this stream is displayed and supports colors.
bool isRegularFile() const
uint64_t seek(uint64_t off)
Flushes the stream and repositions the underlying file descriptor position to the offset specified fr...
int get_fd() const
Return the file descriptor.
Expected< sys::fs::FileLocker > tryLockFor(Duration const &Timeout)
Tries to lock the underlying file within the specified period.
raw_fd_ostream(StringRef Filename, std::error_code &EC)
Open the specified file for writing.
void error_detected(std::error_code EC)
Set the flag indicating that an output error has been encountered.
static LLVM_ABI bool classof(const raw_ostream *OS)
Check if OS is a pointer of type raw_fd_stream*.
LLVM_ABI raw_fd_stream(StringRef Filename, std::error_code &EC)
Open the specified file for reading/writing/seeking.
LLVM_ABI ssize_t read(char *Ptr, size_t Size)
This reads the Size bytes into a buffer pointed by Ptr.
A raw_ostream that discards all output.
~raw_null_ostream() override
This class implements an extremely fast bulk output stream that can only output to a stream.
raw_ostream & write_zeros(unsigned NumZeros)
write_zeros - Insert 'NumZeros' nulls.
raw_ostream(bool unbuffered=false, OStreamKind K=OStreamKind::OK_OStream)
uint64_t tell() const
tell - Return the current offset with the file.
void SetBufferSize(size_t Size)
Set the stream to be buffered, using the specified buffer size.
virtual raw_ostream & changeColor(enum Colors Color, bool Bold=false, bool BG=false)
Changes the foreground color of text that will be output from this point forward.
raw_ostream & write_hex(unsigned long long N)
Output N in hexadecimal, without any prefix or padding.
virtual raw_ostream & resetColor()
Resets the colors to terminal defaults.
raw_ostream & write_uuid(const uuid_t UUID)
raw_ostream & operator<<(char C)
raw_ostream & write_escaped(StringRef Str, bool UseHexEscapes=false)
Output Str, turning '\', '\t', ' ', '"', and anything that doesn't satisfy llvm::isPrint into an esca...
virtual raw_ostream & reverseColor()
Reverses the foreground and background colors.
virtual size_t preferred_buffer_size() const
Return an efficient buffer size for the underlying output mechanism.
raw_ostream & write(unsigned char C)
void SetUnbuffered()
Set the stream to be unbuffered.
virtual bool is_displayed() const
This function determines if this stream is connected to a "tty" or "console" window.
raw_ostream & indent(unsigned NumSpaces)
indent - Insert 'NumSpaces' spaces.
static constexpr Colors SAVEDCOLOR
uint8_t[16] uuid_t
Output a formatted UUID with dash separators.
virtual void enable_colors(bool enable)
size_t GetNumBytesInBuffer() const
OStreamKind get_kind() const
void SetBuffered()
Set the stream to be buffered, with an automatically determined buffer size.
raw_pwrite_stream(bool Unbuffered=false, OStreamKind K=OStreamKind::OK_OStream)
A raw_ostream that writes to an SmallVector or SmallString.
static bool classof(const raw_ostream *OS)
static LLVM_ABI std::error_code SafelyCloseFileDescriptor(int FD)
static LLVM_ABI bool ColorNeedsFlush()
Whether changing colors requires the output to be flushed.
static LLVM_ABI const char * ResetColor()
Resets the terminals colors, or returns an escape sequence to do so.
static LLVM_ABI bool FileDescriptorIsDisplayed(int fd)
This function determines if the given file descriptor is connected to a "tty" or "console" window.
static LLVM_ABI const char * OutputColor(char c, bool bold, bool bg)
This function returns the colorcode escape sequences.
static LLVM_ABI const char * OutputBold(bool bg)
Same as OutputColor, but only enables the bold attribute.
static LLVM_ABI bool FileDescriptorHasColors(int fd)
This function determines if the given file descriptor is displayd and supports colors.
static LLVM_ABI const char * OutputReverse()
This function returns the escape sequence to reverse forground and background colors.
RAII class that facilitates file locking.
static LLVM_ABI Expected< TempFile > create(const Twine &Model, unsigned Mode=all_read|all_write, OpenFlags ExtraFlags=OF_None)
This creates a temporary file with createUniqueFile and schedules it for deletion with sys::RemoveFil...
Represents the result of a call to sys::fs::status().
@ C
The default llvm calling convention, compatible with C.
std::error_code openFileForReadWrite(const Twine &Name, int &ResultFD, CreationDisposition Disp, OpenFlags Flags, unsigned Mode=0666)
Opens the file with the given name in a write-only or read-write mode, returning its open file descri...
LLVM_ABI std::error_code lockFile(int FD, LockKind Kind=LockKind::Exclusive)
Lock the file.
std::error_code openFileForWrite(const Twine &Name, int &ResultFD, CreationDisposition Disp=CD_CreateAlways, OpenFlags Flags=OF_None, unsigned Mode=0666)
Opens the file with the given name in a write-only or read-write mode, returning its open file descri...
LLVM_ABI std::error_code tryLockFile(int FD, std::chrono::milliseconds Timeout=std::chrono::milliseconds(0), LockKind Kind=LockKind::Exclusive)
Try to locks the file during the specified time.
ScopedSetting scopedDisable()
LLVM_ABI std::error_code ChangeStdoutMode(fs::OpenFlags Flags)
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI bool RunningWindows8OrGreater()
Determines if the program is running on Windows 8 or newer.
Error createFileError(const Twine &F, Error E)
Concatenate a source file path and/or name with an Error.
unsigned Log2_64_Ceil(uint64_t Value)
Return the ceil log base 2 of the specified value, 64 if the value is zero.
LLVM_ABI raw_fd_ostream & outs()
This returns a reference to a raw_fd_ostream for standard output.
LLVM_ABI void write_integer(raw_ostream &S, unsigned int N, size_t MinDigits, IntegerStyle Style, bool NonNegativePlus=false)
Error joinErrors(Error E1, Error E2)
Concatenate errors.
char hexdigit(unsigned X, bool LowerCase=false)
hexdigit - Return the hexadecimal character for the given number X (which should be less than 16).
LLVM_ABI Error writeToOutput(StringRef OutputFileName, std::function< Error(raw_ostream &)> Write)
This helper creates an output stream and then passes it to Write.
constexpr uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
LLVM_ABI raw_ostream & nulls()
This returns a reference to a raw_ostream which simply discards output.
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
@ Success
The lock was released successfully.
@ Timeout
Reached timeout while waiting for the owner to release the lock.
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
LLVM_ABI void write_hex(raw_ostream &S, uint64_t N, HexPrintStyle Style, std::optional< size_t > Width=std::nullopt)
LLVM_ABI void write_double(raw_ostream &S, double D, FloatStyle Style, std::optional< size_t > Precision=std::nullopt)
bool isPrint(char C)
Checks whether character C is printable.
LLVM_ABI Error errorCodeToError(std::error_code EC)
Helper for converting an std::error_code to a Error.
std::error_code errnoAsErrorCode()
Helper to get errno as an std::error_code.
LLVM_ABI Error write(DWPWriter &Out, ArrayRef< std::string > Inputs, OnCuIndexOverflow OverflowOptValue, Dwarf64StrOffsetsPromotion StrOffsetsOptValue, raw_pwrite_stream *OS=nullptr)
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
static int getFD(StringRef Filename, std::error_code &EC, sys::fs::CreationDisposition Disp, sys::fs::FileAccess Access, sys::fs::OpenFlags Flags)
static raw_ostream & write_padding(raw_ostream &OS, unsigned NumChars)