Move non-trivial methods out of line to avoid code-size bloat.
authorOwen Anderson <resistor@mac.com>
Thu, 21 Aug 2008 20:58:52 +0000 (20:58 +0000)
committerOwen Anderson <resistor@mac.com>
Thu, 21 Aug 2008 20:58:52 +0000 (20:58 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55138 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/raw_ostream.h
lib/Support/raw_ostream.cpp

index 6ea5930d646b0f9edc528806e9018fb68e93eefc..2210de1da1a44c52bfe636581a6a407709f89ae5 100644 (file)
@@ -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<unsigned long>(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<unsigned long long>(N));
-  }
+  raw_ostream &operator<<(long long N);
   
   raw_ostream &operator<<(unsigned int N) {
     return this->operator<<(static_cast<unsigned long>(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
index 39686cbcc6a63ce29e5687f321143f27c618c46f..b1209a2da7362082fbe5b64148b211d310ca2d46 100644 (file)
@@ -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<unsigned long>(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<unsigned long long>(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
 //===----------------------------------------------------------------------===//