Make raw_ostream::operator<<(const void *) fast; it doesn't matter but
authorDaniel Dunbar <daniel@zuster.org>
Mon, 16 Mar 2009 22:08:44 +0000 (22:08 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Mon, 16 Mar 2009 22:08:44 +0000 (22:08 +0000)
it is easy.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@67054 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Support/raw_ostream.cpp

index 43f46837d37998140fac351791611c743cdde72b..3c242424beb900a6a5ec8e28e7c20c4f1bd4d9c9 100644 (file)
@@ -96,8 +96,24 @@ raw_ostream &raw_ostream::operator<<(long long N) {
 }
 
 raw_ostream &raw_ostream::operator<<(const void *P) {
-  // FIXME: This could be much faster if it matters.
-  return *this << format("%p", P);
+  uintptr_t N = (uintptr_t) P;
+  *this << '0' << 'x';
+  
+  // Zero is a special case.
+  if (N == 0)
+    return *this << '0';
+
+  char NumberBuffer[20];
+  char *EndPtr = NumberBuffer+sizeof(NumberBuffer);
+  char *CurPtr = EndPtr;
+
+  while (N) {
+    unsigned x = N % 16;
+    *--CurPtr = (x < 10 ? '0' + x : 'a' + x - 10);
+    N /= 16;
+  }
+
+  return write(CurPtr, EndPtr-CurPtr);
 }
 
 raw_ostream &raw_ostream::write(unsigned char C) {
@@ -105,6 +121,7 @@ raw_ostream &raw_ostream::write(unsigned char C) {
     flush_impl();
 
   *OutBufCur++ = C;
+  return *this;
 }
 
 raw_ostream &raw_ostream::write(const char *Ptr, unsigned Size) {