diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-03-16 22:08:44 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-03-16 22:08:44 +0000 |
commit | b451a0cdec5a24965d122bb749671db9084b92ee (patch) | |
tree | c6d10ac2d0041542c910a4458a981620ee0b273c /lib/Support/raw_ostream.cpp | |
parent | de75d7ffcd5ed315240cfe0c52a821cf66411eda (diff) |
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
Diffstat (limited to 'lib/Support/raw_ostream.cpp')
-rw-r--r-- | lib/Support/raw_ostream.cpp | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/lib/Support/raw_ostream.cpp b/lib/Support/raw_ostream.cpp index 43f46837d3..3c242424be 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) { |