From 66b17ba0d263442b8b4e82aaa08acc0df85e1787 Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Thu, 21 Aug 2008 20:58:52 +0000 Subject: [PATCH] Move non-trivial methods out of line to avoid code-size bloat. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55138 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/raw_ostream.h | 92 ++---------------------------- lib/Support/raw_ostream.cpp | 92 ++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 87 deletions(-) diff --git a/include/llvm/Support/raw_ostream.h b/include/llvm/Support/raw_ostream.h index 6ea5930d646..2210de1da1a 100644 --- a/include/llvm/Support/raw_ostream.h +++ b/include/llvm/Support/raw_ostream.h @@ -77,61 +77,13 @@ public: return write(Str.data(), Str.length()); } - raw_ostream &operator<<(unsigned long N) { - // Zero is a special case. - if (N == 0) - return *this << '0'; - - char NumberBuffer[20]; - char *EndPtr = NumberBuffer+sizeof(NumberBuffer); - char *CurPtr = EndPtr; - - while (N) { - *--CurPtr = '0' + char(N % 10); - N /= 10; - } - return write(CurPtr, EndPtr-CurPtr); - } + raw_ostream &operator<<(unsigned long N); - raw_ostream &operator<<(long N) { - if (N < 0) { - if (OutBufCur >= OutBufEnd) - flush_impl(); - *OutBufCur++ = '-'; - - N = -N; - } - - return this->operator<<(static_cast(N)); - } + raw_ostream &operator<<(long N); - raw_ostream &operator<<(unsigned long long N) { - // Zero is a special case. - if (N == 0) - return *this << '0'; - - char NumberBuffer[20]; - char *EndPtr = NumberBuffer+sizeof(NumberBuffer); - char *CurPtr = EndPtr; - - while (N) { - *--CurPtr = '0' + char(N % 10); - N /= 10; - } - return write(CurPtr, EndPtr-CurPtr); - } + raw_ostream &operator<<(unsigned long long N); - raw_ostream &operator<<(long long N) { - if (N < 0) { - if (OutBufCur >= OutBufEnd) - flush_impl(); - *OutBufCur++ = '-'; - - N = -N; - } - - return this->operator<<(static_cast(N)); - } + raw_ostream &operator<<(long long N); raw_ostream &operator<<(unsigned int N) { return this->operator<<(static_cast(N)); @@ -146,41 +98,7 @@ public: } - raw_ostream &write(const char *Ptr, unsigned Size) { - if (OutBufCur+Size > OutBufEnd) - flush_impl(); - - // Handle short strings specially, memcpy isn't very good at very short - // strings. - switch (Size) { - case 4: OutBufCur[3] = Ptr[3]; // FALL THROUGH - case 3: OutBufCur[2] = Ptr[2]; // FALL THROUGH - case 2: OutBufCur[1] = Ptr[1]; // FALL THROUGH - 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-OutBufStart)) { - memcpy(OutBufCur, Ptr, Size); - break; - } - - // If emitting a string larger than our buffer, emit in chunks. In this - // case we know that we just flushed the buffer. - while (Size) { - unsigned NumToEmit = OutBufEnd-OutBufStart; - if (Size < NumToEmit) NumToEmit = Size; - assert(OutBufCur == OutBufStart); - memcpy(OutBufStart, Ptr, NumToEmit); - Ptr += NumToEmit; - OutBufCur = OutBufStart + NumToEmit; - flush_impl(); - } - break; - } - OutBufCur += Size; - return *this; - } + raw_ostream &write(const char *Ptr, unsigned Size); //===--------------------------------------------------------------------===// // Subclass Interface diff --git a/lib/Support/raw_ostream.cpp b/lib/Support/raw_ostream.cpp index 39686cbcc6a..b1209a2da73 100644 --- a/lib/Support/raw_ostream.cpp +++ b/lib/Support/raw_ostream.cpp @@ -33,6 +33,98 @@ using namespace llvm; // An out of line virtual method to provide a home for the class vtable. void raw_ostream::handle() {} +raw_ostream &raw_ostream::operator<<(unsigned long N) { + // Zero is a special case. + if (N == 0) + return *this << '0'; + + char NumberBuffer[20]; + char *EndPtr = NumberBuffer+sizeof(NumberBuffer); + char *CurPtr = EndPtr; + + while (N) { + *--CurPtr = '0' + char(N % 10); + N /= 10; + } + return write(CurPtr, EndPtr-CurPtr); +} + +raw_ostream &raw_ostream::operator<<(long N) { + if (N < 0) { + if (OutBufCur >= OutBufEnd) + flush_impl(); + *OutBufCur++ = '-'; + + N = -N; + } + + return this->operator<<(static_cast(N)); +} + +raw_ostream &raw_ostream::operator<<(unsigned long long N) { + // Zero is a special case. + if (N == 0) + return *this << '0'; + + char NumberBuffer[20]; + char *EndPtr = NumberBuffer+sizeof(NumberBuffer); + char *CurPtr = EndPtr; + + while (N) { + *--CurPtr = '0' + char(N % 10); + N /= 10; + } + return write(CurPtr, EndPtr-CurPtr); +} + +raw_ostream &raw_ostream::operator<<(long long N) { + if (N < 0) { + if (OutBufCur >= OutBufEnd) + flush_impl(); + *OutBufCur++ = '-'; + + N = -N; + } + + return this->operator<<(static_cast(N)); +} + +raw_ostream &raw_ostream::write(const char *Ptr, unsigned Size) { + if (OutBufCur+Size > OutBufEnd) + flush_impl(); + + // Handle short strings specially, memcpy isn't very good at very short + // strings. + switch (Size) { + case 4: OutBufCur[3] = Ptr[3]; // FALL THROUGH + case 3: OutBufCur[2] = Ptr[2]; // FALL THROUGH + case 2: OutBufCur[1] = Ptr[1]; // FALL THROUGH + 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-OutBufStart)) { + memcpy(OutBufCur, Ptr, Size); + break; + } + + // If emitting a string larger than our buffer, emit in chunks. In this + // case we know that we just flushed the buffer. + while (Size) { + unsigned NumToEmit = OutBufEnd-OutBufStart; + if (Size < NumToEmit) NumToEmit = Size; + assert(OutBufCur == OutBufStart); + memcpy(OutBufStart, Ptr, NumToEmit); + Ptr += NumToEmit; + OutBufCur = OutBufStart + NumToEmit; + flush_impl(); + } + break; + } + OutBufCur += Size; + return *this; +} + //===----------------------------------------------------------------------===// // raw_fd_ostream //===----------------------------------------------------------------------===//