From b451a0cdec5a24965d122bb749671db9084b92ee Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Mon, 16 Mar 2009 22:08:44 +0000 Subject: Make raw_ostream::operator<<(const void *) fast; it doesn't matter but 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 | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'lib/Support') diff --git a/lib/Support/raw_ostream.cpp b/lib/Support/raw_ostream.cpp index 43f4683..3c24242 100644 --- a/lib/Support/raw_ostream.cpp +++ b/lib/Support/raw_ostream.cpp @@ -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) { -- cgit v1.1