[llvm-commits] [llvm] r78907 - in /llvm/trunk: include/llvm/Support/raw_ostream.h lib/Support/raw_ostream.cpp
Dan Gohman
gohman at apple.com
Thu Aug 13 08:44:52 PDT 2009
Author: djg
Date: Thu Aug 13 10:44:52 2009
New Revision: 78907
URL: http://llvm.org/viewvc/llvm-project?rev=78907&view=rev
Log:
Fix the buffer handling logic so that write_impl is always called with
a full buffer, rather than often being called with a
slightly-less-than-full buffer.
Modified:
llvm/trunk/include/llvm/Support/raw_ostream.h
llvm/trunk/lib/Support/raw_ostream.cpp
Modified: llvm/trunk/include/llvm/Support/raw_ostream.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/raw_ostream.h?rev=78907&r1=78906&r2=78907&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/raw_ostream.h (original)
+++ llvm/trunk/include/llvm/Support/raw_ostream.h Thu Aug 13 10:44:52 2009
@@ -261,6 +261,10 @@
/// non-empty. This outputs the currently buffered data and resets
/// the buffer to empty.
void flush_nonempty();
+
+ /// copy_to_buffer - Copy data into the buffer. Size must not be
+ /// greater than the number of unused bytes in the buffer.
+ void copy_to_buffer(const char *Ptr, size_t Size);
};
//===----------------------------------------------------------------------===//
Modified: llvm/trunk/lib/Support/raw_ostream.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/raw_ostream.cpp?rev=78907&r1=78906&r2=78907&view=diff
==============================================================================
--- llvm/trunk/lib/Support/raw_ostream.cpp (original)
+++ llvm/trunk/lib/Support/raw_ostream.cpp Thu Aug 13 10:44:52 2009
@@ -164,17 +164,32 @@
raw_ostream &raw_ostream::write(const char *Ptr, size_t Size) {
// Group exceptional cases into a single branch.
if (BUILTIN_EXPECT(OutBufCur+Size > OutBufEnd, false)) {
- if (Unbuffered) {
- write_impl(Ptr, Size);
- return *this;
- }
-
- if (!OutBufStart)
+ if (BUILTIN_EXPECT(!OutBufStart, false)) {
+ if (Unbuffered) {
+ write_impl(Ptr, Size);
+ return *this;
+ }
+ // Set up a buffer and start over.
SetBufferSize();
- else
+ return write(Ptr, Size);
+ }
+ // Write out the data in buffer-sized blocks until the remainder
+ // fits within the buffer.
+ do {
+ size_t NumBytes = OutBufEnd - OutBufCur;
+ copy_to_buffer(Ptr, NumBytes);
flush_nonempty();
+ Ptr += NumBytes;
+ Size -= NumBytes;
+ } while (OutBufCur+Size > OutBufEnd);
}
-
+
+ copy_to_buffer(Ptr, Size);
+
+ return *this;
+}
+
+void raw_ostream::copy_to_buffer(const char *Ptr, size_t Size) {
// Handle short strings specially, memcpy isn't very good at very short
// strings.
switch (Size) {
@@ -184,21 +199,11 @@
case 1: OutBufCur[0] = Ptr[0]; // FALL THROUGH
case 0: break;
default:
- // Normally the string to emit is shorter than the buffer.
- if (Size <= unsigned(OutBufEnd-OutBufCur)) {
- memcpy(OutBufCur, Ptr, Size);
- break;
- }
-
- // Otherwise we are emitting a string larger than our buffer. We
- // know we already flushed, so just write it out directly.
- write_impl(Ptr, Size);
- Size = 0;
+ memcpy(OutBufCur, Ptr, Size);
break;
}
- OutBufCur += Size;
- return *this;
+ OutBufCur += Size;
}
// Formatted output.
More information about the llvm-commits
mailing list