Index: include/llvm/Support/circular_raw_ostream.h =================================================================== --- include/llvm/Support/circular_raw_ostream.h +++ include/llvm/Support/circular_raw_ostream.h @@ -108,7 +108,7 @@ /// circular_raw_ostream(raw_ostream &Stream, const char *Header, size_t BuffSize = 0, bool Owns = REFERENCE_ONLY) - : raw_ostream(/*unbuffered*/ true), TheStream(nullptr), + : raw_ostream(BufferKind::Unbuffered), TheStream(nullptr), OwnsStream(Owns), BufferSize(BuffSize), BufferArray(nullptr), Filled(false), Banner(Header) { if (BufferSize != 0) Index: include/llvm/Support/raw_ostream.h =================================================================== --- include/llvm/Support/raw_ostream.h +++ include/llvm/Support/raw_ostream.h @@ -60,11 +60,12 @@ /// this buffer. char *OutBufStart, *OutBufEnd, *OutBufCur; - enum BufferKind { - Unbuffered = 0, - InternalBuffer, - ExternalBuffer - } BufferMode; +public: + /// Specify the current state of the stream. + enum class BufferKind { Unbuffered, InternalBuffer, ExternalBuffer }; + +private: + BufferKind BufferMode; public: // color order matches ANSI escape sequence, don't change @@ -80,8 +81,8 @@ SAVEDCOLOR }; - explicit raw_ostream(bool unbuffered = false) - : BufferMode(unbuffered ? Unbuffered : InternalBuffer) { + explicit raw_ostream(BufferKind BufferMode = BufferKind::InternalBuffer) + : BufferMode(BufferMode) { // Start out ready to flush. OutBufStart = OutBufEnd = OutBufCur = nullptr; } @@ -102,13 +103,13 @@ /// Set the stream to be buffered, using the specified buffer size. void SetBufferSize(size_t Size) { flush(); - SetBufferAndMode(new char[Size], Size, InternalBuffer); + SetBufferAndMode(new char[Size], Size, BufferKind::InternalBuffer); } size_t GetBufferSize() const { // If we're supposed to be buffered but haven't actually gotten around // to allocating the buffer yet, return the value that would be used. - if (BufferMode != Unbuffered && OutBufStart == nullptr) + if (BufferMode != BufferKind::Unbuffered && OutBufStart == nullptr) return preferred_buffer_size(); // Otherwise just return the size of the allocated buffer. @@ -120,7 +121,7 @@ /// when the stream is being set to unbuffered. void SetUnbuffered() { flush(); - SetBufferAndMode(nullptr, 0, Unbuffered); + SetBufferAndMode(nullptr, 0, BufferKind::Unbuffered); } size_t GetNumBytesInBuffer() const { @@ -287,7 +288,7 @@ /// use only by subclasses which can arrange for the output to go directly /// into the desired output buffer, instead of being copied on each flush. void SetBuffer(char *BufferStart, size_t Size) { - SetBufferAndMode(BufferStart, Size, ExternalBuffer); + SetBufferAndMode(BufferStart, Size, BufferKind::ExternalBuffer); } /// Return an efficient buffer size for the underlying output mechanism. @@ -320,7 +321,7 @@ virtual void pwrite_impl(const char *Ptr, size_t Size, uint64_t Offset) = 0; public: - explicit raw_pwrite_stream(bool Unbuffered = false) + explicit raw_pwrite_stream(BufferKind Unbuffered = BufferKind::InternalBuffer) : raw_ostream(Unbuffered) {} void pwrite(const char *Ptr, size_t Size, uint64_t Offset) { #ifndef NDBEBUG @@ -387,7 +388,8 @@ /// FD is the file descriptor that this writes to. If ShouldClose is true, /// this closes the file when the stream is destroyed. - raw_fd_ostream(int fd, bool shouldClose, bool unbuffered=false); + raw_fd_ostream(int fd, bool shouldClose, + BufferKind Unbuffered = BufferKind::InternalBuffer); ~raw_fd_ostream() override; @@ -530,7 +532,7 @@ uint64_t current_pos() const override; public: - explicit raw_null_ostream() {} + explicit raw_null_ostream() : raw_pwrite_stream(BufferKind::Unbuffered) {} ~raw_null_ostream() override; }; Index: lib/Bitcode/Writer/BitWriter.cpp =================================================================== --- lib/Bitcode/Writer/BitWriter.cpp +++ lib/Bitcode/Writer/BitWriter.cpp @@ -30,7 +30,10 @@ int LLVMWriteBitcodeToFD(LLVMModuleRef M, int FD, int ShouldClose, int Unbuffered) { - raw_fd_ostream OS(FD, ShouldClose, Unbuffered); + raw_ostream::BufferKind Mode = Unbuffered + ? raw_ostream::BufferKind::Unbuffered + : raw_ostream::BufferKind::InternalBuffer; + raw_fd_ostream OS(FD, ShouldClose, Mode); WriteBitcodeToFile(unwrap(M), OS); return 0; Index: lib/Support/raw_ostream.cpp =================================================================== --- lib/Support/raw_ostream.cpp +++ lib/Support/raw_ostream.cpp @@ -65,7 +65,7 @@ assert(OutBufCur == OutBufStart && "raw_ostream destructor called with non-empty buffer!"); - if (BufferMode == InternalBuffer) + if (BufferMode == BufferKind::InternalBuffer) delete [] OutBufStart; } @@ -88,14 +88,14 @@ void raw_ostream::SetBufferAndMode(char *BufferStart, size_t Size, BufferKind Mode) { - assert(((Mode == Unbuffered && !BufferStart && Size == 0) || - (Mode != Unbuffered && BufferStart && Size != 0)) && + assert(((Mode == BufferKind::Unbuffered && !BufferStart && Size == 0) || + (Mode != BufferKind::Unbuffered && BufferStart && Size != 0)) && "stream must be unbuffered or have at least one byte"); // Make sure the current buffer is free of content (we can't flush here; the // child buffer management logic will be in write_impl). assert(GetNumBytesInBuffer() == 0 && "Current buffer is non-empty!"); - if (BufferMode == InternalBuffer) + if (BufferMode == BufferKind::InternalBuffer) delete [] OutBufStart; OutBufStart = BufferStart; OutBufEnd = OutBufStart+Size; @@ -277,7 +277,7 @@ // Group exceptional cases into a single branch. if (LLVM_UNLIKELY(OutBufCur >= OutBufEnd)) { if (LLVM_UNLIKELY(!OutBufStart)) { - if (BufferMode == Unbuffered) { + if (BufferMode == BufferKind::Unbuffered) { write_impl(reinterpret_cast(&C), 1); return *this; } @@ -297,7 +297,7 @@ // Group exceptional cases into a single branch. if (LLVM_UNLIKELY(size_t(OutBufEnd - OutBufCur) < Size)) { if (LLVM_UNLIKELY(!OutBufStart)) { - if (BufferMode == Unbuffered) { + if (BufferMode == BufferKind::Unbuffered) { write_impl(Ptr, Size); return *this; } @@ -515,9 +515,9 @@ /// FD is the file descriptor that this writes to. If ShouldClose is true, this /// closes the file when the stream is destroyed. -raw_fd_ostream::raw_fd_ostream(int fd, bool shouldClose, bool unbuffered) - : raw_pwrite_stream(unbuffered), FD(fd), ShouldClose(shouldClose), - Error(false), UseAtomicWrites(false) { +raw_fd_ostream::raw_fd_ostream(int fd, bool shouldClose, BufferKind Mode) + : raw_pwrite_stream(Mode), FD(fd), ShouldClose(shouldClose), Error(false), + UseAtomicWrites(false) { if (FD < 0 ) { ShouldClose = false; return; @@ -728,7 +728,8 @@ /// Use it like: errs() << "foo" << "bar"; raw_ostream &llvm::errs() { // Set standard error to be unbuffered by default. - static raw_fd_ostream S(STDERR_FILENO, false, true); + static raw_fd_ostream S(STDERR_FILENO, false, + raw_ostream::BufferKind::Unbuffered); return S; } Index: unittests/Support/MemoryBufferTest.cpp =================================================================== --- unittests/Support/MemoryBufferTest.cpp +++ unittests/Support/MemoryBufferTest.cpp @@ -71,7 +71,7 @@ SmallString<64> TestPath; sys::fs::createTemporaryFile("MemoryBufferTest_NullTerminator4K", "temp", TestFD, TestPath); - raw_fd_ostream OF(TestFD, true, /*unbuffered=*/true); + raw_fd_ostream OF(TestFD, true, raw_ostream::BufferKind::Unbuffered); for (unsigned i = 0; i < 4096 / 16; ++i) { OF << "0123456789abcdef"; } @@ -136,7 +136,9 @@ // OF is responsible for closing the file; If the file is not // reopened, it will be unbuffered so that the results are // immediately visible through the fd. - raw_fd_ostream OF(TestFD, true, !Reopen); + raw_fd_ostream OF(TestFD, true, Reopen + ? raw_ostream::BufferKind::InternalBuffer + : raw_ostream::BufferKind::Unbuffered); for (int i = 0; i < 60000; ++i) { OF << "0123456789"; } @@ -175,7 +177,7 @@ int FD; SmallString<64> TestPath; sys::fs::createTemporaryFile("MemoryBufferTest_Slice", "temp", FD, TestPath); - raw_fd_ostream OF(FD, true, /*unbuffered=*/true); + raw_fd_ostream OF(FD, true, raw_ostream::BufferKind::Unbuffered); for (unsigned i = 0; i < 0x2000 / 8; ++i) { OF << "12345678"; } Index: unittests/Support/SpecialCaseListTest.cpp =================================================================== --- unittests/Support/SpecialCaseListTest.cpp +++ unittests/Support/SpecialCaseListTest.cpp @@ -36,7 +36,7 @@ int FD; SmallString<64> Path; sys::fs::createTemporaryFile("SpecialCaseListTest", "temp", FD, Path); - raw_fd_ostream OF(FD, true, true); + raw_fd_ostream OF(FD, true, raw_ostream::BufferKind::Unbuffered); OF << Contents; OF.close(); return Path.str();